QAxObject类的使用。
直接附上代码。
void Widget::ExeclFileOutput(QString filepath)
{
filepath.replace("/","\\"); //将Unix风格的路径转为Win风格,不然会出现错误
QAxObject excel("Excel.Application");
excel.setProperty("Visible", false);
QAxObject *work_books = excel.querySubObject("WorkBooks");
work_books->dynamicCall("Open (const QString&)", QString(filepath));
QVariant title_value = excel.property("Caption"); //获取execl标题
qDebug() << QString("excel title : ") << title_value;
QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
QAxObject *work_sheets = work_book->querySubObject("Sheets");
int sheet_count = work_sheets->property("Count").toInt();
qDebug() << QString("sheet count : ") << sheet_count;
for (int i = 1; i <= sheet_count; i++)
{
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i); //获取sheet
QString work_sheet_name = work_sheet->property("Name").toString();
QString message = QString("sheet ") + QString::number(i, 10) + QString(" name");
qDebug() << message << work_sheet_name;
}
if (sheet_count > 0)
{
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
QAxObject *used_range = work_sheet->querySubObject("UsedRange");
QAxObject *rows = used_range->querySubObject("Rows");
QAxObject *columns = used_range->querySubObject("Columns");
int row_start = used_range->property("Row").toInt();
int column_start = used_range->property("Column").toInt();
int row_count = rows->property("Count").toInt();
int column_count = columns->property("Count").toInt();
for (int i = row_start; i <= row_count; i++)
{
for (int j = column_start; j <= column_count; j++)
{
QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);
QVariant cell_value = cell->dynamicCall("value");
QString message = QString("row-") + QString::number(i, 10) + QString("-column-") + QString::number(j, 10) + QString(":");
qDebug() << message << cell_value.toString();
}
}
}
work_books->dynamicCall("Close()");
}
/-----------------------------------------------------------------------------------------------------------------------------------------------------------------------/
可能会遇到的问题:
/-----------------------------------------------------------------------------------------------------------------------------------------------------------------------/
1、出现运行错误
QAxBase: Error calling IDispatch member Open: Exception thrown by server
Code : 1004
Source :
Description: ?????null????????????????????????
??????????????????????????????????????????????
Help :
可能性1:
路径需要加上(主要是用于windows):
filepath.replace("/","\\");
可能性2:
如果打开sheet页面失败,会出现这种情况。
QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);
如果i的大小在sheet数量范围之外,会出现。
可能性3:
路径问题:把绝对路径修改为相对路径
2、打开为只读模式,只能读不能写。
原因是上一次打开之后没有关闭。在函数结尾添加如下:
work_books为QAxObject指针。
work_books->dynamicCall("Close()");
当然,打开execl的进程可以在任务管理器中结束掉。