一.簡(jiǎn)單介紹
是Qt提供的包裝COM組件的類,通過COM通過COM操作使用類,使用此類qt將圖片保存到指定路徑,需要在pro文件中添加
QT += axcontainer
二.與excel com連接的方法
1 #include
2 QAxObject *excel = new QAxObject("Excel.Application"); //!建立excel操作對(duì)象,并連接Excel控件
3 excel->dynamicCall("SetVisible (bool Visible)", "false"); //! 設(shè)置為不顯示窗體
4 excel->setProperty("DisplayAlerts", false); //! 不顯示任何警告信息, 如關(guān)閉時(shí)的是否保存提示
5 excel->dynamicCall("Quit(void)"); //! 關(guān)閉excel程序,操作完后記著關(guān)閉,由于是隱藏在后臺(tái)進(jìn)程中,不關(guān)閉進(jìn)程會(huì)有很多excel.exe。
6 workbook->dynamicCall("Close(Boolean)", false); //! 關(guān)閉exce程序先關(guān)閉.xls文件
三.Excel基本操作
只介紹簡(jiǎn)單的讀寫操作,需要修改單元格格式等操作,請(qǐng)"Excel VBA參考手冊(cè).chm"
3.1 excel文件操作
獲取當(dāng)前工作簿的集合
QAxObject *workbooks = excel->querySubObject("Workbooks"); //! 獲取工作簿(excel文件)集合
新建一個(gè)工作簿
1 workbooks->synamicCall("Add"); //新建一個(gè)工作簿
2 QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 獲取當(dāng)前工作簿
打開一個(gè)已有的工作簿
1 QString filename = "e:/123.xlsx";
2 QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);
保存工作簿
1 workbook->dynamicCall("Save()"); //!保存文件
2 workbook->dynamicCall("Close(Boolean)", false); //! 關(guān)閉文件
3 excel->dynamicCall("Quit()"); //! 關(guān)閉excel
另存為工作簿
1 QDir::toNativeSeparators,將路徑中的"/"轉(zhuǎn)換為"\",否則無(wú)法保存,"/"只是qt中可以識(shí)別
2 workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename));
3 workbook->synamicCall("Close(Boolean)", false); //! 關(guān)閉文件
4 excel->dynamicCall("Quit()"); //! 關(guān)閉excel
【領(lǐng)QT開發(fā)教程學(xué)習(xí)資料,點(diǎn)擊下方鏈接莬費(fèi)領(lǐng)取↓↓qt將圖片保存到指定路徑,先碼住不迷路~】
點(diǎn)擊→領(lǐng)取「鏈接」
3.2 Sheet工作表操作
獲取所有工作表
QAxObject *worksheets = workbook->querySubObject("Sheets"):
根據(jù)序號(hào)獲取某個(gè)工作表,序號(hào)順序就是excel 打開后下方的排序
QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);
獲取表中的行數(shù)列數(shù)
1 QAxObject* usedrange = worksheet->querySubObject("UsedRange"); //! sheet 范圍
2 int intRowStart = usedrange->property("Row").toInt(); //! 起始行數(shù)
3 int intColStart = usedrange->property("Column").toInt(); //! 起始列數(shù)
4 QAxObject *rows, *columns;
5 rows = usedrange->querySubObject("Rows"): //! 行
6 columns = usedrange->querySubObject("Columns"); //! 列
7 int intRow = rows->property("Count").toInt(); //! 行數(shù)
8 int intCol = columns->property("Count").toInt(); //! 列數(shù)
3.3 內(nèi)容操作
數(shù)據(jù)內(nèi)容操作--獲取單元格--基于坐標(biāo)
QAxObject *cell = worksheet->querySubObject("Cells(int, int)", i, j);
數(shù)據(jù)內(nèi)容操作--獲取單元格--基于行列名稱
QAxObject *cell = worksheet->querySubObject("Range(QVariant, QVariant)", "A1");
數(shù)據(jù)內(nèi)容操作--讀單元格內(nèi)容
QVariant cell_value = cell->property("Value");
數(shù)據(jù)內(nèi)容操作-- 寫單元格內(nèi)容
cell->setProperty("Value", "內(nèi)容");
4.其他(沒有實(shí)踐操作)
4.1 大數(shù)據(jù)量讀取
讀取所有單元格內(nèi)容-數(shù)據(jù)量大,只需要進(jìn)行一次操作即可讀取所有內(nèi)容,避免重復(fù)對(duì)每個(gè)單元格進(jìn)行操作
1 QVariant var;
2 QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 獲取用戶區(qū)域范圍
3 if(NULL == usedRange || usedRange->isNull())
4 {
5 return var;
6 }
7 var = usedRange->dynamicCall("Value"); // 讀取區(qū)域內(nèi)所有值
8 delete usedRange;
此時(shí)結(jié)果以保存,需要自行轉(zhuǎn)化為QList>
1 QList> excel_list;
2 auto rows = var.toList();
3
4 for(auto row:rows)
5 {
6 excel_list.append(row.toList());
7 }
4.2 大數(shù)據(jù)寫入
以QList>存儲(chǔ),需要限定范圍
QAxObject *user_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");
寫入數(shù)據(jù)
rang->setProperty("Value", var);
4.3 簡(jiǎn)單的范例
【領(lǐng)QT開發(fā)教程學(xué)習(xí)資料,點(diǎn)擊下方鏈接莬費(fèi)領(lǐng)取↓↓,先碼住不迷路~】
點(diǎn)擊→領(lǐng)取「鏈接」
1 // HRESULT r = OleInitialize(0);
2 // if(r != S_OK && r != S_FALSE)
3 // {
4 //qWaring("Qt:初始化Ole 失敗(error %x)", (unsigned int)r);
5 //}
6 QString filename = "e:/123.xlsx"; //具體路徑
7 QFile file(filename);
8 bool isExit = file.exists();
9 if(!isExit)
10 return false;
11 qDebug()<<"isExit"<dynamicCall("SetVisible(bool Visble)", "false");
15 excel->setProperty("DisplayAlerts", false);
16 QAxObject *workbooks = excel->querySubObject("WorkBooks");
17 QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename);
18 QAxObject *worksheets = workbook->querySubObject("Sheets");
19 QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);
20
21 //寫入到指定位置
22 QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1);
23 //不能這么存
24 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321"));
25
26
27 //讀取出來(lái)并打印
28 QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5);
29
30 QVariant var = workrang1->dynamicCall("Value");
31 qDebug()<dynamicCall("SaveAs(const QString&)",
36 // QDir::toNativeSeparators(filename));
37
38 workbook->dynamicCall("Save()", true);
39 //關(guān)閉文件
40 workbook->dynamicCall("Close(Boolean)", true);
41 excel->dynamicCall("Quit()");
42 delete excel;
43 excel = NULL;
44 // OleUninitialize();