qtxlsx 学习

2024-03-27 18:20
文章标签 学习 qtxlsx

本文主要是介绍qtxlsx 学习,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介:

QXlsx是一个可以读写Excel文件的库。不依赖office以及wps组件,可以在Qt5支持的任何平台上使用。

QXlsx和QAxObject 比较

QAxObject使用需要系统中安装了offie或wps,这种方法不推荐使用;

因为如果安装了wps,可能部分功能用不了;

同时安装了office、wps在使用时可能有问题;

或者电脑里安装了一些pdf阅读器则直接不能使用了;

QXlsx不依赖于系统环境,使用时打开excel文件将所有数据读入内存,然后就关闭文件了,也不存在文件被占用的情况。

下载QtXlsx

下载地址:GitHub - dbzhang800/QtXlsxWriter: .xlsx file reader and writer for Qt5

该代码可以同时在windows和linux系统上使用。整个安装包QtXlsxWriter-master如下:

使用QtXlsx

windows平台

有2种办法使用QtXlsx,一种是QtXlsx源码嵌入QTCreator中使用,第二种是把QtXlsx编译成lib、dll库使用。

环境:windows10 + QT5.15.2

QtXlsx源码嵌入QTCreator中使用
  1. 新建一个QTCreator对话框项目test1xlsx,其代码目录结构如下

  1. 在test1xlsx的pro文件添加xlsx的pri信息,如下

include($$PWD/../QtXlsxWriter-master/src/xlsx/qtxlsx.pri)

  1. 编写调用qtxlsx函数代码

    QXlsx::Document xlsx;

    xlsx.write(1, 2, "Hello Qt!");

    xlsx.write(2, 2, "中文");

xlsx.saveAs("Text.xlsx");

QtXlsx源码编译成为.lib库使用
需要先下载安装Perl

下载链接:Strawberry Perl for Windows

可以选择下载32bit或者64位的,这里我下载strawberry-perl-5.32.1.1-32bit.msi

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

编译QtXlsx源码

打开下载的QtXlsx文件夹,使用qt打开qtxlsx.pro.直接编译。在构建目录下得到include、lib、bin的目录文件。

使用QtXlsx库
  1. 新建qt项目testxlsx。

Code目录为testxlsx项目源码,xlsx为新建目录,包含include、lib文件夹。

  1. 拷贝include文件

把qtxlsx项目构建的include文件夹拷贝过来,但include文件夹的头文件都是引用qtxlsx项目src的头文件,所以直接把qtxlsx项目的src\xlsx目录上的.h文件拷贝到include文件夹覆盖原有的(总共16个)。

把qtxlsx项目的src\xlsx目录上的_p.h文件拷贝到include文件夹\QtXlsx\0.3.0\QtXlsx\private目录下覆盖原有的(总共27个)

  1. 拷贝lib文件

把qtxlsx项目构建的lib文件夹的lib文件拷贝到\xlsx\lib过来,

  1. 拷贝dll文件

把qtxlsx项目构建的bin文件夹的dll文件拷贝到\bin\debug过来,

  1. 在测试项目testxlsx的pro配置头文件、lib库

INCLUDEPATH += $$PWD/../xlsx/include/QtXlsx

CONFIG(debug, debug|release) {

    #指定生成的应用程序放置的目录

    DESTDIR += $$PWD/../bin/debug/

    LIBS += -L$$PWD/../xlsx/lib/  -lQt5Xlsxd

} else {

    #指定生成的应用程序放置的目录

    DESTDIR += $$PWD/../bin/release/

    LIBS += -L$$PWD/../xlsx/lib/  -lQt5Xlsx

}

  1. 编码调用xlsx,直接引用#include <QtXlsx>即可。

void Dialog::on_pushButton_clicked()

