Qt-excel文件操作方法


博客地址已更改,文章數量較多不便批量修改,若想訪問源文請到 coologic博客 查閱,網址:www.coologic.cn

如本文記錄地址為 techieliang.com/A/B/C/ 請改為 www.coologic.cn/A/B/C/ 即可查閱

 

版權聲明:若無來源注明, Techie亮博客文章均為原創。 轉載請以鏈接形式標明本文標題和地址:
本文標題:Qt-excel文件操作方法     本文地址: http://techieliang.com/2017/11/464/

1. Qt-QAxObject

QAxObject是Qt提供的包裝COM組件的類,通過COM操作Excel需要使用QAxObject類,使用此類還需要在pro文件增加“QT += axcontainer”

QAxObject的具體說明請見幫助文檔

2. 與excel com連接的方法

  1. #include <QAxObject> //注意包含此頭文件,同時在pro增加QT+= axcontainer
  2. QAxObject *excel = new QAxObject(this);//建立excel操作對象
  3. excel->setControl("Excel.Application");//連接Excel控件
  4. excel->dynamicCall("SetVisible (bool Visible)","false");//設置為不顯示窗體
  5. excel->setProperty("DisplayAlerts", false);//不顯示任何警告信息,如關閉時的是否保存提示
  6. excel->dynamicCall(?"Quit(void)"?);//關閉excel程序,操作完成后記着關閉,由於是隱藏的看不到,不關閉進程會有很多excel.exe
  7. //關閉excel程序之前記着先關閉.xls文件,具體見后續內容:workbook->dynamicCall("Close(Boolean)", false); //關閉文件

3. Excel基本操作

下面只介紹主要讀寫操作的方法,若需要修改單元格格式等操作,請看“Excel VBA參考手冊.chm”或者其他類似資料

手冊分享地址: 鏈接: https://pan.baidu.com/s/1pLvC5nl 密碼: dnik

3.1. excel文件操作

獲取當前工作簿的集合

  1. QAxObject *workbooks = excel->querySubObject("WorkBooks");//獲取工作簿(excel文件)集合

新建一個工作簿

  1. workbooks->dynamicCall("Add");//新建一個工作簿
  2. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//獲取當前工作簿

打開一個已有的工作簿

  1. QString excel_file_path = "XXXX.xlsx";
  2. QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", excel_file_path);

保存工作簿

  1. workbook->dynamicCall("Save()"); //保存文件
  2. workbook->dynamicCall("Close(Boolean)", false); //關閉文件
  3. excel->dynamicCall(?"Quit(void)"?);//關閉excel

另存為工作簿

  1. //用QDir::toNativeSeparators, 將路徑中的"/"轉換為"\",否則無法保存,/只是qt中可以識別
  2. workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(excel_file_path));
  3. workbook->dynamicCall("Close (Boolean)", false); //關閉文件
  4. excel->dynamicCall(?"Quit(void)"?);//關閉excel

3.2. sheet工作表操作

下面的代碼用到的workbook都是上面工作簿操作后得到的,也就是對某一個工作簿(excel文件)進行操作

獲取所有工作表

  1. QAxObject *worksheets = workbook->querySubObject("Sheets");

根據序號獲取某個工作表,序號順序就是excel打開后下方的排序

  1. QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);

獲取表中的行數列數

  1. QAxObject* usedrange = worksheet->querySubObject("UsedRange");//sheet范圍
  2. int intRowStart = usedrange->property("Row").toInt();//起始行數
  3. int intColStart = usedrange->property("Column").toInt(); //起始列數
  4. QAxObject *rows, *columns;
  5. rows = usedrange->querySubObject("Rows");//行
  6. columns = usedrange->querySubObject("Columns");//列
  7. int intRow = rows->property("Count").toInt();//行數
  8. int intCol = columns->property("Count").toInt();//列數

3.3. 內容操作

數據內容操作-獲取單元格-基於坐標

  1. QAxObject* cell = worksheet->querySubObject("Cells(int, int)", i, j);

數據內容操作-獲取單元格-基於行列名稱

  1. QAxObject* cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");

數據內容操作-讀單元格內容

  1. QVariant cell_value = cell->property("Value");

數據內容操作-寫單元格內容

  1. cell->setProperty("Value", "內容");

4. 其他

4.1. 大數據量讀取

讀取所有單元格內容-數據量大請使用此方式,只需要進行一次操作即可讀取所有內容到內容,避免重復每個單元格進行QAxObject操作

  1. QVariant var;
  2. QAxObject *usedRange = sheet->querySubObject("UsedRange");//獲取用戶區域范圍
  3. if(NULL == usedRange || usedRange->isNull()) {
  4. return var;
  5. }
  6. var = usedRange->dynamicCall("Value");//讀取區域內所有值
  7. delete usedRange;

此時結果以QVariant保存,需要自行轉換成QList<QList<QVariant>>

  1. QList<QList<QVariant>> excel_list;
  2. auto rows = var.toList();
  3. for(auto row:rows) {
  4. excel_list.append(row.toList());
  5. }

4.2. 大數據量寫入

大數據以QList<QList<QVariant>>存儲,與讀取類似,此處需要先指定區域范圍

  1. QAxObject *user_range = this->sheet->querySubObject("Range(const QString&)","A1:D100");//范圍

然后寫入數據

  1. range->setProperty("Value", var);//需要將QList<QList<QVarient>>轉換為QVarient

4.3. 范例:一個完整的打開-讀取-關閉的操作

  1. QString excel_file_path = QDir::currentPath()+"/a.xlsx";
  2. excel_file_path = QDir::toNativeSeparators(excel_file_path);
  3. QAxObject *excel = new QAxObject(this);//建立excel操作對象
  4. excel->setControl("Excel.Application");//連接Excel控件
  5. excel->setProperty("Visible", true);//顯示窗體看效果
  6. excel->setProperty("DisplayAlerts", true);//顯示警告看效果
  7. QAxObject *workbooks = excel->querySubObject
  8. ("WorkBooks");//獲取工作簿(excel文件)集合
  9. workbooks->dynamicCall("Open(const QString&)", excel_file_path);
  10. QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
  11. QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
  12. QAxObject *usedRange = worksheet->querySubObject("UsedRange");
  13. QVariant var = usedRange->dynamicCall("Value");//這里是所有的內容
  14. workbook->dynamicCall( "Close(Boolean)", false );
  15. excel->dynamicCall( "Quit(void)" );
  16. delete excel;

注意:
1、此范例為了看到效果吧窗口和警告設置為了顯示,請自行改為false
2、excel所有操作均是通過QAxObject 進行COM組件的操作,包括打開文件也是,所以路徑必須傳遞完整路徑,不能傳遞相對路徑
3、QAxObject自身會維護new出的空間,直接delete第一個QAxObject 即可
4、所有內容保存在var的變量中
5、上述操作均為判斷返回值,若文件不存在后續內容會報錯

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM