QT 使用第三方库QtXlsx操作Excel表

news2025/1/17 15:24:03

一直以来,都想学习一下C/C++如何操作excel表,在网上调研了一下,觉得使用C/C++去操作很麻烦,遂转向QT这边;QT有一个自带的类QAxObject,可以使用他去操作,但随着了解的深入,觉得他并不是很好,有很多其他缺陷(例如必须电脑安装了办公软件才可以进行操作等),所以继续调研,终于找到了QT的一个第三方库可以很好的实现:QtXlsx


目录

一、下载QtXlsx

二、QtXlsx源码嵌入QTCreator中使用

三、QtXlsx源码编译成为.lib库使用

1. 下载安装Perl

2. 编译QtXlsx

3. 在vs中使用

四、QtXlsx

1. 知识点

2. 使用公式

五、练手小demo


Github下载:https://github.com/dbzhang800/QtXlsxWriter
官方文档:http://qtxlsx.debao.me/

在Github下载后,可以直接添加到QtCreator项目中,也可以编译成lib库后再添加到VS中去使用。


一、下载QtXlsx

点击链接进入Github下载

下载解压后得到如下文件


二、QtXlsx源码嵌入QTCreator中使用

新建一个QTCreator窗体项目

将上图src文件夹拷贝到该项目路径中

之后双击项目中的.pro文件

将如下代码拷贝到.pro文件中

include(src/xlsx/qtxlsx.pri)

Ctrl + s 保存一下,就可以把QtXlsx源码模块加载进来啦!

可以在项目构造函数中添加如下代码进行测试:

#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"

QXlsx::Document xlsx;
xlsx.write(1, 2, "Hello Qt!");
xlsx.write(2, 2, QString::fromLocal8Bit("中文"));
xlsx.saveAs("Text.xlsx");

编译运行后,就可以在项目路径看到程序创建的Text.xlsx文件,打开后就可以看到写入的 "Hello Qt!"和"中文".


三、QtXlsx源码编译成为.lib库使用

1. 下载安装Perl

下载安装:Perl

下载链接:https://strawberryperl.com/

注意,这个是一定要下载安装的,否则编译lib库会编译失败!!! 

下载后默认安装即可

2. 编译QtXlsx

打开下载的QtXlsx文件夹,双击打开.pro

根据自己安装的vs版本,选择相应的msvc编译

 打开后直接点击编译

编译完成后,就可以在相应路径找到编译好的lib库

3. 在vs中使用

新建vsQT项目,将include文件夹Qt5Xlsxd.dllQt5Xlsxd.lib拷贝到项目路径中;

QtXlsxWriter-master文件夹整个拷贝到项目路径中;

拷贝之后项目路径文件,下图方框中的就是我们需要拷贝的文件

右键项目 - 属性 - C/C++ - 常规 - 附加包含目录,把头文件路径添加进来

右键项目 - 属性 - 链接器 - 输入 - 附加依赖项,添加Qt5Xlsxd.lib

之后,可以加入头文件

#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"

在构造函数中加入代码

	QXlsx::Document xlsx;
	xlsx.write(1, 2, "Hello Qt!");
	xlsx.write(2, 2, QString::fromLocal8Bit("中文"));
	xlsx.saveAs("Text.xlsx");

编译运行,不出意外的话, 在项目路径会一个名为Text.xlsx的文件,双击打开

数据也已经写入,测试成功! 


四、QtXlsx

1. 知识点

a. 定义

QXlsx::Document xlsx;

QXlsx::Document xlsx("Text.xlsx");

b. 往单元格中写入数据

write

xlsx.write(2, 2, "中文");         参数一是行,参数二是列,参数三是数据

xlsx.write("C3", "C3");        参数一是对应单元格名字,参数二是数据

c. 设置行高

setRowHeight

xlsx.setRowHeight(4, 30);        设置第四行高度为30

d. 设置列宽

setColumnWidth

xlsx.setColumnWidth(3, 50);         设置第三列宽度为50

 e. 设置单元格样式

QXlsx::Format format;

format.setFontColor(Qt::red);                  // 设置字体颜色为红色

format.setFontBold(true);                         // 设置加粗

format.setFontSize(30);                            // 设置字体大小

format.setFontItalic(true);                          // 设置倾斜

format.setFontName("楷体");                     // 设置字体

format.setPatternBackgroundColor(QColor(100, 200, 100));         // 设置单元格背景颜色

format.setHorizontalAlignment(QXlsx::Format::AlignHCenter);      // 设置水平居中,更多参考enum HorizontalAlignment枚举

