Qt5下Qxlsx模块安装及使用

news2024/11/17 22:15:50

Qt5下Qxlsx模块安装及使用

  • 1. 未安装Qxlsx的程序效果
  • 2. 安装Perl(编译Qxlsx源码用)
    • 2.1 下载 ActivePerl 5.28
    • 2.2 安装 ActivePerl 5.28
  • 3. 下载并编译Qxlsx源码
    • 3.1 下载Qxlsx源码
    • 3.2 编译Qxlsx源码
  • 4. 将编译好的文件复制到Qt路径下
    • 4.1 bin 路径文件复制
    • 4.2 include 路径文件复制
    • 4.3 lib 路径文件复制
    • 4.4 mkspecs 路径文件复制
    • 4.5 大功告成!!
  • 5. 使用Qxlsx模块
    • 5.1 安装 xlsx 模块后的效果演示
    • 5.2 使用xlsx加载模板并生成Excel文件
    • 5.3 Qt xlsx官方教程
  • 6. 教程相关文件下载:
  • QT-使用QtXlsx开源库进行excel表格操作(高效稳定)
    • 1、效果预览查看
    • 2、创建线程,执行写
    • 3、 将数据写入EXCEL文件
    • 4、 程序关键代码源文件

原文链接: https://blog.csdn.net/qq_34578785/article/details/106916808?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168248777816800188589212%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168248777816800188589212&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduend~default-2-106916808-null-null.142v86insert_down28,239v2insert_chatgpt&utm_term=qxlsx&spm=1018.2226.3001.4187

本篇文章讲述了如何在windows环境下为Qt5安装Qxlsx模块,以及Qxlsx模块的简单使用。

Perl+QtXlsx下载:https://download.csdn.net/download/u014779536/12543960

示例工程下载:https://download.csdn.net/download/u014779536/12543987

1. 未安装Qxlsx的程序效果

新建一个程序,在pro文件中加入:

QT  += xlsx

在界面中添加一个按钮,设置以下槽函数:

/*
 * @brief 点击自动生成按钮
 */
