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

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

1.简介

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

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

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

2、下载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

下载链接:Strawberry Perl for Windows

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

下载后默认安装即可

2. 编译QtXlsx

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

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

 打开后直接点击编译

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

3. 在vs中使用

新建vsQT项目,将include文件夹和Qt5Xlsxd.dll和Qt5Xlsxd.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. 往单元格中写入数据

writexlsx.write(2, 2, "中文");         参数一是行,参数二是列,参数三是数据xlsx.write("C3", "C3");        参数一是对应单元格名字,参数二是数据

c. 设置行高

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

d. 设置列宽

setColumnWidthxlsx.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. 设置单元格方框

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

g. 合并单元格

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

h. 取消合并

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

i. 读取单元格中的数据

readQString str1 = xlsx.read(1, 1).toString();        指定行列获取QString str2 = xlsx.read("B2").toString();        指定单元格名字获取

j. 获得单元格对象

cellAtQXlsx::Cell *cell = xlsx.cellAt("C4");                获取到的是指针对象QXlsx::Cell *cell = xlsx.cellAt(1, 1);cell->value();        可以通过value()函数获取单元格中的值

k. 添加工作表

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

l. 工作表重命名

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

m. 选择当前工作表

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

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

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

o. 获取工作簿对象

workbookQXlsx::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. 保存

saveAsxlsx.saveAs("Text.xlsx");        初始化xlsx对象时没有指定excel文件,那么保存时使用这个savexlsx.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,相当于变量赋值一样,我们就可以使用这个变量了

z. 使用公式

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

五、QtXlsx知识点补充

1.QStringList sheetNames() const


2.bool addSheet(const QString &name = QString(), AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)


3.bool insertSheet(int index, const QString &name = QString(), AbstractSheet::SheetType type = AbstractSheet::ST_WorkSheet)

4.bool renameSheet(const QString &oldName, const QString &newName)

5.bool moveSheet(const QString &srcName, int distIndex)

6.bool deleteSheet(const QString &name)


7.AbstractSheet *Document::sheet(const QString &sheetName) const

8.AbstractSheet::SheetState AbstractSheet::sheetState() const

9.void AbstractSheet::setSheetState(SheetState state)

10.bool AbstractSheet::isHidden() const

11.bool AbstractSheet::isVisible() const

12.void AbstractSheet::setHidden(bool hidden)

13.void AbstractSheet::setVisible(bool visible)\

14.Chart *Document::insertChart(int row, int col, const QSize &size)

15.void Chart::setChartType(ChartType type)

16.void Chart::addSeries(const CellRange &range, AbstractSheet *sheet, bool headerH, bool headerV, bool swapHeaders)

17.void Chart::setChartLegend(Chart::ChartAxisPos legendPos, bool overlay)

18.void Chart::setChartTitle(QString strchartTitle)

19.void Chart::setGridlinesEnable(bool majorGridlinesEnable, bool minorGridlinesEnable)
 

20.int Document::insertImage(int row, int column, const QImage &image)

21.uint Document::getImageCount()

22.bool Document::getImage(int imageIndex, QImage& img)

23.bool Document::getImage(int row, int col, QImage &img)

不错的连接:https://blog.csdn.net/qq_43627907/category_11756312.html​​​​​​​

相关文章:

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

1.简介 一直以来&#xff0c;都想学习一下C/C如何操作excel表&#xff0c;在网上调研了一下&#xff0c;觉得使用C/C去操作很麻烦&#xff0c;遂转向QT这边&#xff1b;QT有一个自带的类QAxObject&#xff0c;可以使用他去操作&#xff0c;但随着了解的深入&#xff0c;觉得他…...

警惕网络个人技术人员:隐藏代码风险的启示

在当今数字化时代&#xff0c;我们对网络上个人技术人员的需求日益增加&#xff0c;这使得技术服务成为一项不可或缺的资源。然而&#xff0c;我最近的经历却引发了我对这种服务可靠性的怀疑&#xff0c;特别是当这些个人技术人员没有正式公司背景&#xff0c;缺乏可信的运营保…...

VBA 学习笔记1 对象以及属性

目录 1 取得VBA对象1.1 取得工作簿对象1.2 取得工作表对象1.3 取得单元格对象1.4 取得对象的属性1.5 文档的方法1 进入vba 界面 方式之一&#xff1a; 快捷键&#xff1a;ALTERF11 运行方式之一&#xff1a; 进入vba界面&#xff0c;点击绿色三角符号 1 取得VBA对象 1.1 取得…...

netty核心组件以及实现原理

Netty核心组件 网络通信层&#xff1a;这一层有三个核心组件&#xff1a;Bootstrap、ServerBootStrap和Channel。Bootstrap负责客户端的启动&#xff0c;并用来链接远程Netty Server&#xff1b;ServerBootStrap负责服务端监听&#xff0c;用来监听指定端口&#xff1b;Channe…...

如何正确下载tomcat???

亲爱的小伙伴&#xff0c;千万别再去找下网站下载啦&#xff0c;这样詪容易携带病毒。 我们去官方网址下载。 Apache Tomcat - Welcome! 最后下载解压即可。。。...

mybatis-plus 根据指定字段 批量 删除/修改

mybatis-plus 提供了根据id批量更新和修改的方法,这个大家都不陌生 但是当表没有id的时候怎么办 方案一: 手写SQL方案二: 手动获取SqlSessionTemplate 就是把mybatis plus 干的事自己干了方案三 : 重写 executeBatch 方法结论: mybatis-plus 提供了根据id批量更新和修改的方法,…...

MQTT宝典

文章目录 1.介绍2.发布和订阅3.MQTT 数据包结构4.Demo5.EMQX 1.介绍 什么是MQTT协议 MQTT&#xff08;消息队列遥测传输协议&#xff09;&#xff0c;是一种基于发布/订阅&#xff08;publish/subscribe&#xff09;模式的“轻量级”通讯协议&#xff0c;该协议构建于TCP/IP协…...

【前端】CSS水平居中的6种方法

文章目录 flex绝对定位margin:auto绝对定位margin:负值定位transformtext-align: center;margin: 0 auto;思维导图 后文&#xff1a;【前端】CSS垂直居中的7种方法_karshey的博客-CSDN博客 左右两边间隔相等的居中 flex display: flex;justify-content: center; <div clas…...

nginx如何获取真实的ip

我这里使用是springboot项目&#xff0c;使用nginx做代理&#xff0c;但header里面的参数没有将ip带过来&#xff0c;所有需要配置nginx将ip带过来。 nginx.conf文件 server {listen 80;listen 443 ssl;server_name xxx.xxx.com;ssl_certificate /web/project/ai…...

kotlin + LiveData 测试

viewModel测试&#xff1a;https://developer.android.com/codelabs/basic-android-kotlin-compose-test-viewmodel#3 androidTestImplementation "org.jetbrains.kotlin:kotlin-test:1.9.0"androidTestImplementation org.jetbrains.kotlinx:kotlinx-coroutines-tes…...

【dnf5文档】新一代RedHat自动化包管理器

前言 HI,CSDN的码友们&#xff0c;距离上一次我发文章已经过去了半年的时间&#xff0c;现在我又来介绍自己新发现和探究的开源技术了。计算机的发展总是飞速的&#xff0c;当我在写这篇文章的时候&#xff0c;Fedora rawhide已经进入了40版本、默认采用的自动化包管理器为dnf…...

数据可视化工具的三大类报表制作流程分享

电脑&#xff08;pc&#xff09;、移动、大屏三大类型的BI数据可视化报表制作步骤基本相同&#xff0c;差别就在于尺寸调整和具体的报表布局。这对于采用点击、拖拉拽方式来制作报表的奥威BI数据可视化工具来说就显得特别简单。接下来&#xff0c;我们就一起看看不这三大类型的…...

lua使用心得

lua语言的一些注意事项 在控制结构的条件中除了false和nil为假&#xff0c;其他值都为真。所以Lua认为0和空串都是真。lua5.3之前的版本只支持浮点数&#xff0c;lua5.3才引入了对整数的支持&#xff0c;/仅支持浮点数除法&#xff0c;要实现C里的整除效果必须使用双斜杠//超过…...

Docker升级后,出现Error response from daemon: Unknown runtime specified docker-runc

现象&#xff1a;docker升级版本后&#xff0c;重启docker服务出现&#xff1a; [rootDocker scripts]# docker start registry Error response from daemon: Unknown runtime specified docker-runc Error: failed to start containers: registry解决办法&#xff1a; 改完之…...

[Poetize6] IncDec Sequence

题目描述 给定一个长度为 n 的数列 a_1,a_2,...,a_n&#xff0c;每次可以选择一个区间[l,r]&#xff0c;使这个区间内的数都加 1 或者都减 1。 请问至少需要多少次操作才能使数列中的所有数都一样&#xff0c;并求出在保证最少次数的前提下&#xff0c;最终得到的数列有多…...

通过Microsoft Loopback Adapter实现虚拟机和物理机的通信

问题 问&#xff1a;不借助路由器或交换机的情况下&#xff0c;能不能实现主机和虚拟及之间两个软件的通信呢&#xff1f;要求主机和虚拟及均有独立的ip地址&#xff0c;从而进行指定源的组播通信。 答&#xff1a;可以。通过借助虚拟网络适配器&#xff0c;不需要路由器或交…...

算法leetcode|70. 爬楼梯(rust重拳出击)

文章目录 70. 爬楼梯&#xff1a;样例 1&#xff1a;样例 2&#xff1a;提示&#xff1a; 分析&#xff1a;题解&#xff1a;rust&#xff1a;go&#xff1a;c&#xff1a;python&#xff1a;java&#xff1a; 70. 爬楼梯&#xff1a; 假设你正在爬楼梯。需要 n 阶你才能到达楼…...

基于epoll的TCP服务器端(C++)

网络编程——C实现socket通信(TCP)高并发之epoll模式_tcp通信c 多客户端epoll_n大橘为重n的博客-CSDN博客 网络编程——C实现socket通信(TCP)高并发之select模式_n大橘为重n的博客-CSDN博客 server.cpp #include <stdio.h> #include <sys/types.h> #include <…...

实时安全分析监控加强网络安全

网络犯罪分子只需几分钟&#xff0c;有时甚至几秒钟即可泄露敏感数据。但是&#xff0c;IT 团队可能无法在数周内发现这些违规行为。通常&#xff0c;这些违规行为是由外部方或客户发现的&#xff0c;到那时为时已晚。随着网络漏洞的激增&#xff0c;对安全分析的需求空前高涨。…...

基于ipad协议的gewe框架进行微信群组管理(二)

友情链接 geweapi.com 点击访问即可。 获取群组详情 小提示&#xff1a; 该接口可以一次查询20个群组查询出来的信息是不带公告的 请求URL&#xff1a; http://域名地址/api/group/detail 请求方式&#xff1a; POST 请求头&#xff1a; Content-Type&#xff1a;applica…...

盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来

一、破局&#xff1a;PCB行业的时代之问 在数字经济蓬勃发展的浪潮中&#xff0c;PCB&#xff08;印制电路板&#xff09;作为 “电子产品之母”&#xff0c;其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透&#xff0c;PCB行业面临着前所未有的挑战与机遇。产品迭代…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

linux 错误码总结

1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

BLEU评分:机器翻译质量评估的黄金标准

BLEU评分&#xff1a;机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域&#xff0c;衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标&#xff0c;自2002年由IBM的Kishore Papineni等人提出以来&#xff0c;…...