上位机通过ADO数据库读取保存EXCEL文件 xlsx
上位机通过ADO数据库读取保存EXCEL文件, 在编程时有两种引擎可以选择用来操作EXCEL表格
Microsoft.Jet.OLEDB.4.0(简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(简称 ACE 引擎)。
Jet 引擎可以访问 Office 97-2003,但不能访问 Office 2007。
ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。
Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 不可以。
下载地址可以到微软管网看看
https://www.microsoft.com/zh-cn/download/details.aspx?id=23734
https://www.microsoft.com/zh-cn/download/details.aspx?id=13255
ADO访问Excel数据驱动连接字符串的写法:
//Excel2003
ConnectionString := 'Provider=Microsoft.Jet.OLEDB.4.0; Data Source='+ Excel_FILENAME +';Extended Properties=Excel 8.0; HDR=Yes; IMEX=1';
//Excel2003 和 Excel2007,前提是需要安装Office 2007的ACE引擎驱动
ConnectionString := 'Provider=Microsoft.Ace.OleDb.12.0; Data Source='+ Excel_FILENAME +';Extended Properties=''Excel 12.0; HDR=Yes'''; //IMEX=1
"IMEX=1;" 通知驱动程序始终将“互混”(数字,日期,字符串等)数据列作为文本读取,同时这个选项有可能影响到excel表格拒绝写操作,也就是说,如果我们要求写入excel的话,这个选项不能被设置
HDR 是No的话,表示ADO将不把Excel文件的第一行作为字段名
例程实现xls文件的读取保存操作,xlsx文件,可以选择另一引擎,测试
这样例程就完成实现了基于ADO数据库的数据源动态创建,数据添加,
数据删改,
数据删除,
数据查询,
excel表格的读取与保存功能;
例程中关键代码为- BOOL CADO::SaveAsXLS(CString sPath,CListCtrl *pList)
- {
- if(NULL == pList)
- return false;
- if(!IsWindow(pList->m_hWnd) )
- return false;
- if(!access(sPath,00))
- DeleteFile(sPath);//文件存在,删除
- CString sTableName = "Sheet1";//表名
- //
- int nFieldNum = pList->GetHeaderCtrl()->GetItemCount();
- int nRowNum = pList->GetItemCount();
- LVCOLUMN hItem;
- char cBuf[MAX_PATH]="";
- ZeroMemory(&hItem,sizeof(LVCOLUMN));
- hItem.mask = LVCF_TEXT;
- hItem.cchTextMax = MAX_PATH;
- hItem.pszText = cBuf;
- CString sHead;
- //创建表头
- _ConnectionPtr pConn;
- try {
- pConn.CreateInstance(__uuidof(Connection));
- _bstr_t vSQL="Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0';Persist Security Info=False;Data Source='"+sPath+"'";
- pConn->PutCursorLocation(adUseClient);
- pConn->Open(vSQL, "", "", adModeUnknown);
- for(int i=0;i<nFieldNum;i++)
- {
- pList->GetColumn(i,&hItem);
- sHead+=cBuf;
- sHead+=" TEXT,";
- }
- sHead=sHead.Left(sHead.GetLength()-1);
- vSQL = "CREATE TABLE "+sTableName+" ("+sHead+")";
- pConn->Execute(vSQL, NULL, adCmdText);
- }
- catch (_com_error e){
- AfxMessageBox(e.ErrorMessage());
- return false;
- }
- //写入内容
- try{
- for(int x=0;x<nRowNum;x++)
- {
- sHead.Empty();
- for(int y=0;y<nFieldNum;y++)
- {
- sHead+="\'";
- sHead+=pList->GetItemText(x,y);
- sHead+="\',";
- }
- sHead=sHead.Left(sHead.GetLength()-1);
- _bstr_t vSQL = "insert into "+sTableName+" values("+sHead+")";
- pConn->Execute(vSQL, NULL, adCmdText);
- }
- }
- catch(_com_error &e){
- TRACE("%s\n", (LPCTSTR)e.Description());
- AfxMessageBox(e.ErrorMessage());
- pConn->Close();
- pConn.Release();
- return false;
- }
- return true;
- }
- BOOL CADO::OpenXLS(CString sPath,CListCtrl *pList)
- {
- if(-1 == access(sPath,00))
- return false;
- if(NULL == pList)
- return false;
- if(!IsWindow(pList->m_hWnd) )
- return false;
-
- _ConnectionPtr pConn;
- pConn.CreateInstance(__uuidof(Connection));
- try
- {
- /* _bstr_t strConnect = "";
- // Excel2007
- strConnect =_T("Provider=Microsoft.ACE.OLEDB.12.0;");
- strConnect +=_T(";Extended Properties='Excel 12.0 Xml;HDR=YES'");
- // Excel2003
- //strConnect =_T("Provider=Microsoft.ACE.OLEDB.4.0;");
- strConnect +=_T("Data Source=");
- strConnect +=path;
- //strConnect +=_T(";Extended Properties='Excel 8.0 Macro'");*/
- _bstr_t vSQL="Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source='"+sPath+"';Extended Properties='Excel 8.0;HDR=YES;IMEX=1'";
- pConn->Open(vSQL, "", "", adModeUnknown);
- }catch(_com_error &e){
- AfxMessageBox(e.ErrorMessage());
- return false;
- }
- _RecordsetPtr pRec;
- pRec.CreateInstance(__uuidof(Recordset));
- try{
- _bstr_t vSQL = "SELECT * FROM [Sheet1$]";
- pRec->Open(vSQL,pConn.GetInterfacePtr(), adOpenStatic, adLockOptimistic, adCmdText);
- }catch(_com_error &e){
- AfxMessageBox(e.ErrorMessage());
- pConn->Close();
- pConn.Release();
- return false;
- }
- long nFieldNum = pRec->Fields->GetCount();
- if(nFieldNum<pList->GetHeaderCtrl()->GetItemCount())
- goto END;
- if(pRec->adoBOF)
- goto END;
- pList->DeleteAllItems();
- pRec->MoveFirst();
- while(!pRec->adoEOF)
- {
- int i= pList->GetItemCount();
- pList->InsertItem(i,"");
- for(long x=0;x<nFieldNum;x++)
- {
- pList->SetItemText(i,x,(_bstr_t)pRec->Fields->GetItem(x)->Value );
- }
- pRec->MoveNext();
- }
- return true;
- END:
- pRec->Close();
- pRec.Release();
- pConn->Close();
- pConn.Release();
- return false;
- }
复制代码- void CMy123View::OnButton5()
- {
- CFileDialog dlg(FALSE,".xls","gkbc8",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Worksheet Files (*.xls)|*.xls|All Files (*.*)|*.*||",NULL);
- if(IDOK==dlg.DoModal())
- {
- CListCtrl*pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
- m_ado.SaveAsXLS(dlg.GetPathName(),pList);
- }
- }
- void CMy123View::OnButton6()
- {
- CFileDialog dlg(TRUE,".xls","gkbc8",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,"Worksheet Files (*.xls)|*.xls|All Files (*.*)|*.*||",NULL);
- if(IDOK==dlg.DoModal())
- {
- CListCtrl*pList = (CListCtrl*)GetDlgItem(IDC_LIST1);
- m_ado.OpenXLS(dlg.GetPathName(),pList);
- }
- }
复制代码
如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!
|