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

news2024/11/25 12:34:56

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

文章目录

  • 一、实现效果
  • 二、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();
    //打开选定的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);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091550.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

百度Echarts实现饼图,较官网示例更多项显示

本来是想直接使用官网示例修改几个地方就用起来&#xff0c;但是用户希望一眼就看到百分占比&#xff0c;但是官网示例没有使用lable的&#xff0c;找了半天都没找到&#xff0c;后来通过对比其他饼图发现lable这个项&#xff0c;再次记录一下 首先看效果图&#xff1a; 2. 代码…

国海证券:36氪(KRKR):新经济内容平台龙头,多元变现可期

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;国海证券今日发布了关于36氪的新经济内容平台龙头&#xff0c;多元变现可期研报。国海证券主要内容如下&#xff1a;1、新经济产业发展迅猛&#xff0c;36氪定位为以媒体为旗舰的新经济服务集团&a…

下载安装Ipa Guard

下载安装Ipa Guard 可以前往ipaguard工具官网下载&#xff0c;工具是免费下载&#xff0c;免费体验使用的。下载地址是https://www.ipaguard.com。 下载后解压工具便ok了&#xff0c;工具是绿色软件&#xff0c;无需其他安装流程。双击Ipa Guard.exe 启动ipaguard。 ipaguard…

【问题思考】如何通过参数式求出方向向量?(待深入本质)

问题 今天在做23李六第二套的时候看到了一道题&#xff1a; 答案里面说的直接再加一个yy和上面的两个方程就凑成了三个方程&#xff08;x关于y的&#xff0c;y关于y的&#xff0c;z关于y的&#xff0c;最后每个方程都对y求导&#xff0c;再代入y1&#xff0c;就有了方向向量&…

Netapp数据恢复—Netapp存储误删除lun的数据恢复过程

Netapp存储数据恢复环境&#xff1a; 北京某公司一台netAPP存储&#xff0c;72块SAS硬盘划分了若干个lun。 Netapp存储故障&#xff1a; 工作人员误操作删除了12个lun。 Netapp存储数据恢复过程&#xff1a; 1、将故障存储中所有磁盘编号后取出&#xff0c;以只读方式做全盘镜…

C++入门指南:类和对象总结笔记(下)

C入门指南:类和对象总结笔记&#xff08;下&#xff09; 一、深度剖析构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字 二、static成员2.1 概念2.2 特性 三、友元3.1 友元函数3.2 友元类 四、 内部类4.1 概念4.2 特征 五、拷贝对象时的一些编译器优化六、深度剖析…

论文浅尝 | 深度神经网络的模型压缩

笔记整理&#xff1a;闵德海&#xff0c;东南大学硕士&#xff0c;研究方向为知识图谱 链接&#xff1a;https://arxiv.org/abs/1412.6550 动机 提高神经网络的深度通常可以提高网络性能&#xff0c;但它也使基于梯度的训练更加困难&#xff0c;因为更深的网络往往更加强的非线…

​人机交互中的反馈与前馈

人机交互中的反馈和前馈&#xff0c;是指在用户与机器进行交互的过程中&#xff0c;人机二者对输入的信息做出回应的方式。 反馈&#xff1a;反馈是从机器到人的信息传递过程&#xff0c;主要用于告知用户他们的操作或请求的结果。当用户执行某个操作时&#xff0c;机器通过适当…

nginx生成https 证书-基于docker-compose

申请的证书存放nginx的docker-compose.yml同一目录 [rootk8s-node1 nginx]# cat docker-compose.yml version: 2 services:nginx:container_name: nginximage: nginxrestart: alwaysvolumes:- "./default.conf:/etc/nginx/conf.d/default.conf"- "./nginx.conf…

初级问题 程序中的变量是指什么?中级问题 把若干个数据沿直线排列起来的数据结构叫作什么?高级问题 栈和队列的区别是什么?

目录 1.深刻主题 2.描写复杂人物 初级问题 程序中的变量是指什么&#xff1f; 中级问题 把若干个数据沿直线排列起来的数据结构叫作什么&#xff1f; 高级问题 栈和队列的区别是什么&#xff1f; 计算机图形学&#xff08;有效边表算法&#xff09; 介绍一下计算机图形学…

LoRa技术在实际应用中可能遇到的问题和挑战,以及解决方案

