网上给出的大多方法是一个个数据加载的,速度很慢,一个稍大的有几千行数据的excel打开就要十几秒,用以下一次性加载的方法,能让速度优化到2秒左右。
需要
#include <ActiveQt/QAxWidget>
#include <ActiveQt/QAxObject>
pro文件
CONFIG += qaxcontainer
//动态加载excel内容
void excelHandle::import()
{
QAxObject* excel = new QAxObject("Excel.Application");
excel->setProperty("Visible",false);
QAxObject *workbooks = excel->querySubObject("WorkBooks");
workbooks->dynamicCall("Open (const QString&)",fileName);
QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取活动工作簿
QAxObject *worksheets = workbook->querySubObject("Sheets");
sheetcount = worksheets->property("Count").toInt(); //获取工作表数目
rowNum = new int[sheetcount];
colNum = new int[sheetcount];
table = new QTableWidget*[sheetcount];
worksheetname = new QString[sheetcount];
for(int k=0;k<sheetcount;k++){
table[k] = new QTableWidget;
//获得第一张excel表格
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)",k+1);
QAxObject *range = worksheet->querySubObject("UsedRange");
worksheetname[k] = worksheet->property("Name").toString();
//获得excel的行列数
QAxObject *rows = range->querySubObject("Rows");
rowNum[k] = rows->property("Count").toInt();
QAxObject *columns = range->querySubObject("Columns");
colNum[k] = columns->property("Count").toInt();
//读取excel并显示到表格上
QString txt;
table[k]->setRowCount(rowNum[k]);
table[k]->setColumnCount(colNum[k]);
QVariant cell = range->dynamicCall("Value");
QVariantList row = cell.value<QVariantList>();
for(int i=0;i!=row.size();i++){
QVariantList col = row[i].value<QVariantList>();
for(int j=0;j!=col.size();j++){
txt = col[j].toString();
QTableWidgetItem *item = new QTableWidgetItem(txt);
table[k]->setItem(i,j,item);
//数据映射到结构体中
}
}
//不可编辑
table[k]->setEditTriggers(QAbstractItemView::NoEditTriggers);
tabWidget->addTab(table[k],worksheetname[k]);
}
currentsheet = 0;
//关闭并退出
workbook->dynamicCall("Close(Boolean)",false);
excel->dynamicCall("Quit(void)");
}