void Widget::on_Btn_clicked()
{
    //![0]
    QXlsx::Document xlsx("EXCEL模板.xlsx");
    //![0]

在未安装Qxlsx模块的情况下程序会报错:
在这里插入图片描述
现在我们开始安装Qxlsx模块!

2. 安装Perl(编译Qxlsx源码用)

编译Qxlsx源码需要用到Perl5,所以先安装perl5.

2.1 下载 ActivePerl 5.28

perl5地址:https://www.perl.org/get.html

打开上面的网址,选择 ActiveState Prel
在这里插入图片描述
选择 5.28版本(点击后需要登录github,自行登录)
在这里插入图片描述
选择 Download Builds下载 exe 格式安装文件
在这里插入图片描述
下载完成:
在这里插入图片描述

2.2 安装 ActivePerl 5.28

双击安装包:
在这里插入图片描述
接受条款:
在这里插入图片描述
选择典型安装:
在这里插入图片描述
勾选以下选项:
在这里插入图片描述
开始安装:
在这里插入图片描述
等待安装完成:
在这里插入图片描述
安装完成,重启,重启,马上重启电脑:
在这里插入图片描述

3. 下载并编译Qxlsx源码

3.1 下载Qxlsx源码

下载地址:https://github.com/dbzhang800/QtXlsxWriter

选择下载zip压缩包到本地:
在这里插入图片描述
下载完成,解压:
在这里插入图片描述

3.2 编译Qxlsx源码

使用QT5打开 qtxlsx.pro
在这里插入图片描述
选择编译器
在这里插入图片描述
选择编译方式:
在这里插入图片描述
点击“ctrl+B”构建项目,注意是 构建!构建!构建! 不要“ctrl+R”运行
在这里插入图片描述
构建完成,有报错,但是不用管:
在这里插入图片描述
在这里插入图片描述
文件夹预览:
在这里插入图片描述

4. 将编译好的文件复制到Qt路径下

找到Qt安装路径:
在这里插入图片描述

4.1 bin 路径文件复制

在这里插入图片描述

4.2 include 路径文件复制

在这里插入图片描述

4.3 lib 路径文件复制

在这里插入图片描述

4.4 mkspecs 路径文件复制

复制构建目录下的 mkspecs\modules\qt_lib_xlsx.pri 到 msvc2017_64\mkspecs\modules 下:
在这里插入图片描述

4.5 大功告成!!

开心一下啊~可以使用了

5. 使用Qxlsx模块

5.1 安装 xlsx 模块后的效果演示

我们再来看一下效果,安装xlsx模块前:
在这里插入图片描述
安装xlsx模块后:
在这里插入图片描述

5.2 使用xlsx加载模板并生成Excel文件

模板文件:
在这里插入图片描述
程序界面:
在这里插入图片描述
关键代码:

/*
 * @brief 点击自动生成按钮
 */
void Widget::on_Btn_StartGenerate_clicked()
{
    //![0]
    QXlsx::Document xlsx("EXCEL模板.xlsx");
    //![0]

成功生成:
在这里插入图片描述
预览:
在这里插入图片描述

5.3 Qt xlsx官方教程

教程地址:http://qtxlsx.debao.me/
在这里插入图片描述
在这里插入图片描述

6. 教程相关文件下载:

Perl+QtXlsx下载:https://download.csdn.net/download/u014779536/12543960

示例工程下载:https://download.csdn.net/download/u014779536/12543987
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

QT-使用QtXlsx开源库进行excel表格操作(高效稳定)

原文链接:https://blog.csdn.net/u013083044/article/details/113407235?spm=1001.2101.3001.6650.9&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-113407235-blog-106916808.235%5Ev32%5Epc_relevant_default_base3&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7ERate-9-113407235-blog-106916808.235%5Ev32%5Epc_relevant_default_base3&utm_relevant_index=13

1、效果预览查看

在这里插入图片描述

2、创建线程,执行写

创建线程的目的就是为了让excel表写的动作放到后台去执行,这样的好处就是主线程只是专门负责数据的追加,不会造成主线程添加excel表数据写入的时候主线程的卡顿。

// 后台线程执行写入
void cReportThread::run()
{
	while (true)
	{
		QThread::msleep(100);

		if (m_ptr->bAppExit)
			return;

		QVariant varDev;
		if (operatorDevReport(2, varDev))
			cExcelWriter::getInstance().writeDevRunState(varDev);  // 后台执行数据写入动作
			
	}
}


// 将对象添加到链表,然后后台线程执行对象写到文档
void cReportThread::addDevReport(QVariant &var)
{
	if (var.isNull() || !var.isValid())
		return;

	operatorDevReport(1, var);
}

// 操作方法
bool cReportThread::operatorDevReport(int nType, QVariant &var)
{
	bool bRet = true;
	static QList<QVariant> varList;
	static QMutex mutex;

	mutex.lock();
	switch (nType)
	{
	case 1:  // 添加到数据链表
	{
		if (var.isNull() || !var.isValid())
			bRet = false;
		else
			varList.push_back(var);
	}break;

	case 2:  // 从数据链表获取元素,并剔除元素
	{
		if (0 == varList.size())
			bRet = false;
		else
			var = varList.takeFirst();
	}break;
	default:
		break;
	}
	mutex.unlock();

	return bRet;
} 

3、 将数据写入EXCEL文件

定义sDevReport对象,通过该对象结构进行测试数据赋值,通过获取到的数据来执行excel数据表的写入。

struct sDevReport
{
	QString strDevState = "";
	QString strBeginWork = "";
	QString strEndWork = "";
	QString strRemarks = "";
};
Q_DECLARE_METATYPE(sDevReport)

添加测试数据,写入excel表里面。

	// test data
	cWorkReport ExcelReport;
	for (int i = 0; i < 20; i++)
	{
		sDevReport dev;
		dev.strBeginWork = QString("begin-%1").arg(i);
		dev.strDevState = QString("state-%1").arg(i);
		dev.strEndWork = QString("end-%1").arg(i);
		dev.strRemarks = QString("remaks-%1").arg(i);
		ExcelReport.addDevReport(QVariant::fromValue(dev));
	}

这里是对sDevReport数据对象写入excel表的具体实现方式。

int cExcelWriter::writeDevRunState(QVariant var)
{
	sDevReport report = var.value<sDevReport>();
	QString strReportFile = QApplication::applicationDirPath() + DIR_WORK_REPORT + DIR_DEV_REPORT + "/Dev-" + m_strToday + ".xlsx";

	int nRowHeight = 15;
	int nColWidth = 25;
	if (!QFile::exists(strReportFile))
	{
		// 写入excel表头
		QStringList strTableNameList;
		strTableNameList << QString::fromLocal8Bit("状态(State)")
			<< QString::fromLocal8Bit("开始时间(Begin Work)")
			<< QString::fromLocal8Bit("结束时间(End Work)")
			<< QString::fromLocal8Bit("耗时/秒(Use Time)")
			<< QString::fromLocal8Bit("备注(Remarks)");

		QXlsx::Document xlsx(strReportFile);
		QXlsx::Format format;
		format.setFontBold(true);
		format.setPatternBackgroundColor(QColor(RGB_TABLE));   // 设置列背景颜色
		format.setFontSize(10);
		format.setHorizontalAlignment(QXlsx::Format::AlignHCenter);

		for (int i = 0; i < strTableNameList.size(); i++)
		{
			xlsx.setColumnWidth(i + 1, nColWidth);
			xlsx.setRowHeight(1, nRowHeight);
			xlsx.write(1, i + 1, strTableNameList.at(i), format);
		}

		xlsx.saveAs(strReportFile);
	}


	QXlsx::Document xlsx(strReportFile);
	int nRows = xlsx.dimension().rowCount() + 1;
	QXlsx::Format format;
	format.setHorizontalAlignment(QXlsx::Format::AlignLeft);

	// 设置行高
	xlsx.setRowHeight(nRows, nRowHeight);
	xlsx.write(nRows, 1, report.strDevState, format);
	xlsx.write(nRows, 2, report.strBeginWork, format);
	xlsx.write(nRows, 3, report.strEndWork, format);
	xlsx.write(nRows, 4, "", format);
	xlsx.write(nRows, 5, report.strRemarks, format);
	xlsx.saveAs(strReportFile);

	return 0;
}

4、 程序关键代码源文件

全部代码下载链接: https://download.csdn.net/download/u013083044/14993348

#include "ReportThread.h"
#include "QMutex"
#include <QVariant>
#include "ExcelWriter.h"
#include "ExcelStruct.h"

struct sReportThread
{
	bool bAppExit = false;
};

cReportThread::cReportThread(QObject *parent)
	: QThread(parent)
{
	m_ptr = new sReportThread;

	this->start();
}

cReportThread::~cReportThread()
{
	if (m_ptr != nullptr)
	{
		m_ptr->bAppExit = true;
		this->wait(1000);
		delete m_ptr;
	}
}

cReportThread& cReportThread::getInstance()
{
	static cReportThread instance;
	return instance;
}

// 后台线程执行写入
void cReportThread::run()
{
	while (true)
	{
		QThread::msleep(100);

		if (m_ptr->bAppExit)
			return;

		QVariant varDev;
		if (operatorDevReport(2, varDev))
			cExcelWriter::getInstance().writeDevRunState(varDev);
			
	}
}


// 将对象添加到链表,然后后台线程执行对象写到文档
void cReportThread::addDevReport(QVariant &var)
{
	if (var.isNull() || !var.isValid())
		return;

	operatorDevReport(1, var);
}

// 操作方法
bool cReportThread::operatorDevReport(int nType, QVariant &var)
{
	bool bRet = true;
	static QList<QVariant> varList;
	static QMutex mutex;

	mutex.lock();
	switch (nType)
	{
	case 1:
	{
		if (var.isNull() || !var.isValid())
			bRet = false;
		else
			varList.push_back(var);
	}break;

	case 2:
	{
		if (0 == varList.size())
			bRet = false;
		else
			var = varList.takeFirst();
	}break;
	default:
		break;
	}
	mutex.unlock();

	return bRet;
}

#include "ReportThread.h"
#include "QMutex"
#include <QVariant>
#include "ExcelWriter.h"
#include "ExcelStruct.h"

struct sReportThread
{
	bool bAppExit = false;
};

cReportThread::cReportThread(QObject *parent)
	: QThread(parent)
{
	m_ptr = new sReportThread;

	this->start();
}

cReportThread::~cReportThread()
{
	if (m_ptr != nullptr)
	{
		m_ptr->bAppExit = true;
		this->wait(1000);
		delete m_ptr;
	}
}

cReportThread& cReportThread::getInstance()
{
	static cReportThread instance;
	return instance;
}

// 后台线程执行写入
void cReportThread::run()
{
	while (true)
	{
		QThread::msleep(100);

		if (m_ptr->bAppExit)
			return;

		QVariant varDev;
		if (operatorDevReport(2, varDev))
			cExcelWriter::getInstance().writeDevRunState(varDev);
			
	}
}


// 将对象添加到链表,然后后台线程执行对象写到文档
void cReportThread::addDevReport(QVariant &var)
{
	if (var.isNull() || !var.isValid())
		return;

	operatorDevReport(1, var);
}

// 操作方法
bool cReportThread::operatorDevReport(int nType, QVariant &var)
{
	bool bRet = true;
	static QList<QVariant> varList;
	static QMutex mutex;

	mutex.lock();
	switch (nType)
	{
	case 1:
	{
		if (var.isNull() || !var.isValid())
			bRet = false;
		else
			varList.push_back(var);
	}break;

	case 2:
	{
		if (0 == varList.size())
			bRet = false;
		else
			var = varList.takeFirst();
	}break;
	default:
		break;
	}
	mutex.unlock();

	return bRet;
}

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

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

相关文章

git报错处理:ssh:connect to host github.com port 22: Connection timed out

一、背景 git 在上传、下载 文件的时候&#xff0c;报错。 报错信息&#xff1a; ssh:connect to host github.com port 22: Connection timed out 提示这个域名github.com port 的22 端口&#xff0c;链接超时。 我直接访问github.com 这个域名是可以访问的&#xff0c;pi…

python+vue 风俗文化管理系统

管理员可以根据系统给定的账号进行登录&#xff0c;登录后可以进入风俗文化管理系统对风俗文化管理所有模块进行管理。包括查看和修改自己的个人信息以及登录密码&#xff0c;用户信息等。 用户通过注册账号的登录可以在系统中查看风俗文化管理信息及对个人信息进行修改等功能。…

华为OD机试(JAVA)真题 2023(汽水瓶\随机数\进制转换)

系列文章目录 文章目录 系列文章目录前言一、 1.汽水瓶二 明明的随机数 前言 一、 1.汽水瓶 某商店规定&#xff1a;三个空汽水瓶可以换一瓶汽水&#xff0c;允许向老板借空汽水瓶&#xff08;但是必须要归还&#xff09;。 小张手上有n个空汽水瓶&#xff0c;她想知道自己最多…

git版本本地远程分支管理测试

只为搞清楚一些基本的git的本地提交、分支&#xff0c;远程分支的概念。 创建git库。 在本地首次建立一个001文件&#xff0c;首次提交到本地master&#xff0c;不提交&#xff08;push&#xff09;到远程master&#xff08;gitee&#xff09;。 add 增加001文件到库。 Git-co…

【UML建模】状态图(State Machine Diagram)

文章目录 1.概述2. 状态图的使用2.1.状态图中的元素2.2.状态图的使用案例2.3.组合状态及其使用案例 3.总结 1.概述 状态图&#xff0c;又称为状态机图&#xff0c;是一种用于描述对象的生命周期和状态转换的UML图示&#xff0c;它是一种行为图&#xff0c;用于描述对象的状态和…

Django 4.2发布,主要变化小结!

2023年4月&#xff0c;Django 4.2正式发布&#xff0c;此版本已被指定为长期支持 (LTS) 版本&#xff0c;发布3年后都会收到安全更新&#xff0c;将成为未来3年的主流版本。今天就来一起看看新版本有哪些变化吧&#xff1f; Python 兼容性 Django 4.2 支持 Python 3.8、3.9、3.…

Golang Gin 局部、全局 中间件使用

中间件 中间件是放在客户端和服务端的中间。 当你的客户端对某个接口发起一个请求&#xff0c;但是在到达接口2之前&#xff0c;这里是有一层中间件的处理。 一般常用的就是处理跨域&#xff0c;比如处理登入的验证token&#xff0c;接口返回的信息比较敏感&#xff0c;说白…

Sample语言上下文无关文法

<表达式>: <表达式>-<算术表达式>|<关系表达式>|<布尔表达式>|<赋值表达式> <算术表达式> <算术表达式> -> <算术表达式> <项> | <算术表达式> - <项>|<项> <项> -> <项>* …

为什么企业要做大规模敏捷?

背景 软件工程里一个重要的指标就是“可用的软件”&#xff0c;敏捷宣言里也同样告诉我们“工作的软件高于详尽的文档”&#xff0c;那“可用的软件”、“工作的软件”意味着什么呢&#xff1f;在我的理解里&#xff0c;可以经历用户 “千锤百炼”的软件就是一个“可用的软件”…

Linux 共享库 静态库 动态库

一、 静态库(后缀.a)&#xff1a;程序执行前&#xff08;编译&#xff09;就加入到目标程序中去了 优点&#xff1a;运行速度快&#xff0c;发布程序无需提供静态库&#xff0c;因为已经在编译到目标程序中&#xff0c;运行的时候可以直接运行&#xff0c;移植方便 缺点&…

【Java】Eclipse的安装和JDK的安装与配置教程

Java是能够跨越多平台的、可移植性高的一种面向对象的编程语言&#xff0c;其简单易学、功能强大&#xff0c;越来越多的程序员喜欢加入Java的阵营之中。 一、前言 Java具有以下功能特点&#xff1a; 跨平台性&#xff1a;Java程序可以在任何支持Java虚拟机&#xff08;JVM&am…

C. Increasing by Modulo(贪心 + 二分)

Problem - C - Codeforces Toad Zitz有一个整数数组&#xff0c;每个整数都在0到m-1的范围内。这些整数是a1,a2...an。 在一次操作中,,iz可以选择一个整数k和k个萦引1..k&#xff0c;使得1si i2. ..fiksn。然后他应该将每个选定的整数a刘j 更改为(aj 1lmodm)。整数m对于所有操作…

初识STL

长久以来&#xff0c;软件界一直希望建立一种可重复利用的东西&#xff0c;以及一种得以制造出”可重复运用的东西”的方法&#xff0c;从函数(functions)&#xff0c;类别(classes),函数库(function libraries),类别库(class libraries)、各种组件&#xff0c;从模块化设计&am…

(C语言版)力扣(LeetCode)27.移除元素三种解法分析

移除元素 题目第一种解法&#xff1a;有效值前移第二种解法&#xff1a;双指针第三种解法&#xff1a;双指针优化结语 题目 给你一个数组 nums 和一个值 val&#xff0c;你需要 原地 移除所有数值等于 val 的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空…

【C++】vector OJ练习

文章目录 1. 只出现一次的数字思路讲解AC代码 2. 杨辉三角思路讲解AC代码 3. 只出现一次的数字 III思路讲解AC代码 4. 只出现一次的数字 II思路讲解AC代码 5. 删除有序数组中的重复项思路讲解AC代码 6. 数组中出现次数超过一半的数字思路讲解AC代码 这篇文章我们来做几道vector…

Jenkins学习笔记

Jenkins学习笔记 1、基本概念 Jenkins是一个开源软件项目&#xff0c;是基于Java开发的一种持续集成工具&#xff0c;用于监控持续重复的工作&#xff0c;旨在提供一个开放易用的软件平台&#xff0c;使软件项目可以进行持续集成。 2、安装 文件包&#xff1a;https://pan.…

半监督目标检测

有监督目标检测&#xff1a; 拥有大规模带标签的数据&#xff0c;包括完整的实例级别的标注&#xff0c;即包含坐标和类别信息&#xff1b;弱监督目标检测&#xff1a; 数据集中的标注仅包含类别信息&#xff0c;不包含坐标信息&#xff0c;如图一 b 所示&#xff1b;弱半监督目…

RHCE-防火墙

目录 一、防火墙介绍 1.1、什么是防火墙 1.2、防火墙的功能&#xff1a; 1.3、linux防火墙的架构 二、iptables 2.1iptables介绍 2.2名词术语&#xff1a; 什么是容器&#xff1f; 什么是Netfilter/Iptables&#xff1f; 什么是表&#xff08;tables&#xff09;&#x…

学历到底是敲门砖还是枷锁?—探讨“孔乙己文学”热搜背后的教育话题

序言 最近&#xff0c;“孔乙己文学”一度成为网络热门话题&#xff0c;引起了不少人的讨论。其中&#xff0c;一句“学历不仅是敲门砖&#xff0c;也是我下不来的高台&#xff0c;更是孔乙己脱不下的长衫”引发了广泛共鸣&#xff0c;让人深思。 敲门砖 or 枷锁&#xff1f; 对…

黑盒测试过程中【测试方法】详解4-因果图

在黑盒测试过程中&#xff0c;有9种常用的方法&#xff1a;1.等价类划分 2.边界值分析 3.判定表法 4.正交实验法 5.流程图分析 6.因果图法 7.输入域覆盖法 8.输出域覆盖法 9.猜错法 黑盒测试过程中【测试方法】讲解1-等价类&#xff0c;边界值&#xff0c;判定表_朝一…