1. 程式人生 > >VS+Qt讀寫Excel

VS+Qt讀寫Excel

==================================================================================

void TestReadExcel::readExcel()
{
    QAxObject *excel = NULL;
    QAxObject *workbooks = NULL;
    QAxObject *workbook = NULL;

    excel = new QAxObject("Excel.Application");
    if (!excel)
    {
        QMessageBox::critical(this, "錯誤資訊", "EXCEL物件丟失");
        return;
    }
    excel->dynamicCall("SetVisible(bool)", false);
    workbooks = excel->querySubObject("WorkBooks");
    workbook = workbooks->querySubObject("Open(QString, QVariant)", QString(tr("d:\\test.xls")));
    QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", 1);//開啟第一個sheet

 //QAxObject * worksheet = workbook->querySubObject("WorkSheets");//獲取sheets的集合指標
 //int intCount = worksheet->property("Count").toInt();//獲取sheets的數量


    QAxObject * usedrange = worksheet->querySubObject("UsedRange");//獲取該sheet的使用範圍物件
    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();
    /*獲取excel內容*/
    for (int i = intRowStart; i < intRowStart + intRows; i++)  //行
    {
        for (int j = intColStart; j < intColStart + intCols; j++)  //列
        {
            QAxObject * cell = worksheet->querySubObject("Cells(int,int)", i, j );  //獲取單元格
           // qDebug() << i << j << cell->property("Value");         //*****************************出問題!!!!!!
   qDebug() << i << j <<cell->dynamicCall("Value2()").toString(); //正確
        }
    }
 workbook->dynamicCall("Close (Boolean)", false);

 //同樣,設定值,也用dynamimcCall("SetValue(const QVariant&)", QVariant(QString("Help!")))這樣才成功的。。

 //excel->dynamicCall("Quit (void)");
 delete excel;//一定要記得刪除,要不執行緒中會一直開啟excel.exe
}


==================================================================================

都是一些程式碼,我用的是VS2008+Qt,按照一般網上說的直接就找不到標頭檔案

添加了標頭檔案

#include <QAxObject>

但是提示找不到<QAxObject>標頭檔案,自己隨便轉到定義,確實可以轉到qaxbase.h的標頭檔案,QAxBase類裡面聲明瞭QAxObject,於是打開了包含qaxbase.h的檔案,在裡面找到了一個qaxobject.h的檔案,裡面定義了QAxObject類,最終添加了    #include <ActiveQt/qaxobject.h>

#include <ActiveQt/qaxobject.h>

QAxObject *pApplication;
QAxObject *pWorkBooks;
QAxObject *pWorkBook;
QAxObject *pSheets;
QAxObject *pSheet;
QAxWidget *pWord;

pApplication  = NULL;
pWorkBooks= NULL;

pWorkBook= NULL;
pSheets= NULL;
pSheet= NULL;
pWord            = NULL;

pApplication = new QAxObject();
pApplication->setControl("Excel.Application");//連線Excel控制元件
pApplication->dynamicCall("SetVisible(bool)", true);//false不顯示窗體
pApplication->setProperty("DisplayAlerts", false);//不顯示任何警告資訊。
pWorkBooks = pApplication->querySubObject("Workbooks");
QString fileName = "./data.xls";
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);

確實可以用了,但是執行程式碼提示無法解析的外部符號之類的,就是所謂的setControl、dynamicCall這些庫函式

查了一個上午才知道如果是:

QtCreate建立的工程:在pro 檔案中新增一行 CONFIG += qaxcontainer就可以

如果是vs+qt,如果建立工程的時候沒有勾選ActiveQt Container庫,就要在專案屬性--Qt Project Settings--Qt Modules介面中勾選ActiveQt container,新增動態庫連線

CONFIG += qaxcontainer 也就是連結一些操作COM元件的動態庫

遇到的問題:

1.隱藏資料夾ActiveQT的新增:新建一個QT工程,在初始的時候將這個勾上,然後找到資料夾,將標頭檔案等複製到目標處;

2.使用#include <ActiveQt/QAxBase>#include <ActiveQt/QAxObject>

需要在連結器中新增QTcontainer.lib