Qt 用com组件快速导入Excel


        网上给出的大多方法是一个个数据加载的,速度很慢,一个稍大的有几千行数据的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)");
}




  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值