工控编程吧
标题:
上位机通过ADO数据库读取保存EXCEL文件 xlsx
[打印本页]
作者:
qq263946146
时间:
2017-6-4 15:36
标题:
上位机通过ADO数据库读取保存EXCEL文件 xlsx
(, 下载次数: 9)
上传
点击文件名下载附件
上位机通过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);
}
}
复制代码
(, 下载次数: 2)
上传
点击文件名下载附件
[weixinlianxi]1[/weixinlianxi]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4