Qt EXECL文档数据导出

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的进程可以在任务管理器中结束掉。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值