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