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

简介: 本文给出了利用Qt编写一个上位机,实现打开本地表格文件,获取表格总行列数,操作单个单元格以及获取全部单元格内容并输出的解决办法,仅供参考。


🎀 文章作者:二土电子
🐸 期待大家一起学习交流!


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

一、实现效果

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

c528e1e72d08ba03169bd2009c0d0389_48fe82a15a084cd3b912a092d2257b22.png

目前的上位机页面如下

ee73500fc0065619a0501ac93b8b7689_741a1502f6c5468db286935dccd46aea.png

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

432aa70ca406d138e7ab7f73180a1909_78c1f878dd37451d951405f5fa3db702.png

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

cff7c05e4fcbebce3431986354fbc532_10aeb65e5ca2452d89566dfd89ab0395.png

二、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);
}

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

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

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

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);

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

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

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();
        }
    }

2.4 操作单元格内容

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

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

四、操作实例

这里的操作实例是根据博主自己需要写的,是为了找出报文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);
相关文章
|
7月前
|
计算机视觉 数据格式
使用opencv在Qt控件上播放mp4文件
使用opencv在Qt控件上播放mp4文件
219 2
|
7月前
|
存储 C++
基于Qt的简易文件压缩与解压缩工具设计与实现
基于Qt的简易文件压缩与解压缩工具设计与实现
335 1
|
7月前
|
监控 安全 Linux
Qt 文件类实战:解锁文件操作的无限可能
Qt 文件类实战:解锁文件操作的无限可能
335 1
|
7月前
【QT】创建、打开QT项目只显示.pro文件的问题解决
【QT】创建、打开QT项目只显示.pro文件的问题解决
2557 0
|
4月前
【qt】如何读取文件并拆分信息?
【qt】如何读取文件并拆分信息?
43 0
|
5月前
|
C++
基于QT实现的拷贝文件以及实时进度条(简易版)
1.基于按钮或者菜单栏的槽里去写逻辑函数(我这边用的是菜单栏),ui实现的进度条 2.创建两个对象,一个是源文件,一个是目标文件分别用getopenfileName、getsavefileName函数即可。 3.利用QFile类去实现对两个文件的创建,因为QFile中可以获取文件的属性已经读写等。 4.循环的去读取源文件中的数据,然后写入目标文件
554 6
|
4月前
|
存储 C++
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
103 1
【C++】C++ 基于QT实现散列表学生管理系统(源码+数据+课程论文)【独一无二】
|
4月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
111 4
|
4月前
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog
859 4
|
4月前
|
XML 开发框架 API
【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制
【Qt 学习笔记】QWidget的windowTitle属性 | windowIcon属性 | qrc文件机制
212 1