Qt提取excel表单中数据

 这是一个excel表单,目标是把其中的数据提取出来。

文章学习自:QT中将excel中的数据快速的读取出来显示在tablewidget中/将tablewidget中的数据快速的写入excel中_qt将excel表格中指定范围内容显示在界面中_Jessica_1409573408的博客-CSDN博客

程序如下:
1.打开一个Excel应用程序,并使其可视化。

QAxObject excel("Excel.Application");   
excel.setProperty("Visible",true);

2.打开已存在的工作簿

QAxObject *workbooks = excel.querySubObject("WorkBooks");QString path="D:/Qt/Qt5Book/Qt5.9Samp/happy_prediction_table/build-happy_prediction_table-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/test.xlsx";        workbooks->dynamicCall("Open (const QString&)",QString(path));
 

 3.初步获取数据

QAxObject *workbook = excel.querySubObject("ActiveWorkBook"); //获取活动工作簿//获取第一个工作表        
QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);

QAxObject *usedrange=worksheet->querySubObject("UsedRange");//获取整个worksheet的范围 QVariant cell=usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中 qDebug()<<cell;

结果(这已经是我优化过的了): 

QVariant(QVariantList, (

QVariant(QVariantList,
(

QVariant(QString, "日期"),

QVariant(QString, "活动类型(特指能使你产\n生成就感或快乐的活动)"),

QVariant(QString, "陪你完成活动的人(如果是独\n自一人,请写明\"我自己\")"), QVariant(QString, "预计快乐程度\n(0~100%,活动\n开始前填写)"),

QVariant(QString, "实际快乐程度\n(0~100%,活动\n结束后填写)")

)

),

QVariant(QVariantList,

(

QVariant(QString, "2023/7/7\t"),

QVariant(QString, "写我有兴趣的程序\t"),

QVariant(QString, "我自己\t"),

QVariant(QString, "30%\t"),

QVariant(QString, "50%\t")

)

),

QVariant(QVariantList,

(

QVariant(QString, "2023/7/7\t"),

QVariant(QString, "跑步\t"),

QVariant(QString, "我自己\t"),

QVariant(QString, "45%\t"),

QVariant(QString, "55%\t")

)

),

QVariant(QVariantList,

(

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t")

)

),

QVariant(QVariantList,

(

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t"),

QVariant(QString, "\t")

)

)

)

)

为了更好地看出数据的层次,我做了这样的处理。 

x1=QVariant(QString, "日期")

x2=QVariant(QString, "活动类型(特指能使你产\n生成就感或快乐的活动)")

x3=QVariant(QString, "陪你完成活动的人(如果是独\n自一人,请写明\"我自己\")") 

x4=QVariant(QString, "预计快乐程度\n(0~100%,活动\n开始前填写)")

x5=QVariant(QString, "实际快乐程度\n(0~100%,活动\n结束后填写)")

QVariant(QVariantList,(x1,x2,x3,x4,x5))

y1=QVariant(QString, "2023/7/7\t")

y2=QVariant(QString, "写我有兴趣的程序\t")

y3=QVariant(QString, "我自己\t")

y4=QVariant(QString, "30%\t")

y5=QVariant(QString, "50%\t")

QVariant(QVariantList, (y1,y2,y3,y4,y5))

z1=QVariant(QString, "2023/7/7\t")

z2=QVariant(QString, "跑步\t")

z3=QVariant(QString, "我自己\t")

z4=QVariant(QString, "45%\t")

z5=QVariant(QString, "55%\t") 

QVariant(QVariantList, (z1,z2,z3,z4,z5))

 h=QVariant(QString, "\t")

 QVariant(QVariantList, (h,h,h,h,h))

化简后:

QVariant(QVariantList,

(

QVariant(QVariantList,(x1,x2,x3,x4,x5)),

QVariant(QVariantList, (y1,y2,y3,y4,y5)),

QVariant(QVariantList, (z1,z2,z3,z4,z5)),

QVariant(QVariantList, (h,h,h,h,h)),

QVariant(QVariantList, (h,h,h,h,h)),

)

)

探索: 

因为觉得上面的数据没有规律性,不方便找规律,我建了下面这张表: 

 

QVariant(QVariantList, (

QVariant(QVariantList,

(QVariant(QString, "(1,1)"), QVariant(QString, "(1,2)"), QVariant(QString, "(1,3)"))),

QVariant(QVariantList,

(QVariant(QString, "(2,1)"), QVariant(QString, "(2,2)"), QVariant(QString, "(2,3)")))))

转化:

QVariant(QVariantList, (QVariant(QVariantList, (x)),QVariant(QVariantList, (y))))