format.setVerticalAlignment(QXlsx::Format::AlignVCenter);           // 设置垂直居中

format.setBorderColor(QColor(50, 50, 50));                                    // 设置边框颜色

format.setFontUnderline(QXlsx::Format::FontUnderlineDouble);    // 设置双下划线,更多参考enum FontUnderline枚举

format.setFontUnderline(QXlsx::Format::FontUnderlineSingle);      // 设置单下划线

format.setFillPattern(QXlsx::Format::PatternLightUp);                     // 填充方式,更多参考enum FillPattern枚举

xlsx.write("C4", "红色|加粗|30", format);        作为第三个参数

f. 设置单元格方框

setBorderStyle

format.setBorderStyle(QXlsx::Format::BorderThin);        更多参考enum BorderStyle枚举

g. 合并单元格

mergeCells

xlsx.mergeCells("C4:E6");        参数指定那个单元格区间

h. 取消合并

unmergeCells

xlsx.unmergeCells("C4:E6");        参数指定的单元格区间一定是要已经合并的,否则打开xlsx文件报错

i. 读取单元格中的数据

read

QString str1 = xlsx.read(1, 1).toString();        指定行列获取

QString str2 = xlsx.read("B2").toString();        指定单元格名字获取

j. 获得单元格对象

cellAt

QXlsx::Cell *cell = xlsx.cellAt("C4");                获取到的是指针对象

QXlsx::Cell *cell = xlsx.cellAt(1, 1);

cell->value();        可以通过value()函数获取单元格中的值

k. 添加工作表

addSheet

xlsx.addSheet("sheet_2");        添加这一张名为“sheet_2”的工作表

l. 工作表重命名

renameSheet

xlsx.workbook()->renameSheet(1, "sheet_3");        将索引为1(也就是第二张)的工作表命名为“sheet_3”

m. 选择当前工作表

selectSheet

xlsx.selectSheet("sheet_3");        选择名为“sheet_3”的工作表为当前xlsx工作表

n. 获得所有工作表的名字

sheetNames
QStringList sheetList = xlsx.sheetNames();        获取返回的是一个字符串链表

o. 获取工作簿对象

workbook

QXlsx::Workbook *workBook = xlsx.workbook();

p. 获取当前工作簿的第一张sheet工作表

QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(workBook->sheet(0));

q. 获取当前sheet表所使用到的行数

int row = workSheet->dimension().rowCount();

r. 获取当前sheet表所使用到的列数

int colum = workSheet->dimension().columnCount();

s. 遍历sheet表中有数据的单元格

for (int i = 0; i < row; i++) {                                                               
    for (int j = 0; j < colum; j++) {                                                         
        // 获取单元格                                                                              
        QXlsx::Cell *cell = workSheet->cellAt(i, j);    // 读取单元格                              
        if (cell) {                                                                           
            qDebug() << "(" << i << ", " << j << ")\t" << cell->value().toString().trimmed();    // trimmed 去除字符串两侧的空格                                                                                              
        }                                                                                     
    }                                                                                         
}                                                                                             

t. 删除单元格数据

xlsx.write("G5", "");        直接重新设置为空即可

u. 修改单元格数据

xlsx.write("G6", "修改");        重新对单元格写入数据即可

v. 保存

saveAs

xlsx.saveAs("Text.xlsx");        初始化xlsx对象时没有指定excel文件,那么保存时使用这个

save

xlsx.save();        初始化xlsx对象时,指定了excel文件,那么保存时使用这个

w. 设置单元格中字符串不同字体颜色

RichString

QXlsx::Document xlsx("Text.xlsx");             
                                               
QXlsx::Format blue;     // 设置字体颜色              
blue.setFontColor(Qt::blue);                   
QXlsx::Format red;                             
red.setFontColor(Qt::red);                     
red.setFontSize(20);    // 设置字体大小              
QXlsx::Format bold;                            
bold.setFontBold(true); // 设置字体加粗              
                                               
QXlsx::RichString rich;                        
rich.addFragment("test", blue);                
rich.addFragment("QT", red);                   
rich.addFragment("中文", bold);                  
                                               
xlsx.write("C3", rich);                        
                                               
xlsx.save();                                   

x. 给单元格命名

xlsx.defineName("Cell_1", "=Sheet1!$A$1:$A$10");    // A1-A10命名为Cell_1
xlsx.defineName("Cell_2", "=Sheet1!$B$1:$B$10", "这是描述信息");  // B1-B10命名为Cell_2

 y. 赋值

xlsx.defineName("Factor", "=0.5");         // 将0.5赋值给Factor,相当于变量赋值一样,我们就可以使用这个变量了

