日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Qt操作excel

發(fā)布時間:2023/12/8 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt操作excel 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

首先,我們先來解釋一些概念,方面我們?nèi)ダ斫釷t操作excel的基本流程。
1. Qt中,QAxObject對COM對象進行封裝,QAObject派生自QAxBase,QAxBase提供了一組API通過IUnknown指針直接訪問COM對象。具體結(jié)構(gòu)如下圖。

我們要操作的Excel也是一個COM對象,因此,可以采用上述方式實現(xiàn)對Excel的操作。

在具體操作之前,我們先了解一下excel的層次結(jié)構(gòu),如圖所示,Application對象–>Workbook對象–>Worksheet對象–>Range對象。
1個excel有一個Application對象,1個Application對象有多個workbook對象組成,這些workbook對象由workbooks對象統(tǒng)一管理,workbook對象下包含若干個worksheet,這些worksheet對象由worksheets對象統(tǒng)一管理,worksheet下面的range對象,對應(yīng)這worksheet里面的表格單元了。

2.具體的操作流程如下:

QAxWidget excel(“Excel.Application”);
1) 顯示當前窗口:
excel.setProperty(“Visible”, true);
2) 更改 Excel 標題欄:
excel.setProperty(“Caption”, “Invoke Microsoft Excel”);
3) 添加新工作簿:
QAxObject * workbooks = excel.querySubObject(“WorkBooks”);
workbooks->dynamicCall(“Add”);
4) 打開已存在的工作簿:
workbooks->dynamicCall(“Open (const QString&)”, QString(“c:/test.xls”));
5) 獲取活動工作簿:
QAxObject * workbook = excel.querySubObject(“ActiveWorkBook”);
6) 獲取所有的工作表:
QAxObject * worksheets = workbook->querySubObject(“WorkSheets”);
7) 獲取工作表數(shù)量:
int intCount = worksheets->property(“Count”).toInt();
8) 獲取第一個工作表:
QAxObject * worksheet = workbook->querySubObject(“Worksheets(int)”, 1);
9) 獲取cell的值:
QAxObject * range = worksheet->querySubObject(“Cells(int,int)”, 1, 1 );

示例代碼:

#include <QDir> #include <QDebug> #include <ActiveQt/QAxBase> #include <ActiveQt/QAxObject> int main(int argc, char **argv) {QApplication a(argc, argv);QAxObject excel("Excel.Application");excel.setProperty("Visible", false);QAxObject * workbooks = excel.querySubObject("WorkBooks");workbooks->dynamicCall("Open (const QString&)", QString("c:/test.xls"));QAxObject * workbook = excel.querySubObject("ActiveWorkBook");QAxObject * worksheets = workbook->querySubObject("WorkSheets");int intCount = worksheets->property("Count").toInt();QAxObject * worksheet = workbook->querySubObject("Worksheets(int)", 1);QAxObject * usedrange = worksheet->querySubObject("UsedRange");QAxObject * rows = usedrange->querySubObject("Rows");QAxObject * columns = usedrange->querySubObject("Columns");int intRowStart = usedrange->property("Row").toInt();int intColStart = usedrange->property("Column").toInt();int intCols = columns->property("Count").toInt();int intRows = rows->property("Count").toInt();for (int i = intRowStart; i < intRowStart + intRows; i++){for (int j = intColStart; j <= intColStart + intCols; j++){QAxObject * range = worksheet->querySubObject("Cells(int,int)", i, j );qDebug() << i << j << range->property("Value");}}excel.setProperty("DisplayAlerts", 0);workbook->dynamicCall("SaveAs (const QString&)", QDir::toNativeSeparators("c:/xlsbyqt.xls"));excel.setProperty("DisplayAlerts", 1);workbook->dynamicCall("Close (Boolean)", false);excel.dynamicCall("Quit (void)");return a.exec(); }

在Qt4.8.5版本中運行會出現(xiàn)下面的提示錯誤

CoCreateInstance failure <CoInitialize has not been called.> QAxBase::setControl: requested control Excel.Application could not be instantiated QAxBase::dynamicCallHelper: Object is not initialized, or initialization failed

解決方法:

//添加頭文件 #include<ole2.h>//在函數(shù)中添加代碼 HRESULT r = OleInitialize(0); if(r!=S_OK && r != S_FALSE) {return -1; }

COM/ActiveX 編程必須 CoInitialize !
在Qt下,由于 QApplication 中需要使用系統(tǒng) 粘貼板,已經(jīng)調(diào)用過 CoInitialize 了,所以很容易被忽略這個問題。

參考博客:http://blog.csdn.net/tingsking18/article/details/5677353

總結(jié)

以上是生活随笔為你收集整理的Qt操作excel的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。