| 上位机通过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);
        }        
}
   如果您认可,可联系功能定制! 如果您着急,充值会员可直接联系发您资料!    
 
 
 
 
 |