querySubObject(“Cells(int,int)“, j,i)->property(“Value“)读不到数据问题

在使用qt读取Excel文件内容的时候,使用下列方式:

worksheet->querySubObject("Cells(int,int)", j,i)->property("Value").toString();

不会报错,但读取不到数据。多次尝试发现应该将property改为dynamicCall

下面是用qt读取excel文件内容的实例。

读取方式为按列读取,以QVector<QVector<QString>>形式存储数据。

void MainWindow::getExcelContent(QVector<QVector<QString>> &result, QStringList filePathes)
{
    QAxObject *excel = NULL;
    QAxObject *workbooks = NULL;
    QAxObject *workbook = NULL;
    foreach (const QString &filePath, filePathes) {
        CoInitializeEx(NULL, COINIT_MULTITHREADED);
        excel = new QAxObject("Excel.Application");
       
        QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);//读取第一个表

        QAxObject *usedRange = worksheet->querySubObject("UsedRange");//有数据的矩形区域
        QAxObject * rows = usedRange->querySubObject("Rows");
        QAxObject * columns = usedRange->querySubObject("Columns");
        int Rows = rows->property("Count").toInt();
        int Cols = columns->property("Count").toInt();
        //按照列方式读取数据
        for(int i=1;i<=Cols; ++i){
            QVector<QString> vecDataRow;
            for(int j=1;j<=Rows;++j){
                QString txt = worksheet->querySubObject("Cells(int,int)", j,i)->dynamicCall("Value").toString(); //获取单元格内容
                vecDataRow.append(txt);

            }
            result.push_back(vecDataRow);
        }

        workbook->dynamicCall("Close()");
        excel->dynamicCall("Quit()");
        if(excel)
        {
            delete excel;
            excel = NULL;
        }
    }
}

下面是打开文件方式,其中有单选格式方式打开文件和多选格式选择打开文件。 

QString filePath = QFileDialog::getOpenFileName(
                this, QStringLiteral("选择Excel文件"),"",
                QStringLiteral("Excel file(*.xls *.xlsx)"));
    if(filePath.isEmpty())return;
filePathes = QFileDialog::getOpenFileNames(
                    this, tr("Open File"),"D:/",
                    tr("Excel files(*.xls *.xlsx);;CSV files (*.csv)"));
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将多个表格数据导出到同一个Excel文件中,可以使用QAxObject库的方法实现。下面是一个示例代码: ```c++ QAxObject* excel = new QAxObject("Excel.Application"); excel->setProperty("Visible", false); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Add"); // 导出第一个表格数据 QAxObject* sheets = workbook->querySubObject("Sheets"); QAxObject* sheet1 = sheets->querySubObject("Item(int)", 1); sheet1->setProperty("Name", "Sheet1"); int row1 = ui->tableEtcInfo->rowCount(); int col1 = ui->tableEtcInfo->columnCount(); for(int i = 0; i < row1; i++) { for(int j = 0; j < col1; j++) { QTableWidgetItem* item = ui->tableEtcInfo->item(i, j); if(item != nullptr) { QString value = item->text(); QAxObject* cell = sheet1->querySubObject("Cells(int, int)", i + 1, j + 1); cell->setProperty("Value", value); delete cell; } } } // 导出第二个表格数据 QAxObject* sheet2 = sheets->querySubObject("Add()"); sheet2->setProperty("Name", "Sheet2"); int row2 = ui->tableOtherInfo->rowCount(); int col2 = ui->tableOtherInfo->columnCount(); for(int i = 0; i < row2; i++) { for(int j = 0; j < col2; j++) { QTableWidgetItem* item = ui->tableOtherInfo->item(i, j); if(item != nullptr) { QString value = item->text(); QAxObject* cell = sheet2->querySubObject("Cells(int, int)", i + 1, j + 1); cell->setProperty("Value", value); delete cell; } } } // 保存并关闭Excel应用 workbook->dynamicCall("SaveAs(const QString&)", "C:/example.xlsx"); workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); delete excel; ``` 在上述代码中,我们首先创建了一个Excel应用,并创建了一个新的工作簿。然后获取所有页签的集合,并在第一个页签中导出了第一个表格的数据,将页签重命名为“Sheet1”。接着使用`Add()`方法创建了一个新的页签,并在其中导出了第二个表格的数据,将页签重命名为“Sheet2”。最后,我们保存工作簿并关闭Excel应用。 需要注意的是,在使用QAxObject库之前,需要先在项目文件中添加以下内容: ``` QT += axcontainer ``` 这会引入ActiveX组件库,使我们能够使用QAxObject类。同时,需要注意在导出数据时,要将单元格的行列坐标加1,因为Excel中的行列从1开始编号。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值