{

    QXlsx::Document xlsx;//只处理当前的sheet页,默认为第一页。

    QString strsheetName = xlsx.currentSheet()->sheetName();

    xlsx.renameSheet(strsheetName,"1");

    xlsx.write(1, 2, "Hello Qt!");

    xlsx.write(1, 1, 1);

    xlsx.write(2, 1, 2);

    xlsx.write(3, 1, 3);

    xlsx.write(4, 1, 4);

    xlsx.defineName("Factor", "=2");

    xlsx.defineName("Cell_1", "=1!$A$1:$A$4");    // A1-A4命名为Cell_1

    xlsx.write(5, 1, "=SUM(Cell_1)");

    xlsx.write(6, 1, "=SUM($A$1:$A$4)");

    xlsx.write(7, 1, "=SUM(Cell_1)*Factor");

    xlsx.addSheet("2");

    QXlsx::Format format;

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

    xlsx.write(2, 2, "中文",format);

    xlsx.setRowHeight(4, 50);

    xlsx.setColumnWidth(3, 100);

    xlsx.mergeCells("G4:L6");

    QXlsx::CellRange cells(3,3,5,5);

    xlsx.mergeCells(cells);

    xlsx.saveAs("Text.xlsx");

}

void Dialog::on_pushButton_2_clicked()

{

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

    QStringList sheetList = xlsx.sheetNames();

    QString strsheetName;

    foreach (auto var, sheetList)

    {

        if(var == "2")

            strsheetName ="2";

    }

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

    int nsheetCount = wb->sheetCount();

    QString strtext1 = xlsx.read(1,2).toString();

    xlsx.selectSheet(strsheetName);

    QXlsx::Worksheet *workSheet = static_cast<QXlsx::Worksheet*>(wb->sheet(1));

    int row1 = xlsx.dimension().rowCount();

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

    int col1 = xlsx.dimension().columnCount();

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

    QString strtext2 = xlsx.read(2,2).toString();

    xlsx.unmergeCells("G4:L6");

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

    QString strtext3 = xlsx.read(1,2).toString();

    QString strtext4 = xlsx.read(2,2).toString();

}

Linux平台

环境:麒麟桌面版 +  qt5.12.2

QtXlsx源码嵌入QTCreator中使用

在linux平台上也可以直接拿qtxlsx源码直接在项目上使用。

在测试项目test1xlsx的pro文件添加配置,调用方法和上面windows一样。

include($$PWD/../QtXlsxWriter-master/src/xlsx/qtxlsx.pri)

QtXlsx源码编译成为so库使用
编译QtXlsx源码

在linux系统上无lib文件的,只有生成so文件。直接使用qt编译qtxlsx项目即可。

使用QtXlsx库

和windows一样的使用办法。

区别是:

1.在编译测试项目textxlsx遇到错误GL/gl.h: No such file or directory。解决办法是:

sudo apt-get install mesa-common-dev

sudo apt-get install libgl1-mesa-dev libglu1-mesa-dev

2.头文件的QtXlsx的文件#include <QtXlsx/QtXlsxDepends>需改成#include <QtXlsxDepends>

QtXlsx常用函数

  1. 定义

QXlsx::Document xlsx;

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

  1. 往单元格中写入数据

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

  1. 读取单元格中的数据

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

  1. 设置行高

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

  1. 设置列宽

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

  1. 设置单元格样式

QXlsx::Format format;

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

xlsx.write(2, 2, "中文",format);

  1. 合并单元格

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

  1. 取消合并

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

  1. 添加工作表

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

  1. 工作表重命名

xlsx.workbook()->renameSheet(1, "sheet_3");       

  1. 选择当前工作表

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

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

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

  1. 获取工作簿对象

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

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

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

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

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

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

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

  1.  保存

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

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

  1.  赋值

xlsx.defineName("Factor", "=0.5");         // 将0.5赋值给Factor,相当于变量赋值一样

  1. 使用公式

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)单元格中

这篇关于qtxlsx 学习的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852984

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个