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./打開
	void newExcel(const QString &fileName);

       //2.增加1個Worksheet
       void appendSheet(const QString &sheetName,int cnt);

       //3.向Excel單元格中寫入數據
       void setCellValue(int row, int column, const QString &value);

       //4.保存Excel
      void saveExcel(const QString &fileName);

       //5.釋放Excel
       void  freeExcel();



3、.cpp文件


//1.新建一個excel
void MainWindow::newExcel(const QString &fileName)
{        HRESULT r = OleInitialize(0);
         CoInitialize(0);
         if (r != S_OK && r != S_FALSE) {
             qWarning("Qt: Could not initialize OLE (error %x)\n", (unsigned int)r);
         }
         pApplication = new QAxObject("Excel.Application");
              if(pApplication == NULL){
                  qWarning("pApplication\n");return;
              }
    pApplication->dynamicCall("SetVisible(bool)", false);//false不顯示窗體
    pApplication->setProperty("DisplayAlerts", false);//不顯示任何警告信息。
    pWorkBooks = pApplication->querySubObject("Workbooks");
    QFile file(fileName);
    if (file.exists())
    {
        pWorkBook = pWorkBooks->querySubObject("Open(const QString &)", fileName);
    }
    else
    {
         pWorkBooks->dynamicCall("Add");
         pWorkBook = pApplication->querySubObject("ActiveWorkBook");
    }
    pSheets = pWorkBook->querySubObject("Sheets");
    pSheet = pSheets->querySubObject("Item(int)", 1);
}
//2.增加1個Worksheet
void MainWindow::appendSheet(const QString &sheetName,int cnt)
{
    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單元格中寫入數據
void MainWindow::setCellValue(int row, int column, const QString &value)
{
    QAxObject *pRange = pSheet->querySubObject("Cells(int,int)", row, column);
    pRange->dynamicCall("Value", value);
}
//4.保存Excel
void MainWindow::saveExcel(const QString &fileName)
{
    pWorkBook->dynamicCall("SaveAs(const QString &)",
    QDir::toNativeSeparators(fileName));
}
//5.釋放Excel
void  MainWindow::freeExcel()
{
    if (pApplication != NULL)
    {
        pApplication->dynamicCall("Quit()");
        delete pApplication;
        pApplication = NULL;
    }
}


附上測試的button槽函數


void MainWindow::on_pushButton_keting_clicked()
{

OleInitialize(0);

QString fileNametmp = "d:/112.xls"; //文件名可從此處修改
    newExcel(fileNametmp);
   // appendSheet("page1");
    setCellValue(3, 3,"34343");
    setCellValue(3, 6,"55555");
    saveExcel(fileNametmp);
    freeExcel();
    return;
}



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




   最近由於需要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./打開
	void newExcel(const QString &fileName);

       //2.增加1個Worksheet
       void appendSheet(const QString &sheetName,int cnt);

       //3.向Excel單元格中寫入數據
       void setCellValue(int row, int column, const QString &value);

       //4.保存Excel
      void saveExcel(const QString &fileName);

       //5.釋放Excel
       void  freeExcel();



3、.cpp文件


//1.新建一個excel
void MainWindow::newExcel(const QString &fileName)
{        HRESULT r = OleInitialize(0);
         CoInitialize(0);
         if (r != S_OK && r != S_FALSE) {
             qWarning("Qt: Could not initialize OLE (error %x)\n", (unsigned int)r);
         }
         pApplication = new QAxObject("Excel.Application");
              if(pApplication == NULL){
                  qWarning("pApplication\n");return;
              }
    pApplication->dynamicCall("SetVisible(bool)", false);//false不顯示窗體
    pApplication->setProperty("DisplayAlerts", false);//不顯示任何警告信息。
    pWorkBooks = pApplication->querySubObject("Workbooks");
    QFile file(fileName);
    if (file.exists())
    {
        pWorkBook = pWorkBooks->querySubObject("Open(const QString &)", fileName);
    }
    else
    {
         pWorkBooks->dynamicCall("Add");
         pWorkBook = pApplication->querySubObject("ActiveWorkBook");
    }
    pSheets = pWorkBook->querySubObject("Sheets");
    pSheet = pSheets->querySubObject("Item(int)", 1);
}
//2.增加1個Worksheet
void MainWindow::appendSheet(const QString &sheetName,int cnt)
{
    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單元格中寫入數據
void MainWindow::setCellValue(int row, int column, const QString &value)
{
    QAxObject *pRange = pSheet->querySubObject("Cells(int,int)", row, column);
    pRange->dynamicCall("Value", value);
}
//4.保存Excel
void MainWindow::saveExcel(const QString &fileName)
{
    pWorkBook->dynamicCall("SaveAs(const QString &)",
    QDir::toNativeSeparators(fileName));
}
//5.釋放Excel
void  MainWindow::freeExcel()
{
    if (pApplication != NULL)
    {
        pApplication->dynamicCall("Quit()");
        delete pApplication;
        pApplication = NULL;
    }
}


附上測試的button槽函數


void MainWindow::on_pushButton_keting_clicked()
{

OleInitialize(0);

QString fileNametmp = "d:/112.xls"; //文件名可從此處修改
    newExcel(fileNametmp);
   // appendSheet("page1");
    setCellValue(3, 3,"34343");
    setCellValue(3, 6,"55555");
    saveExcel(fileNametmp);
    freeExcel();
    return;
}



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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章