Qt 读Excel

根据Qt读二进制文件进行改写

首先就是读取对应的文件,在后续如果需要更改为读取txt的时候,只需要将最后一行取消注释,将倒数第二行注释即可,如果打开的文件可能是Excel也可能是txt,用一个if语句判断读取的文件名是否包含txt即可。

void MainWindow::on_act_open_triggered()
{
    QString curPath=QDir::currentPath();
    QString dlgTitle="打开一个文件";
    QString filter="文本文件(*.txt);;Excel文件(*.xlsx);;Excel文件(*.xls);;所有文件(*.*)";
    QString aFileName=QFileDialog::getOpenFileName(this,dlgTitle,curPath,filter);
    if(aFileName.isEmpty())
        return;
    openExcel(aFileName);
    //openTextByStream(aFileName);
}

读取Excel文件

bool MainWindow::openExcel(const QString &aFileName)
{
    QAxObject *excel = new QAxObject(this);
    //连接Excel控件
    excel->setControl("Excel.Application");
    //不显示窗体
    excel->dynamicCall("SetVisible (bool Visible)","false");
    //不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
    excel->setProperty("DisplayAlerts", false);
    //获取工作簿集合
    QAxObject *workbooks = excel->querySubObject("WorkBooks");
    //获取当前工作簿
    QAxObject *workbook = workbooks->querySubObject("Open(QString&)",aFileName);
    //获取工作表集合
    QAxObject *worksheets = workbook->querySubObject("WorkSheets");
    //获取工作表集合的工作表1,即sheet1
    QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);
    QAxObject * usedrange = worksheet->querySubObject("UsedRange");//有数据的矩形区域

    //获取行数
    QAxObject * rows = usedrange->querySubObject("Rows");
    int nRows = rows->property("Count").toInt();
    if(nRows <= 1){
        qWarning()<<"无数据,跳过该文件";
        return false;
    }
    x1.clear();
    y1.clear();
    QVariant var = usedrange->dynamicCall("Value");
    QList<QVariant> varRows = var.toList();
    for(int i=1;i<nRows;i++){
        QList<QVariant> vars = varRows.at(i).toList();
        x1.push_back(vars.at(0).toDouble());
        y1.push_back(vars.at(0).toDouble());
    }
    timer->stop();
    ShowCurve(cusplot1,x1,y1);
    cnt=0;
    flags=1;
    workbook->dynamicCall("Close()");//关闭工作簿
    excel->dynamicCall("Quit()");//关闭excel
    delete excel;
    excel=NULL;
    qDebug() << "\n导入成功啦!!!";
    return true;
}

在上面需要注意的第一点:由于读取的数据var是QVariant不能直接进行存放到我们需要的QVector<double>数组中,所以需要进行几次转换,第一次的varRows是将var按照行进行展开,每一个是一行的数据,第二个vars是将这一行的数据进行展开,每一个既是我们所需要的的数据。需要注意的是此时的数据依然是QVariant,我们还是需要使用toDouble进行转换,才能得到我们需要的数据。

注意:在我们读入数据之前,这个数组应该是被清空的,只有这样,数据才不会受到前面的影响。如果我们的数据前面是定时输出的,还需要将定时器关掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Qt是一个跨平台的C++应用程序开发框架,它提供了丰富的功能和工具来简化应用程序的开发过程。在Qt中,可以使用Qt的QAxObject类来Excel文件内容。 以下是使用QtExcel文件内容的步骤: 1. 首先,需要在Qt项目中包含Qt的相关头文件和库文件。可以在.pro文件中添加如下代码: ``` QT += axcontainer ``` 2. 创建一个QAxObject对象,并使用其setControl()方法设置为"Excel.Application",表示要操作Excel应用程序。 3. 调用QAxObject的dynamicCall()方法打开Excel文件,可以使用文件路径作为参数。 4. 获取Excel中的工作簿(Workbook)对象,可以使用QAxObject的querySubObject()方法获取。 5. 获取工作簿中的工作表(Worksheet)对象,可以使用QAxObject的querySubObject()方法获取。 6. 使用工作表对象的range()方法获取指定范围的单元格(Range)对象。 7. 使用Range对象的value()方法获取单元格的值。 下面是一个示例代码,演示了如何使用QtExcel文件内容: ```cpp #include <QAxObject> void readExcelFile(const QString& filePath) { QAxObject* excel = new QAxObject("Excel.Application"); excel->dynamicCall("SetVisible(bool)", false); excel->setProperty("DisplayAlerts", false); QAxObject* workbooks = excel->querySubObject("Workbooks"); QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", filePath); QAxObject* worksheets = workbook->querySubObject("Worksheets"); QAxObject* worksheet = worksheets->querySubObject("Item(int)", 1); // 第一个工作表 QAxObject* usedRange = worksheet->querySubObject("UsedRange"); QAxObject* rows = usedRange->querySubObject("Rows"); QAxObject* columns = usedRange->querySubObject("Columns"); int rowCount = rows->property("Count").toInt(); int columnCount = columns->property("Count").toInt(); for (int row = 1; row <= rowCount; ++row) { for (int column = 1; column <= columnCount; ++column) { QAxObject* cell = worksheet->querySubObject("Cells(int,int)", row, column); QVariant value = cell->property("Value"); qDebug() << value.toString(); delete cell; } } delete columns; delete rows; delete usedRange; delete worksheet; delete worksheets; workbook->dynamicCall("Close()"); delete workbook; delete workbooks; excel->dynamicCall("Quit()"); delete excel; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值