Qt提取excel表单中数据

news2024/12/27 4:50:42

 这是一个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()");           //关闭excel
    return a.exec();
}

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

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

相关文章

前端CSS

基础语法 /*CSS注释 */ CSS样式 CSS应用方式 内联式 在标签上写样式 <img src"..." style"height:100px" /><div style"color:red;">中国联通</div> 嵌入式 在head标签中写style标签 外联式 样式写到文件中&#xff0…

网页链接投票链接步骤公众号投票链接制作制作投票

大家在选择投票小程序之前&#xff0c;可以先梳理一下自己的投票评选活动是哪种类型&#xff0c;目前有匿名投票、图文投票、视频投票、赛事征集投票等。 我们现在要以“笛乐悠扬”为主题进行一次投票活动&#xff0c;我们可以在在微信小程序搜索&#xff0c;“活动星”投票小程…

语言模型BERT理解

一、BERT概述 BERT是由Google在2018年提出的一种预训练语言模型。BERT的创新之处在于采用了双向Transformer编码器来生成上下文相关的词向量表示。 传统的单向语言模型只考虑了左侧或右侧的上下文信息&#xff0c;而BERT则同时考虑了左侧和右侧的上下文信息&#xff0c;使得生…

YOLOv5改进系列(15)——增加小目标检测层

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制

手把手教您kaiber,吊炸天的AI视频生成工具

什么是Kaiber AI&#xff1f; 一种人工智能视频生成器&#xff0c;可以将图像和文字生成视频。 如何使用Kaiber AI&#xff1f; 请按照以下步骤使用 Kaiber AI&#xff1a; 前往kaiber ai注册或登录。点击右上角“创建视频”。 如果订阅的时候提示要绑定银行卡&#xff0c;则找…

Basics——指针和引用(详解)

指针和引用 1.初始化规则2.面试题 &#xff1a;引用和指针的区别是什么3.引用使用场景4.拓展 为什么C支持引用而C没有 1.初始化规则 指针和引用在初始化方面有不同的规则&#xff1a; 指针的初始化规则&#xff1a; 直接初始化&#xff1a;可以将指针初始化为指向特定变量或…

Linux系统运行时参数命令(性能监控、测试)(3)网络IO性能监控

目录 5. 网络IO性能监控5.1 性能指标5.2 网络信息5.2.1 网络配置5.2.2 套接字信息5.2.3 网络吞吐-sar命令5.2.4 连通性和延时 5.3 其他常用的网络相关命令5.3.1 telnet5.3.2 nc5.3.3 tcpdump5.3.4 lsof5.3.5 nmap 6.其他工具6.1 nmon性能监控6.2 glances系统监控 5. 网络IO性能…

Js提升:如何实现图片懒加载

知其然&#xff0c;更要知其所有然&#xff0c;在不同场景下该用什么方法&#xff0c;如何做到最优。 为什么要出现图片懒加载&#xff0c;解决了什么问题&#xff1f;除了懒加载&#xff0c;还有预加载呢&#xff1f;什么是预加载&#xff0c;怎么实现&#xff0c;相比于懒加载…

软件设计模式与体系结构-软件体系-层次软件体系结构

目录 四、层次软件体系结构简介代码两种方式的区别双向分层分层风格 VS 主程序-子过程风格&#xff1a;二者的不同层次软件体系结构的优点层次软件体系结构的缺点 课程作业 四、层次软件体系结构 层次之间存在接口&#xff0c;通过接口形成call/return的关系&#xff0c;上层是…

【内存优化】内存优化以及oom排查整体思路

linux疑难问题排查实战专栏&#xff0c;分享了作为公司专家&#xff0c;在解决内存、性能、各类死机等疑难问题的排查经验&#xff0c;认真学习可以让你在日后工作中大放光彩。 本文总结介绍了项目开发过程中oom排查和内存优化的一些方法&#xff0c;主要是从内存问题查看到堆内…

