1. 程式人生 > >Qt QAxObject操作excel檔案過程總結

Qt QAxObject操作excel檔案過程總結

最近由於需要Qt來操作Excel檔案,所以想把QAxObject用起來,此次使用也是機緣巧合,記錄了一下心路歷程。

此前走了很多彎路,希望做同樣事情的人就別糾纏於同樣的錯誤就好。

配製方面:

1、確保Excel軟體在本地伺服器註冊成功,沒註冊成功的可以通過 在執行中"E:\program Files\Microsoft Office\Office12\EXCEL.EXE" /regserver 手動註冊,注意路徑要用自己的excel路徑。

2、確保元件配製正確,執行命令:dcomcnfg,檢視DCOM配置下是否有Microsoft Excel Application,有的話萬事大吉,開始設定(1)常規,身份驗證:無(2)安全、配製許可權自定義,控制權限,完全控制選中,儲存

以上確保QAxObject可以正常被呼叫

程式方面:

1、工程pro檔案新增

CONFIG+=qaxcontainer
2、.h檔案新增
       /1./開啟
voidnewExcel(constQString&fileName);
//2.增加1個Worksheet
voidappendSheet(constQString&sheetName,intcnt);
//3.向Excel單元格中寫入資料
voidsetCellValue(introw,intcolumn,constQString&value);
//4.儲存Excel
voidsaveExcel(const
QString&fileName);
//5.釋放Excel
voidfreeExcel();

3、.cpp檔案

//1.新建一個excel
voidMainWindow::newExcel(constQString&fileName)
{HRESULTr=OleInitialize(0);
CoInitialize(0);
if(r!=S_OK&&r!=S_FALSE){
qWarning("Qt:CouldnotinitializeOLE(error%x)\n",(unsignedint)r);
}
pApplication=newQAxObject("Excel.Application"
);
if(pApplication==NULL){
qWarning("pApplication\n");return;
}
pApplication->dynamicCall("SetVisible(bool)",false);//false不顯示窗體
pApplication->setProperty("DisplayAlerts",false);//不顯示任何警告資訊。
pWorkBooks=pApplication->querySubObject("Workbooks");
QFilefile(fileName);
if(file.exists())
{
pWorkBook=pWorkBooks->querySubObject("Open(constQString&)",fileName);
}
else
{
pWorkBooks->dynamicCall("Add");
pWorkBook=pApplication->querySubObject("ActiveWorkBook");
}
pSheets=pWorkBook->querySubObject("Sheets");
pSheet=pSheets->querySubObject("Item(int)",1);
}
//2.增加1個Worksheet
voidMainWindow::appendSheet(constQString&sheetName,intcnt)
{
QAxObject*pLastSheet=pSheets->querySubObject("Item(int)",cnt);
pSheets->querySubObject("Add(QVariant)",pLastSheet->asVariant());
pSheet=pSheets->querySubObject("Item(int)",cnt);
pLastSheet->dynamicCall("Move(QVariant)",pSheet->asVariant());
pSheet->setProperty("Name",sheetName);
}
//3.向Excel單元格中寫入資料
voidMainWindow::setCellValue(introw,intcolumn,constQString&value)
{
QAxObject*pRange=pSheet->querySubObject("Cells(int,int)",row,column);
pRange->dynamicCall("Value",value);
}
//4.儲存Excel
voidMainWindow::saveExcel(constQString&fileName)
{
pWorkBook->dynamicCall("SaveAs(constQString&)",
QDir::toNativeSeparators(fileName));
}
//5.釋放Excel
voidMainWindow::freeExcel()
{
if(pApplication!=NULL)
{
pApplication->dynamicCall("Quit()");
deletepApplication;
pApplication=NULL;
}
}

附上測試的button槽函式

voidMainWindow::on_pushButton_keting_clicked()
{
OleInitialize(0);
QStringfileNametmp="d:/112.xls";//檔名可從此處修改
newExcel(fileNametmp);
//appendSheet("page1");
setCellValue(3,3,"34343");
setCellValue(3,6,"55555");
saveExcel(fileNametmp);
freeExcel();
return;
}

此次學習、總結也看了很多人的東西,吸取了它人的一些方法,也改正了部分錯誤,希望開啟順利之旅!