2. 使用公式

xlsx.write(11, 1, "=SUM(Cell_1)");  // 计算A1-A10数据总和,并写入(11,1)单元格中
xlsx.write(15, 1, "=SUM($A$1:$A$10)");  // 计算A1-A10数据总和,并写入(15,1)单元格中

使用公式和变量

xlsx.write(12, 1, "=SUM(Cell_1)*Factor");   // 计算A1-A10数据总和再乘以0.5,并写入(12,1)单元格中
xlsx.write(16, 1, "=SUM($A$1:$A$10)*Factor"); // 计算A1-A10数据总和再乘以0.5,并写入(16,1)单元格中
xlsx.write(13, 2, "=SUM($B$1:B$10)*0.1");    // B1 - B10 计算总和后乘以0.1

五、练手小demo

自己写的一个小demo,操作excel文件,自动生成该excel文件,然后可以对其插入,删除,保存,刷新的操作!

使用QTCreator进行操作编写!

 

下载链接:Qtxlsx+QtCreator+自己编写的对excel文件操作小案例-C++文档类资源-CSDN文库

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

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

相关文章

打造企业数智化管理新引擎,中国首份指标中台市场研究报告重磅发布!

12月15日&#xff0c;中国首份指标中台市场研究报告正式对外发布。该报告由专注数字化市场的研究咨询机构爱分析联合指标中台代表厂商 Kyligence 共同打造&#xff0c;内容聚焦指标管理和数据分析痛点&#xff0c;全面地梳理了指标中台概念、价值和应用落地方法论&#xff0c;并…

如何快乐地自学Python?阿里讲师用“四点”,说透快乐学习的方法

前言 由于我是自学Python&#xff0c;非科班出身&#xff0c;所以只能分享一些关于我的学习心得&#xff0c;如果有不对地方欢迎指正。 不过非科班出身虽然是一个痛点&#xff0c;但是在工作上&#xff0c;我其实不输给我其他同事&#xff0c;这点我倒是很有自信&#xff0c;…

活用 F12 开发者工具,测试效率原来可以提高这么多

推荐阅读&#xff1a; [内部资源] 想拿年薪30W的软件测试人员&#xff0c;这份资料必须领取~ Python自动化测试全栈性能测试全栈&#xff0c;挑战年薪40W 从功能测试进阶自动化测试&#xff0c;熬夜7天整理出这一份超全学习指南【附网盘资源】 什么是F12? F12开发者工具是…

HTTP详细介绍

HTTP 内容协商 什么是内容协商 在 HTTP 中&#xff0c;内容协商是一种用于在同一 URL 上提供资源的不同表示形式的机制。内容协商机制是指客户端和服务器端就响应的资源内容进行交涉&#xff0c;然后提供给客户端最为适合的资源。内容协商会以响应资源的语言、字符集、编码方…

FS32R294JCK0MJDT功能、FS32R294KCK0MJDT特点、FS32R294KAK0MJDT雷达微控制器

S32R294的特点与优势&#xff1a;内置雷达信号加速单元&#xff0c;简称SPT2.8&#xff0c;是专门服务于FMCW雷达的信号处理加速单元。同时&#xff0c;它是16纳米Power架构的处理器&#xff0c;与上一代处理器有非常好的软件兼容性&#xff0c;软件复用率高达80%&#xff1b;S…

【愚公系列】2022年12月 使用NSSM工具部署ELK三件套为Windows服务

文章目录前言一、使用NSSM工具部署ELK三件套为Windows服务1.安装ElasticSearch服务2.安装Kibana服务3.安装Logstash服务4.验证ELK服务前言 nssm是一个服务封装程序&#xff0c;它可以将普通exe程序封装成服务&#xff0c;实现开机自启动&#xff0c;同类型的工具还有微软自己的…

计算机硬件基础

目录 一、计算机组成原理 1.计算机的组成 输入设备&#xff1a; 输出设备&#xff1a; 存储器&#xff1a; 运算器&#xff1a; 控制器&#xff1a; 2.总线 总线 DMA总线 二、多级存储 1.三级存储结构 Cache 主存储器 辅助存储器 2.地址空间 三、CPU工作原理概述…

Java培训Mycat全局序列

全局序列 1、本地文件方式 不推荐&#xff0c;如在Mycat主机中用本地文件方式创建全局序列&#xff0c;当这台机器宕机时会出现&#xff0c;序列文件丢失&#xff0c;造成序列冲突问题 Java培训Mycat全局序列 2、数据库方式 2.1、原理 利用数据库一个表 来进行计数累加。…

干货 | 数字经济创新创业——软件研究