LoRa技术在物联网和其他应用领域中取得了显著的成功&#xff0c;但在实际应用中仍然面临一些问题和挑战。以下是一些可能的问题和挑战&#xff0c;以及针对这些挑战的一些建议解决方案。 1. 频谱管理问题 问题&#xff1a; 由于LoRa使用公共频谱&#xff0c;频道拥塞和干扰可…

java中转义字符的源码数据格式,内存存储数据格式和转换json后的数据格式

转义字符在内存存储格式 于 转换json后发送的数据格式是不一样的。因为json对于java来说可以看成一种源码&#xff0c;那就需要以源码的表示格式输出。 要注意转义字符在每种语言的源码的数据格式 和 内存存储的数据格式。 例&#xff1a;\n 换行转义字符 1.在java源码中为\…

一些基本的 AFL++ 插桩模式操控方式 (还有 DEBUG 方式)

在 afl-cc.c 1807 行&#xff0c;可以看到如下代码 " You can also use the old environment variables instead:\n" " AFL_LLVM_USE_TRACE_PC: use LLVM trace-pc-guard instrumentation\n" " AFL_LLVM_CALLER: use single context sensitive covera…

基于文心一言打造AI应用,律品汇助推公共法律服务惠及中国乡村

“宅基地可以买卖吗&#xff1f;” “邻居家建房子占了我的地&#xff0c;我该怎么办&#xff1f; “我给房东签了定金&#xff0c;现在我不打算租这个房子了&#xff0c;对方要不要退我定金啊&#xff1f;” 这些问题&#xff0c;仅仅是云南某村居民诸多法律咨询内容的一角&am…

SpringBoot 过滤器filter当中的自定义异常捕获问题

需求描述&#xff1a;需要根据用户的请求路径拦截做权限控制&#xff1a; 但是这样做全局异常无法捕获 解决方案&#xff1a; 在filter当中引入HandlerExceptionResolver类&#xff0c;通过该类的resolveException方法抛出自定义异常&#xff1a; public class OpenInvokeFil…

游戏中的随机——“动态平衡概率”算法

前言 众所周知计算机模拟的随机是伪随机&#xff0c;但在结果看来依然和现实中的随机差别不大。 例如掷硬币&#xff0c;连续掷很多很多次之后&#xff0c;总有连续七八十来次同一个面朝上的情况出现&#xff0c;计算机中一般的随机函数也能很好模拟这一点。 但在游戏中&…

Pulsar-Schema 数据结构

Pulsar-Schema 数据结构 为什么需要使用Schema&#xff1f;怎么使用&#xff1f;生产者端消费者端使用用例Schema定义Schema类型基本类型复合类型KeyValue schemaStruct schemaPulsar提供了以下方法来使用结构模式staticgeneric 自动SchemaSchema验证实施Schema演化Schema版本控…

DAY05_瑞吉外卖——新增套餐套餐分页查询删除套餐短信发送手机验证码登录

目录 1. 新增套餐1.1 需求分析1.2 数据模型1.3 准备工作1.4 前端页面分析1.5 代码开发1.5.1 根据分类查询菜品1.5.1.1 功能实现1.5.1.2 功能测试 1.5.2 保存套餐1.5.2.1 功能实现1.5.2.2 功能测试 2. 套餐分页查询2.1 需求分析2.2 前端页面分析2.3 代码开发2.3.1 基本信息查询2…

GMS地下水数值模拟及溶质(包含反应性溶质)运移模拟技术

地下水数值模拟软件GMS操作为主&#xff0c;在教学中强调模块化教学&#xff0c;分为前期数据收集与处理&#xff1b;三维地质结构建模&#xff1b;地下水流动模型构建&#xff1b;地下水溶质运移模型构建和反应性溶质运移构建5个模块&#xff1b;采用全流程模式将地下水数值模…

Dtop环球嘉年华全新支付渠道接入,带来更便捷全球化购物体验

随着全球互联网的快速发展和数字化时代的来临&#xff0c;Dtop环球嘉年华逐渐成为全球消费者购物的主要方式之一。作为一家跨境电商平台&#xff0c;伴随着全球用户量不断攀升&#xff0c;用户体验以及应用升级已经成为平台未来发展的重要因素。Dtop环球嘉年华致力于满足用户多…