Qt操作excel
首先,我們先來(lái)解釋一些概念,方面我們?nèi)ダ斫釷t操作excel的基本流程。
1. Qt中,QAxObject對(duì)COM對(duì)象進(jìn)行封裝,QAObject派生自QAxBase,QAxBase提供了一組API通過(guò)IUnknown指針直接訪(fǎng)問(wèn)COM對(duì)象。具體結(jié)構(gòu)如下圖。
我們要操作的Excel也是一個(gè)COM對(duì)象,因此,可以采用上述方式實(shí)現(xiàn)對(duì)Excel的操作。
在具體操作之前,我們先了解一下excel的層次結(jié)構(gòu),如圖所示,Application對(duì)象–>Workbook對(duì)象–>Worksheet對(duì)象–>Range對(duì)象。
1個(gè)excel有一個(gè)Application對(duì)象,1個(gè)Application對(duì)象有多個(gè)workbook對(duì)象組成,這些workbook對(duì)象由workbooks對(duì)象統(tǒng)一管理,workbook對(duì)象下包含若干個(gè)worksheet,這些worksheet對(duì)象由worksheets對(duì)象統(tǒng)一管理,worksheet下面的range對(duì)象,對(duì)應(yīng)這worksheet里面的表格單元了。
2.具體的操作流程如下:
QAxWidget excel(“Excel.Application”);
1) 顯示當(dāng)前窗口:
excel.setProperty(“Visible”, true);
2) 更改 Excel 標(biāo)題欄:
excel.setProperty(“Caption”, “Invoke Microsoft Excel”);
3) 添加新工作簿:
QAxObject * workbooks = excel.querySubObject(“WorkBooks”);
workbooks->dynamicCall(“Add”);
4) 打開(kāi)已存在的工作簿:
workbooks->dynamicCall(“Open (const QString&)”, QString(“c:/test.xls”));
5) 獲取活動(dòng)工作簿:
QAxObject * workbook = excel.querySubObject(“ActiveWorkBook”);
6) 獲取所有的工作表:
QAxObject * worksheets = workbook->querySubObject(“WorkSheets”);
7) 獲取工作表數(shù)量:
int intCount = worksheets->property(“Count”).toInt();
8) 獲取第一個(gè)工作表:
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版本中運(yùn)行會(huì)出現(xiàn)下面的提示錯(cuò)誤
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)用過(guò) CoInitialize 了,所以很容易被忽略這個(gè)問(wèn)題。
參考博客:http://blog.csdn.net/tingsking18/article/details/5677353
總結(jié)
- 上一篇: 7 直角三角形
- 下一篇: android ndk neon,And