当前位置: 首页 > news >正文

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

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

文章目录

  • 一、实现效果
  • 二、UI设计
  • 三、程序设计
    • 3.1 选择本地表格文件
    • 3.2 获取表格总行列数
    • 3.3 获取并输出表格内容
    • 2.4 操作单元格内容
  • 四、操作实例

一、实现效果

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

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

上位机页面

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

选择文件

或者直接输入文件路径也可以。然后点击打开文件,在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);
}

选中文件后会将文件路径显示到控件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();//打开选定的excelworkbooks->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);
http://www.lryc.cn/news/194867.html

相关文章:

  • 香港服务器选纯国际线路上网稳定吗?
  • USB PD3.1
  • unity面试八股文 - 基础篇
  • 构建高效问题解答平台:使用Cpolar和Tipas在Ubuntu上搭建专属问答网站
  • 前馈型BP神经网络
  • 数据库实验一:学生信息管理系统数据库结构搭建和表的创建
  • 解决 vscode使用Prettier格式化js文件报错:Cannot find module ‘./parser-babylon‘
  • 汉服商城小程序的作用是什么
  • 9月大型语言模型研究论文总结
  • 微信小程序--小程序框架
  • Java 全栈体系(三)
  • 爬虫学习日记第七篇(爬取github搜索仓库接口,其实不算爬虫)
  • 子组件监听父组件消息,随之变化与不变化
  • 计算机操作系统面试题自用
  • redis作为消息队列的缺点
  • Redis五大数据类型的底层设计
  • logback的简单配置详解
  • TatukGIS Developer Kernel使用教程:如何为FMX创建第一个应用程序
  • Ant Design Vue设置表格滚动 宽度自适应 不换行
  • 在Linux上开启文件服务,需要安装并配置Samba
  • TypeScript 类型兼容性
  • 【多线程】线程的状态
  • pytorch 对图片进行归一化处理
  • 零售数据分析师熬夜整理:人、货、场、供、财这样做
  • 基于SSM的学生选课管理系统
  • SQL注入漏洞
  • C++ wpf自制软件打包安装更新源码实例
  • 8月19日PMP成绩,预计10月16日公布!附查询入口、流程
  • 简易LDO设计(包含原理图、PCB和实验)
  • SpringBoot面试题5:SpringBoot Starter的工作原理是什么?