阿里云轻量服务器和ecs区别(最新更新)

阿里云服务器ECS和轻量应用服务器有什么区别&#xff1f;云服务器ECS是明星级云服务器&#xff0c;轻量应用服务器可以理解为简化版的云服务器ECS&#xff0c;轻量适用于单机应用&#xff0c;云服务器ECS适用于集群类高可用高容灾应用&#xff0c;阿里云百科来详细说下阿里云轻…

组合模式:如何设计实现支持递归遍历的文件系统目录树结构?

组合模式跟我们之前讲的面向对象设计中的“组合关系&#xff08;通过组合来组装两个类&#xff09;”&#xff0c;完全是两码事。这里讲的“组合模式”&#xff0c;主要是用来处理树形结构数据。这里的“数据”&#xff0c;你可以简单理解为一组对象集合&#xff0c;待会我们会…

使用 geopandas 和 shapely(.shp) 进行地理空间数据处理和可视化

文章目录 前言1. 安装所需库2. 读取 Shapefile 文件3. 可视化地图4. 用户输入坐标和清除指定区域内的图形5. 可视化删除指定区域内的图形之后的地图6. 保存为新的 Shapefile (.shp)文件完整代码及解析分析说明 测试文件地址特别说明完结 前言 在地理信息系统&#xff08;Geogra…

力扣竞赛勋章 | 排名分数计算脚本

文章目录 力扣竞赛勋章介绍竞赛评分算法脚本&#xff08;本文的重点内容&#xff09;运行结果 代码修改自&#xff1a;https://leetcode.cn/circle/discuss/6gnvEj/ 原帖子的代码无法正常运行。 力扣竞赛勋章介绍 https://leetcode.cn/circle/discuss/0fKGDu/ 如果你想知道自…

【Elasticsearch】初识elasticsearch

目录 初识elasticsearch 1.1.了解ES 1.1.1.elasticsearch的作用 1.1.2.ELK技术栈 1.1.3.elasticsearch和lucene 1.1.4.为什么不是其他搜索技术&#xff1f; 1.1.5.总结 1.2.倒排索引 1.2.1.正向索引 1.2.2.倒排索引 1.2.3.正向和倒排 1.3.es的一些概念 1.3.1.文档…

前端各种方法自我整理

Javascript方法 slice [slaɪs]切片 slice (-2)取出数组中倒数两个植变生成一个新数组 slice(0&#xff0c;3)取出数组下标0到下标3的值&#xff0c;生成新数组 includes [ɪnˈkluːdz]包含 查看数组或字符串内是否有该值&#xff0c;有返回true,无返回false 例子&#…

Vue--》Vue3打造可扩展的项目管理系统后台的完整指南(十二)完结篇

今天开始使用 vue3 + ts 搭建一个项目管理的后台,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏…

linux常用压缩/解压缩命令的使用

目录 gzipbzip2tar gzip gzip 的常用选项&#xff1a; -l(list) 列出压缩文件的内容。 -k(keep) 在压缩或解压时&#xff0c;保留输入文件。 -d(decompress) 将压缩文件进行解压缩。 如果 gzip 不加任何选项&#xff0c;此时为压缩。压缩完该文件会生成后缀为.gz 的压缩文…

java读取excel,指定列A列为空,将下方空行上移,并将指定列F列数据拼接

java读取excel&#xff0c;将空行上移 改造前&#xff1a; 效果图&#xff1a; 上代码&#xff1a; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.FileInputStream; import java.io.FileOutputStream; import jav…

SqueezeNet算法解析—鸟类识别—Paddle实战

文章目录 一、理论基础1.前言2.设计理念2.1 CNN微架构&#xff08;CNN MicroArchitecture&#xff09;2.2 CNN宏架构&#xff08;CNN MacroArchitecture&#xff09;2.3 模型网络设计探索过程2.4 结构设计策略2.5 Fire模块 3.网络结构4.评估分析 二、实战1.数据预处理2.数据读取…