轉載來自:https://www.cnblogs.com/ybqjymy/p/13864716.html
學習背景:
適合熟悉些qt開發,但是不是深入了解的開發者學習。具體實現(qt 5.1版本),office2007 Excel做驗證,Win 7(64位),如有講解有誤,歡迎斧正!
一.簡單介紹
QAxObject是Qt提供的包裝COM組件的類,通過COM通過COM操作使用QAxObject類,使用此類,需要在pro文件中添加
QT += axcontainer
二.與excel com連接的方法
三.Excel基本操作
只介紹簡單的讀寫操作,需要修改單元格格式等操作,請"Excel VBA參考手冊.chm"
3.1 excel文件操作
獲取當前工作簿的集合
QAxObject *workbooks = excel->querySubObject("Workbooks"); //! 獲取工作簿(excel文件)集合
新建一個工作簿
workbooks->synamicCall("Add"); //新建一個工作簿 QAxObject *workbook = excel->querySubObject("ActiveWorkBook"); //! 獲取當前工作簿
打開一個已有的工作簿
QString filename = "e:/123.xlsx"; QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filename);
保存工作簿
workbook->dynamicCall("Save()"); //!保存文件 workbook->dynamicCall("Close(Boolean)", false); //! 關閉文件 excel->dynamicCall("Quit()"); //! 關閉excel
另存為工作簿
QDir::toNativeSeparators,將路徑中的"/"轉換為"\",否則無法保存,"/"只是qt中可以識別 workbook->dynamiCall("SaveAs(const QString&)", QDit::toNativeSeparators(filename)); workbook->synamicCall("Close(Boolean)", false); //! 關閉文件 excel->dynamicCall("Quit()"); //! 關閉excel
3.2 Sheet工作表操作
獲取所有工作表
QAxObject *worksheets = workbook->querySubObject("Sheets"):
根據序號獲取某個工作表,序號順序就是excel 打開后下方的排序
QAxObject *worksheet = worksheets->querySubObejct("Item(int)", 1);
獲取表中的行數列數
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 大數據量讀取
讀取所有單元格內容-數據量大,只需要進行一次操作即可讀取所有內容,避免重復對每個單元格進行QAxObect操作
QVariant var; QAxObject * usedRange = sheet->querySubObject("UseRange"); //! 獲取用戶區域范圍 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_rang = this->sheet->querySubObject("Rang(const QString&)", "A1:D100");
寫入數據
rang->setProperty("Value", var);
4.3 簡單的范例
// HRESULT r = OleInitialize(0); // if(r != S_OK && r != S_FALSE) // { //qWaring("Qt:初始化Ole 失敗(error %x)", (unsigned int)r); //} QString filename = "e:/123.xlsx"; //具體路徑 QFile file(filename); bool isExit = file.exists(); if(!isExit) return false; qDebug()<<"isExit"<<isExit; qDebug()<<filename; QAxObject *excel = new QAxObject("Excel.Application"); excel->dynamicCall("SetVisible(bool Visble)", "false"); excel->setProperty("DisplayAlerts", false); QAxObject *workbooks = excel->querySubObject("WorkBooks"); QAxObject *workbook = workbooks->querySubObject("Open(const QString&)", filename); QAxObject *worksheets = workbook->querySubObject("Sheets"); QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); //寫入到指定位置 QAxObject *workrang = worksheet->querySubObject("Cells(int, int)", 5, 1); //不能這么存 workrang->dynamicCall("SetValue(const QString&)", QString("1ssssssfffssssssssssssssssssssssssssssss10987654321")); //讀取出來並打印 QAxObject *workrang1 = worksheet->querySubObject("Cells(int,int)", 3, 5); QVariant var = workrang1->dynamicCall("Value"); qDebug()<<var; qDebug()<<var.toDouble(); //另存保存 //workbook->dynamicCall("SaveAs(const QString&)", // QDir::toNativeSeparators(filename)); workbook->dynamicCall("Save()", true); //關閉文件 workbook->dynamicCall("Close(Boolean)", true); excel->dynamicCall("Quit()"); delete excel; excel = NULL; // OleUninitialize();