下文整理自清华大学大数据能力提升项目能力提升模块课程“Innovation & Entrepreneurship for Digital Economy”&#xff08;数字经济创新创业课程)的精彩内容。主讲嘉宾&#xff1a;Kris Singh: CEO at SRII, Palo Alto, CaliforniaVisiting Professor of Tsinghua Unive…

计算机毕设Python+Vue校园食堂订餐系统(程序+LW+部署)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

【IntelliJ IDEA技巧】:如何生成.jar文件

问题描述&#xff1a; 由于上交给上级或者特殊使用&#xff0c;我们需要将jar文件提交给上级&#xff0c;那就是要学会如何生成jar文件&#xff0c;个人找了很久解决了问题&#xff0c;主要是网上太多参差不齐的回答&#xff0c;我觉着很浪费时间&#xff0c;当然有些也是比较好…

MySQL zip安装包 的安装过程

以前怎么安装的Mysql已经不记得了&#xff0c;感觉就是傻瓜式安装。这次又要用上了&#xff0c;发现和原先的记忆完全不一样了&#xff0c;也许是自己全忘了。这次记在这里&#xff0c;日后好参照&#xff0c;有需要的同学也可直接拿去。 1.下载&#xff0c;直接去官网吧 MyS…

人乳铁蛋白ELISA试剂盒操作注意事项及步骤丨艾美捷方案

人乳铁蛋白(LTF)ELISA试剂盒操作注意事项&#xff1a; 1.试剂应按标签说明书储存&#xff0c;使用前恢复到室温。稀稀过后的标准品应丢弃&#xff0c;不可保存。 2.实验中不用的板条应立即放回包装袋中&#xff0c;密封保存&#xff0c;以免变质。 3.不用的其它试剂应包装好…

基于Python+sqlite3实现(Web)图书管理系统【100010049】

*项目名称&#xff1a;图书管理系统 &#xff08;LibraryManagementSystem&#xff09; 一、系统目标 使用了Python作为语言,以django为后台&#xff0c;sqlite3作为数据库&#xff0c;UI基于bootstrap的图书管理系统&#xff0c;模拟图书管理的真实场景&#xff0c;考虑客观…

软件测试就业现状分析,2023是卷or润?

导读 自媒体大V卢克文11月的文章《从数据读疫情》中写道&#xff0c;“大约从2022年5月以后&#xff0c;身边的人&#xff0c;大量倾诉&#xff0c;他们的餐馆、旅行社、投资公司、运输公司出问题了&#xff0c;他们没钱了&#xff0c;每日还要还贷&#xff0c;他们很难过”。…

Java+MySQL基于SSM的会议交接平台的设计与实现 毕业设计

随着社会竞争压力的不断加强,企事业单位内部的会议都在不断的增加,有效的会议可以提高企事业内部的沟通,更好的做出符合战略目标的决策,但是传统的会议交接有一定的问题存在,首先就是必须面对面进行传达,其次就是对任务的安排和执行没有很好的记录,为了改变这些情况,于是我们提…

免疫佐剂CpG ODN说明——艾美捷CpG ODN 方案

免疫佐剂&#xff08;immunoadjuvant&#xff09;,又称非特异性免疫增生剂&#xff0c;其本身不具有抗原性&#xff0c;但同抗原一起或者预先注射到机体后&#xff0c;能非特异性地改变机体对该抗原的特异性免疫应答。1925年Ramon首先发现在疫苗中加入某种其他物质可以提高抗原…

OpenCV-Python学习(17)—— OpenCV 图像像素类型转换与归一化(cv.normalize)

1. 学习目标 学习 OpenCV 图像像素的类型转换&#xff1b;学习 OpenCV 归一化函数。 2. OpenCV 图像像素的类型转换 由于【在 OpenCV-Python 中一切图像数据皆 numpy.array】&#xff0c;因此像素的类型转换可以直接使用 numpy 的类型转换方法。 2.1 将像素转换为 float32 i…

Windows 下 MongoDB 6 详细安装教程(图文结合)

​ MongoDB是一个基于分布式文件存储 [1] 的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&#xff0c;是非关系数据库当中功能最丰富&#xff0c;最像关系数据库的。它支持的数据结构非常…

为什么电子商务物流对电商商家的业务如此重要?

正是电子商务物流的推动推动了企业发展包括最大渠道在内的整体生态系统;店内提货、电子商务、分销商、经销商、合作伙伴和全球制造商&#xff0c;推动新客户的增长。电子商务巨头的目标是推动更多的销售并提高客户忠诚度。  无论是内部还是第三方物流公司&#xff0c;改进的电…