• 【Qt上位机】打开本地表格文件并获取其中全部数据


    前言
    其实本文所实现的功能并非博主要实现的全部功能,只是全部功能中的一小部分,这里只是为了记录一下实现方法,防止后续忘记,仅供参考。

    一、实现效果

    目前实现的内容为,打开本地表格文件,打开后输出表格总行数和总列数,然后打印出表格全部内容。测试表格如下

    测试表格
    目前的上位机页面如下

    上位机页面

    点击“选择文件”,选择本地的表格文件

    选择文件

    或者直接输入文件路径也可以。然后点击打开文件,在Qt端就可以输出选中表格的总行数和总列数,并且将表格的全部内容打印出来。结果如下

    输出结果

    二、UI设计

    UI只用到了简单的两个控件,这里列一下。

    • QPushButton
      “选择文件”和打开文件使用了本控件。
    • QLineEdit
      文件路径使用了本控件。

    三、程序设计

    3.1 选择本地表格文件

    “选择文件”的槽函数为

    void Widget::on_selectfile_Button_clicked()
    {
        QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);"));
    
        // 将文件路径显示到UI控件
        ui->selectedfilepath_lineEdit->setText(fileName);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    选中文件后会将文件路径显示到控件selectedfilepath_lineEdit

    如果需要增加文件类型,可以参考下面进行修改

    QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("选择文件"),"F:",QStringLiteral("表格(*xls *xlsx *csv);;图片(*jpg *png);"));
    
    • 1

    3.2 获取表格总行列数

        QAxObject *excel = new QAxObject(this);
        excel->setControl("Excel.Application");
        excel->setProperty("Visible", false);    //显示窗体看效果,选择ture将会看到excel表格被打开
        excel->setProperty("DisplayAlerts", true);
        QAxObject *workbooks = excel->querySubObject("WorkBooks");   //获取工作簿(excel文件)集合
        QString str = ui->selectedfilepath_lineEdit->text();
        //打开选定的excel
        workbooks->dynamicCall("Open(const QString&)", str);
        QAxObject *workbook = excel->querySubObject("ActiveWorkBook");
        QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",1);
    
        // 获取行列数
        QAxObject *usedRange = worksheet->querySubObject("UsedRange");   //获取表格中的数据范围
        QAxObject *rows = usedRange->querySubObject("Rows");
        getrow = rows->property("Count").toInt();  //获取行数
        QAxObject *column = usedRange->querySubObject("Columns");
        getcolumn = column->property("Count").toInt();  //获取列数
        qDebug("行数为:%d   列数为:%d\n",getrow,getcolumn);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    值得注意的是,本程序获取的是第一个工作表的总行列数,如需修改,可以修改这个函数里的参数

    QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)",2);
    
    • 1

    3.3 获取并输出表格内容

        QVariant var = usedRange->dynamicCall("Value");   // 将所有的数据读取到QVariant容器中保存
        QList<QList<QVariant>> excel_list;   // 用于将QVariant转换为Qlist的二维数组
        QVariantList varRows=var.toList();
        if(varRows.isEmpty())
        {
            return;
        }
    
        const int row_count = varRows.size();
        QVariantList rowData;
        for(int i=0;i<row_count;++i)
        {
            rowData = varRows[i].toList();
            excel_list.push_back(rowData);
        }
    
        //打印excel数据
        for(int i = 0; i<row_count; i++)
        {
            QList<QVariant> curList = excel_list.at(i);
            int curRowCount = curList.size();
            for(int j = 0; j < curRowCount; j++)
            {
                qDebug() << curList.at(j).toString();
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    2.4 操作单元格内容

    操作表格,归根结底还要落到操作单元格上,这里会给出一个操作方法

    QString ExcelName = worksheet->querySubObject("Cells(int,int)",所在行数,所在列数)->dynamicCall("Value").toString();
    
    • 1

    四、操作实例

    这里的操作实例是根据博主自己需要写的,是为了找出报文ID和报文数据所在的列索引,这里贴出程序,仅供参考。

        // 遍历出报文ID和数据所属列数
        // 默认第一列为时间,不需要遍历
        for (int i = 1;i <= getcolumn;i ++)
        {
            // 遍历第一行全部内容
            ExcelName = worksheet->querySubObject("Cells(int,int)",1,i)->dynamicCall("Value").toString();
    
            // 查找报文ID所在列
            if (ExcelName == "MAKE_CAN_ID(HEX)")
            {
                qDebug("报文ID所在列为:%d",i);
                messageIDColumn = i;
            }
    
            // 查找数据所在列
            if (ExcelName == "DATA(HEX)")
            {
                qDebug("报文ID所在列为:%d",i);
                dataColumn = i;
    
                // 通常数据所在列在报文ID后面,所以遍历到数据所在列后直接跳出for循环
                break;
            }
        }
        qDebug("报文ID所在列为:%d   数据所在列为:%d\n",messageIDColumn,dataColumn);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    好用的 edge 插件有哪些?
    Spring与MongoDB的结合(MongoTemplate)
    VScode+python开发,多个解释器切换问题
    Python函数
    Redis 缓存预热、预热数据选取策略、缓存保温、性能边界
    第7章-使用统计方法进行变量有效性测试-7.4.1-简单线性回归
    计算机毕业设计springboot+vue基本微信小程序的快递收发小程序
    Java多线程(Thread)详解之启动与中断
    基于SSM+Vue的校园教务系统的设计与实现
    U++ 人物基本移动、跳跃以及攻击实现,射线检测,cast to
  • 原文地址:https://blog.csdn.net/qq_45217381/article/details/133810982