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​​​​​​​

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

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

相关文章

【力扣周赛】第 358 场周赛

文章目录 竞赛链接Q1&#xff1a;6939. 数组中的最大数对和竞赛时代码—— O ( n 2 ) O(n^2) O(n2)解法2——一次遍历 O ( n ) O(n) O(n)&#xff0c;维护最大数位为 i 的元素的最大值 Q2&#xff1a;6914. 翻倍以链表形式表示的数字竞赛时代码——存入列表再计算解法2——只有…

R语言生存分析算法的简单组合

library(survival) library(randomForestSRC)# 生成模拟数据 set.seed(123) n <- 200 time <- rexp(n, rate 0.1) status <- rbinom(n, size 1, prob 0.7) var1 <- rnorm(n) var2 <- rnorm(n) var3 <- rnorm(n) data1 <- data.frame(time time, statu…

PLL 的 verilog 实现

锁相环&#xff08;PLL&#xff09;是一种常用的频率、相位追踪算法&#xff0c;在信号解调、交流并网等领域有着广泛的应用。本文对全数字锁相环的原理进行介绍&#xff0c;随后给出 verilog 实现及仿真。 PLL 锁相原理 锁相环结构如下图所示&#xff0c;主要由鉴相器、环路滤…

UDP通信实验、广播与组播、本地套接字

文章目录 流程函数应用广播应用 组播&#xff08;多播&#xff09;本地套接字应用 流程 函数 返回值&#xff1a; 成功&#xff0c;返回成功发送的数据长度 失败&#xff0c;-1 返回值&#xff1a; 成功&#xff0c;返回成功接收数据长度 失败&#xff0c;-1 应用 广播 应用 …

【不限于联想Y9000P电脑关盖再打开时黑屏的解决办法】

不限于联想Y9000P电脑关盖再打开时黑屏的解决办法 问题的前言问题的出现问题拟解决 问题的前言 事情发生在昨天&#xff0c;更新了Win11系统后&#xff1a; 最惹人注目的三处地方就是&#xff1a; 1.可以查看时间的秒数了&#xff1b; 2.右键展示的内容变窄了&#xff1b; 3.按…

湖南科技学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

湖南科技学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

20230815在淘宝的代扫描服务【仅供参考】

20230815在淘宝的代扫描服务【仅供参考】 2023/8/15 12:35 https://item.taobao.com/item.htm?spma21n57.1.0.0.3d47523caCFZ3T&id601206116790&ns1&abbucket4#detail e邦生活服务 https://item.taobao.com/item.htm?_ufju3ku42b4&id629900806906 寄书扫描…

奥威BI数据可视化工具:报表就是平台,随时自助分析

别的数据可视化工具&#xff0c;报表就只是报表&#xff0c;而奥威BI数据可视化工具&#xff0c;一张报表就约等于一个平台&#xff0c;可随时展开多维动态自助分析&#xff0c;按需分析&#xff0c;立得数据信息。 奥威BI是一款多维立体分析数据的数据可视化工具。它可以帮助…

JavaFx基础学习【五】:FXML布局文件使用

目录 前言 一、介绍 二、简单体验 三、FXML标签元素 四、fx属性介绍 五、重写initialize&#xff08;名字需要保持一致&#xff09;方法 六、Scene Builder快速布局 前言 如果你还没有看过前面的文章&#xff0c;可以通过以下链接快速前往学习&#xff1a; JavaFx基础学…

Vscode 常用操作教程

一、语言换成中文 这是我们可以直接点击左边栏第四个图标搜索插件 chinese ,也可以直接ctrlshiftp快捷键也会出来如图所示图标&#xff0c;出来chinese 插件之后选择安装install,安装完成之后重新ctrlshiftp会出现如图所示页面 找到我的鼠标在的地方对应的中文&#xff0c;此时…

2023国赛 高教社杯数学建模ABCDE题思路汇总分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 全国大学生数学建模…

R语言实现随机生存森林(2)

library(survival) library(randomForestSRC) help(package"randomForestSRC") #构建普通的随机生存森林 data(cancer,package"survival") lung$status<-lung$status-1 rfsrc.fit1 <- rfsrc(Surv(time, status) ~ ., lung,ntree 100,block.size 1,…

react入门到实战 学习笔记1 搭建

一、React是什么 一个专注于构建用户界面的 JavaScript 库&#xff0c;和vue和angular并称前端三大框架 React有什么特点 1- 声明式UI&#xff08;JSX&#xff09; 写UI就和写普通的HTML一样&#xff0c;抛弃命令式的繁琐实现 2- 组件化 组件是react中最重要的内容&#xf…

开学季值得买电容笔有哪些?推荐平价好用的电容笔

大多数的学生党都没有稳定的经济来源&#xff0c;因此在挑选东西时都追求着高性价比。随着iPad平板电脑的性能不断提高&#xff0c;其所具备的功能将不断增加&#xff0c;它将逐渐融入我们的生活与工作。由于电子产品的不断升级&#xff0c;软件的改进&#xff0c;使得电容笔的…

DNS部署与安全详解(下)

文章目录 前言一、指定区域解析配置二、DNS服务器对外名称显示配置三、转发器使用配置四、配置辅助&#xff08;备份&#xff09;服务器五、如何让虚拟机可以真实上网六、为DNS服务器配置别名 前言 上一篇博客我们已经在Windows server2003的虚拟机上下载了DNS软件&#xff0c;…

企业中商业智能BI,常见的工具和技术

商业智能&#xff08;Business Intelligence&#xff0c;简称BI&#xff09;数据可视化是通过使用图表、图形和其他可视化工具来呈现和解释商业数据的过程。它旨在帮助组织更好地理解和分析他们的数据&#xff0c;从而做出更明智的商业决策。 常见的商业智能数据可视化工具和技…

安卓:LitePal操作数据库

目录 一、LitePal介绍 常用方法&#xff1a; 1、插入数据&#xff1a; 2、更新数据&#xff1a; 3、删除数据&#xff1a; 4、查询数据&#xff1a; 二、LitePal的基本用法&#xff1a; 1、集成LitePal&#xff1a; 2、创建LitePal配置文件&#xff1a; 3、创建模型类…

内网ip与外网ip

一、关于IP地址 我们平时直接接触最多的是内网IP。而且还可以自己手动修改ip地址。而外网ip&#xff0c;我们很少直接接触&#xff0c;都是间接接触、因为外网ip一般都是运营商管理&#xff0c;而且是全球唯一的&#xff0c;一般我们自己是无法修改的。 内网IP和外网IP是指在…

SQL | 使用通配符进行过滤

6-使用通配符进行过滤 6.1-LIKE操作符 前面介绍的所有操作符都是通过已知的值进行过滤&#xff0c;或者检查某个范围的值。但是如果我们想要查找产品名字中含有bag的数据&#xff0c;就不能使用前面那种过滤情况。 利用通配符&#xff0c;可以创建比较特定数据的搜索模式。 …

Open3D 最小二乘拟合平面(SVD分解法)

目录 一、算法原理二、代码实现三、结果展示1、点云2、拟合结果四、优秀博客本文由CSDN点云侠原创,原文链接。爬虫网站自重。 一、算法原理 本文实现矩阵奇异值分解方法的最小二乘拟合平面。原理如下: 对于得到的 n n