Qt導出Excel的簡單實現


     QAxObject對COM對象進行了封裝,QAxObject派生自QAxBase,而后者提供了一組API通過IUnknown(不清楚IUnknown的同學可以去看看COM對象模型)指針直接訪問COM對象,我們這里講的excel也是一個COM對象,因此我們可以通過QAxObject來操作它,為了便於理解,我們首先了解一下excel的對象的主要層次結構:

                                                  

 

    上圖是excel對象的層次結構,1個excel就有1個Application對象,1個Application對象由多個Workbook對象組成,這些Workbook對象由Workbooks對象統一管理,Workbook對象下可以包含若干個Worksheet,這些Worksheet對象也有一個WorkSheets對象來統一管理,接下來是Range對象,這個對象就對應Worksheet里的表格單元了,好了大家應該清楚了Excel的對象的主要層次結構了吧,下面我們來看看QAxObject是怎么來導出excel的:

1.新建一個excel

QAxObject *pApplication = NULL;
QAxObject *pWorkBooks = NULL;
QAxObject *pWorkBook = NULL;
QAxObject *pSheets = NULL;
QAxObject *pSheet = NULL;
void newExcel(const QString &fileName)
{
    pApplication = new QAxObject();
    pApplication->setControl("Excel.Application");//連接Excel控件
    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 appendSheet(const QString &sheetName)
{
    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 setCellValue(int row, int column, const QString &value)
{
    QAxObject *pRange = pSheet->querySubObject("Cells(int,int)", row, column);
    range->dynamicCall("Value", value);
}

4.保存Excel

void saveExcel(constQString &fileName)

{
    pWorkBook->dynamicCall("SaveAs(const QString &)",
                           QDir::toNativeSeparators(fileName));
}

5.釋放Excel

void  freeExcel()

{
    if (pApplication != NULL)
    {
        pApplication->dynamicCall("Quit()");
        delete pApplication;
        pApplication = NULL;
    }
}

http://blog.csdn.net/rabinsong/article/details/8571021


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM