C++ 操作Excel
預期實現結果:
C++可對Excel表精確進行某一行某一列的增加、修改、刪除、查詢數據
預演環境:
Window7+VS2013+office2013(32位)、2010(64位)、2007(64位)2003(64位)+WPS2016(位)
預演方法:
1、 ODBC方式訪問
2、 通過解析Excel表格文件
3、 通過OLE/COM方式訪問
可行性分析:
2003版本office辦公軟件創建Excel表的后綴.xls 而以后的高版本創建表后綴為.xlsx。是用新的基于XML的壓縮文件格式取代了其目前專有的默認文件格式,在傳統的文件名擴展名后面添加了字母x(即.docx取代.doc、.xlsx取代.xls,等等),使其占用空間更小,可以向下兼容xls。
這樣造成以前通過ODBC方式訪問和通過解析Excel表格文件的方法代表無法解析高版本的xlsx文件,因此選擇OLE/COM方式訪問可以一勞永逸的解決所有的版本問題。**
OLE/COM方式訪問步驟:
1. 新建MFC工程
2. 配置工程,添加組件類接口
導入OLE/COM組件的接口的步驟為:項目->類向導->添加類->類型庫中的MFC類,先選擇要導入的組件所在的路徑,即Excel.exe所在的路徑。導入接口中所用到類方法接口如下圖所示:
3. 將各個導入的頭文件“#import “C:\Program Files\Microsoft Office\Office12\EXCEL.EXE” no_namespace中部分注釋掉。在:#include <、afxdisp.h>加入上面7個頭文件文件
4.代碼實現
在對話框Dlg.h定義接口變量
CApplication app; CWorkbook book;CWorkbooks books; CWorksheet sheet; CWorksheets sheets; CRange range; CRange cols; LPDISPATCH lpDisp;對話框中拖拽兩個按鈕,分別命名為導入和導出
實現導入導出的功能
導入:
void CCpp_ExcleDemoDlg::OnBnClickedButton1(){COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); if (!app.CreateDispatch(_T("Excel.Application"))) {this->MessageBox(_T("無法創建Excel應用!")); }books = app.get_Workbooks();//打開Excel,其中pathname為Excel表的路徑名 lpDisp = books.Open(_T("D:\\工作簿1.xlsx"), covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional, covOptional);book.AttachDispatch(lpDisp);sheets = book.get_Worksheets();sheet = sheets.get_Item(COleVariant((short)1));//獲得坐標為(A,1)的單元格 range = sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("A1")));//獲得單元格的內容 COleVariant rValue;rValue = COleVariant(range.get_Value2());//轉換成寬字符 rValue.ChangeType(VT_BSTR);//轉換格式,并輸出 this->MessageBox(CString(rValue.bstrVal));book.put_Saved(TRUE);app.Quit(); }導出:
void CCpp_ExcleDemoDlg::OnBnClickedButton2(){COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);if (!app.CreateDispatch(_T("Excel.Application"))){this->MessageBox(_T("無法創建Excel應用!"));}books = app.get_Workbooks();//打開Excel,其中pathname為Excel表的路徑名 book = books.Add(covOptional);sheets = book.get_Worksheets();sheet = sheets.get_Item(COleVariant((short)1)); //獲得坐標為(A,1)和(B,1)的兩個單元格 range = sheet.get_Range(COleVariant(_T("A1")), COleVariant(_T("B1"))); //設置單元格類容為Hello Excerange.put_Value2(COleVariant(_T("Clear Excel Demo"))); //選擇整列,并設置寬度為自適應 cols = range.get_EntireColumn();cols.AutoFit();//獲得坐標為(C,2)單元格 range = sheet.get_Range(COleVariant(_T("C2")), COleVariant(_T("C2")));//設置公式“=RAND()*100000”range.put_Formula(COleVariant(_T("=RAND()*100000")));//設置數字格式為貨幣型 range.put_NumberFormat(COleVariant(_T("$0.00")));//選擇整列,并設置寬度為自適應 cols = range.get_EntireColumn();cols.AutoFit();//顯示Excel表app.put_Visible(TRUE);app.put_UserControl(TRUE);}Demo代碼功能概述:
Demo實現對某一行某一列數據進行讀取、準確輸入某一行某一列
OLE/COM方式編程注意事項
有錯誤error C2059雙擊error C2059,將VARIANT DialogBox()改成VARIANT _DialogBox()再次編譯,則可以通過
附上Demo的下載地址http://download.csdn.net/detail/it_ds/9762897
總結
以上是生活随笔為你收集整理的C++ 操作Excel的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [jzoj 1273] 袁绍的刁难 {推
- 下一篇: 搜索引擎使用小技巧(通配符)