1. Qt-QAxObject
QAxObject是Qt提供的包裝COM組件的類,經過COM操做Excel須要使用QAxObject類,使用此類還須要在pro文件增長「QT += axcontainer」html
QAxObject的具體說明請見幫助文檔app
2. 與excel com鏈接的方法
- #include <QAxObject> //注意包含此頭文件,同時在pro增長QT+= axcontainer
- QAxObject *excel = new QAxObject(this);//創建excel操做對象
- excel->setControl("Excel.Application");//鏈接Excel控件
- excel->dynamicCall("SetVisible (bool Visible)","false");//設置爲不顯示窗體
- excel->setProperty("DisplayAlerts", false);//不顯示任何警告信息,如關閉時的是否保存提示
- excel->dynamicCall(?"Quit(void)"?);//關閉excel程序,操做完成後記着關閉,因爲是隱藏的看不到,不關閉進程會有不少excel.exe
- //關閉excel程序以前記着先關閉.xls文件,具體見後續內容:workbook->dynamicCall("Close(Boolean)", false); //關閉文件
3. Excel基本操做
下面只介紹主要讀寫操做的方法,若須要修改單元格格式等操做,請看「Excel VBA參考手冊.chm」或者其餘相似資料大數據
手冊分享地址: 連接: https://pan.baidu.com/s/1pLvC5nl 密碼: dnikui
3.1. excel文件操做
獲取當前工做簿的集合this
- QAxObject *workbooks = excel->querySubObject("WorkBooks");//獲取工做簿(excel文件)集合
新建一個工做簿spa
- workbooks->dynamicCall("Add");//新建一個工做簿
- QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//獲取當前工做簿
打開一個已有的工做簿excel
- QString excel_file_path = "XXXX.xlsx";
- QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", excel_file_path);
保存工做簿htm
- workbook->dynamicCall("Save()"); //保存文件
- workbook->dynamicCall("Close(Boolean)", false); //關閉文件
- excel->dynamicCall(?"Quit(void)"?);//關閉excel
另存爲工做簿對象
- //用QDir::toNativeSeparators, 將路徑中的"/"轉換爲"\",不然沒法保存,/只是qt中能夠識別
- workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excel_file_path));
- workbook->dynamicCall("Close (Boolean)", false); //關閉文件
- excel->dynamicCall(?"Quit(void)"?);//關閉excel
3.2. sheet工做表操做
下面的代碼用到的workbook都是上面工做簿操做後獲得的,也就是對某一個工做簿(excel文件)進行操做排序
獲取全部工做表
- QAxObject *worksheets = workbook->querySubObject("Sheets");
根據序號獲取某個工做表,序號順序就是excel打開後下方的排序
- QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
獲取表中的行數列數
- QAxObject* usedrange = worksheet->querySubObject("UsedRange");//sheet範圍
- int intRowStart = usedrange->property("Row").toInt();//起始行數
- int intColStart = usedrange->property("Column").toInt(); //起始列數
- QAxObject *rows, *columns;
- rows = usedrange->querySubObject("Rows");//行
- columns = usedrange->querySubObject("Columns");//列
- int intRow = rows->property("Count").toInt();//行數
- int intCol = columns->property("Count").toInt();//列數
3.3. 內容操做
數據內容操做-獲取單元格-基於座標
- QAxObject* cell = worksheet->querySubObject("Cells(int, int)", i, j);
數據內容操做-獲取單元格-基於行列名稱
- QAxObject* cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");
數據內容操做-讀單元格內容
- QVariant cell_value = cell->property("Value");
數據內容操做-寫單元格內容
- cell->setProperty("Value", "內容");
4. 其餘
4.1. 大數據量讀取
讀取全部單元格內容-數據量大請使用此方式,只須要進行一次操做便可讀取全部內容到內容,避免重複每一個單元格進行QAxObject操做
- QVariant var;
- QAxObject *usedRange = sheet->querySubObject("UsedRange");//獲取用戶區域範圍
- if(NULL == usedRange || usedRange->isNull()) {
- return var;
- }
- var = usedRange->dynamicCall("Value");//讀取區域內全部值
- delete usedRange;
此時結果以QVariant保存,須要自行轉換成QList<QList<QVariant>>
- QList<QList<QVariant>> excel_list;
- auto rows = var.toList();
- for(auto row:rows) {
- excel_list.append(row.toList());
- }
4.2. 大數據量寫入
大數據以QList<QList<QVariant>>存儲,與讀取相似,此處須要先指定區域範圍
- QAxObject *user_range = this->sheet->querySubObject("Range(const QString&)","A1:D100");//範圍
而後寫入數據
- range->setProperty("Value", var);//須要將QList<QList<QVarient>>轉換爲QVarient
4.3. 範例:一個完整的打開-讀取-關閉的操做
- QString excel_file_path = QDir::currentPath()+"/a.xlsx";
- excel_file_path = QDir::toNativeSeparators(excel_file_path);
- QAxObject *excel = new QAxObject(this);//創建excel操做對象
- excel->setControl("Excel.Application");//鏈接Excel控件
- excel->setProperty("Visible", true);//顯示窗體看效果
- excel->setProperty("DisplayAlerts", true);//顯示警告看效果
- QAxObject *workbooks = excel->querySubObject
- ("WorkBooks");//獲取工做簿(excel文件)集合
- workbooks->dynamicCall("Open(const QString&)", excel_file_path);
- QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
- QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
- QAxObject *usedRange = worksheet->querySubObject("UsedRange");
- QVariant var = usedRange->dynamicCall("Value");//這裏是全部的內容
- workbook->dynamicCall( "Close(Boolean)", false );
- excel->dynamicCall( "Quit(void)" );
- delete excel;
注意: 一、此範例爲了看到效果吧窗口和警告設置爲了顯示,請自行改成false 二、excel全部操做均是經過QAxObject 進行COM組件的操做,包括打開文件也是,因此路徑必須傳遞完整路徑,不能傳遞相對路徑 三、QAxObject自身會維護new出的空間,直接delete第一個QAxObject 便可 四、全部內容保存在var的變量中 五、上述操做均爲判斷返回值,若文件不存在後續內容會報錯