x=QVariant(QString, "(1,1)"), QVariant(QString, "(1,2)"), QVariant(QString, "(1,3)")

y=QVariant(QString, "(2,1)"), QVariant(QString, "(2,2)"), QVariant(QString, "(2,3)")

最外层是一个QVariantList,里面是两个QVariant,对应两行数据。

每个QVariant又是一个QVariantList,里面是3个QVariant,对应3列数据。

小贴士: 

观察QVariant(QString, "活动类型(特指能使你产\n生成就感或快乐的活动)")

发现它的结构是:QVariant(类型,内容)

含义:类型为QString,内容为"活动类型(特指能使你产\n生成就感或快乐的活动)"

 

 

现在已经得到了QVariant类型的数据,它存储的数据类似二维数组,这里把它转化为

QList<QList<QVariant>>

使用这个函数:

Qvariant2listlistVariant(const QVariant &var,QList<QList<QVariant>> &ret)
{QVariantList varrows=var.toList();if(varrows.isEmpty()){return;}else {const int rowcount=varrows.size();//行数qDebug()<<"excel中有几行"<<rowcount;QVariantList rowdata;for(int i=0;i<rowcount;i++){rowdata=varrows[i].toList();//将每一行的值存入到list中ret.push_back(rowdata);}}
}

语句解析:

 QVariantList varrows=var.toList();

使用函数:
QList<QVariant> toList() const
QList<QVariant>与QVariantList是同义的。

那么QList<QList<QVariant>>等同于QList<QVariantList>。

varrows的内容:

(
QVariant(QVariantList, 
(
QVariant(QString, "(1,1)"), QVariant(QString, "(1,2)"), QVariant(QString, "(1,3)")
)
),
QVariant(QVariantList,
(
QVariant(QString, "(2,1)"), QVariant(QString, "(2,2)"), QVariant(QString, "(2,3)")
)
)
)

4.这时候就可以把 QList<QList<QVariant>> ret中的信息提取出来了。

        int row=ret.size();//qDebug()<<row;for(int i=0;i<row;i++){QList<QVariant> one=ret.at(i);int column=one.size();//qDebug()<<column;for(int j=0;j<column;j++){QString strVal=one.at(j).toString();qDebug()<<strVal;/*在这里进行数据提取操作*/}}

5. workbook->dynamicCall("Close()"); //关闭工作簿

 

 6.excel.dynamicCall("Quit()");//关闭excel

程序完整版:

#include <QApplication>
#include <QAxObject>
#include <QDebug>
#include <QList>
#pragma execution_character_set("utf-8")
void Qvariant2listlistVariant(const QVariant &var,QList<QList<QVariant>> &ret)
{QVariantList varrows=var.toList();qDebug()<<varrows;if(varrows.isEmpty()){return;}else{const int rowcount=varrows.size();//行数//qDebug()<<"excel中有几行"<<rowcount;QVariantList rowdata;for(int i=0;i<rowcount;i++){rowdata=varrows[i].toList();//将每一行的值存入到list中ret.push_back(rowdata);}}
}int main(int argc, char *argv[])
{QApplication a(argc, argv);QAxObject excel("Excel.Application");//不对excel进行显示excel.setProperty("Visible",true);//添加新的工作簿QAxObject *workbooks = excel.querySubObject("WorkBooks");//打开已存在的工作簿QString path="D:/Qt/Qt5Book/Qt5.9Samp/happy_prediction_table/build-happy_prediction_table-Desktop_Qt_5_14_2_MSVC2017_32bit-Debug/test.xlsx";workbooks->dynamicCall("Open (const QString&)",QString(path));//获取活动工作簿QAxObject *workbook = excel.querySubObject("ActiveWorkBook");//获取第一个工作表QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 2);QAxObject *usedrange=worksheet->querySubObject("UsedRange");//获取整个worksheet的范围QVariant cell=usedrange->dynamicCall("value");//将worksheet的全部内容存储在QVariant变量中QList<QList<QVariant>> ret;Qvariant2listlistVariant(cell,ret);//将QVariant转换为QList<QList<QVariant>>int row=ret.size();//qDebug()<<row;for(int i=0;i<row;i++){QList<QVariant> one=ret.at(i);int column=one.size();//qDebug()<<column;for(int j=0;j<column;j++){QString strVal=one.at(j).toString();qDebug()<<strVal;}}workbook->dynamicCall("Close()");      //关闭工作簿excel.dynamicCall("Quit()");           //关闭excelreturn a.exec();
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于Javaweb实现ATM机系统开发实战(八)实时查询余额功能实现

老规矩&#xff0c;先看前端页面&#xff0c;把前端页面上没有的表达式都删掉&#xff1a; 创建servlet接受和处理请求&#xff1a; package com.atm.servlet;import com.atm.pojo.User; import com.atm.service.UserService; import com.atm.service.impl.UserServiceImpl;im…

Low-Light Image Enhancement via Stage-Transformer-Guided Network 论文阅读笔记

这是TCSVT 2023年的一篇暗图增强的论文 文章的核心思想是&#xff0c;暗图有多种降质因素&#xff0c;单一stage的model难以实现多降质因素的去除&#xff0c;因此需要一个multi-stage的model&#xff0c;文章中设置了4个stage。同时提出了用预设query向量来代表不同的降质因素…

Flink使用总结

本文主要是为Flink的java客户端使用和flink-sql使用的大致介绍&#xff0c;具体使用查看文档页面。 java client使用 文档 Apache Flink Documentation | Apache Flink 数据处理模型 maven依赖 <?xml version"1.0" encoding"UTF-8"?> <pro…

代价函数(Cost Function)

基本概念 代价函数也被称作平方误差函数&#xff0c;有时也被称为平方误差代价函数。我们之所以要求出误差的平方和&#xff0c;是因为误差平方代价函数&#xff0c;对于大多数问题&#xff0c;特别是回归问题&#xff0c;都是一个合理的选择。还有其他的代价函数也能很好地发挥…

微信小程序做登录密码显示隐藏效果 并解决安卓手机端隐藏密码时小黑点显示过大问题

在编辑器和苹果手机上面显示就是正常的大小&#xff0c;在安卓手机上面黑点就非常大&#xff0c;需要单独调 安卓手机显示比较大 wxml 注意&#xff1a;在html中的input是通过切换type的属性值来实现隐藏显示的 在微信小程序的input里面type没有password属性 是通过password属…

Linux开发工具之vim工具的使用介绍

目录 前言 1.vim的基本概念 命令模式(Normal mode) 插入模式(Insert mode) 末行模式(last line mode) 2.vim的基本操作 命令模式的命令集 移动光标 ​编辑 删除文字 复制 替换 撤销操作 更改 vim末行模式命令集 简单vim配置 总结 前言 大家好呀&#xff0c;许久…

数据结构 | 图的最短路径 Floyd算法

一、数据结构定义 typedef int VertexType; typedef int EdgeType;/*图*/ typedef struct {VertexType Vexs[SIZE]; //结点 EdgeType Edges[SIZE][SIZE]; //权值 int vexnum, arcnum; }MGraph;/*路径*/ typedef struct {int path[SIZE][SIZE];EdgeType length; }Path; 1.二维…

微服务 云原生:微服务相关技术简要概述

后端架构演进 单体架构 所谓单体架构&#xff0c;就是只有一台服务器&#xff0c;所有的系统、程序、服务、应用都安装在这一台服务器上。比如一个 bbs 系统&#xff0c;它用到的数据库&#xff0c;它需要存储的图片和文件等&#xff0c;统统都部署在同一台服务器上。 单体架…

白皮书案例解读|数字孪生与港口的结合会碰撞出什么样的火花呢?

以下案例来自于《数字孪生世界白皮书&#xff08;2023版&#xff09;》 领取方式&#xff1a;公众号「EasyV数字孪生」后台回复「白皮书」即可领取&#xff01; 嗨&#xff0c;我又出现啦&#xff5e;今天想和大家聊聊关于港口场景数字孪生技术的应用&#xff0c;欢迎大家踊跃…

基于JavaSwing+MySQL的仓库商品管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/88046204?spm1001.2014.3001.5503 JDK1.8 MySQL5.7 功能&#xff1a;管理员与员工两个角色登录&#xff0c;增删改查用户信息&#xff0c;修改密码&#xff0c;增删改查商品信息&#xff0c…

opencv基础:环境配置

最近人工智能很火&#xff0c;所以蹭个热度&#xff0c;聊一个跨平台计算机视觉库----Opencv。 定义 先看一下其定义&#xff1a; OpenCV是一个基于Apache2.0许可&#xff08;开源&#xff09;发行的跨平台计算机视觉和机器学习软件库&#xff0c;可以运行在Linux、Windows、…

vue3中的excel表导出功能(选中导出或导出所有,也可支持vue2)

1.安装模块 npm install xlsx file-saver -S 2.文件导入 import * as XLSX from "xlsx"; import FileSaver from "file-saver" 3.整体代码(可选中导出或导出所有) <template><div><el-button type"warning" click"down&quo…