QT 数据导出到Excel

news2024/11/24 14:39:22

原创:QT 数据导出到Excel
在Qt自带的axcontainer模块中,我们可以使用QAxObject类来将数据保存到Excel中。Qt中将数据保存到Excel通常有两种方式:一种是以Excel格式导出,需要电脑上安装Office软件;另一种是以CSV格式导出,无需安装Office软件。这里采用第一种方式,实现了UI界面数据的展示、将数据保存到Excel以及将Excel中异常数据标记为红色等功能。

excel导出必须进行以下配置

  1. 使用vs2017开发需要进行vs工程配置
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    如果是qt开发需要在.Pro文件中加入:
QT += axcontainer 

.h文件

#pragma once

#include <QtWidgets/QMainWindow>
#include "ui_exportApplication.h"

// 加载office驱动,导入导出excel
// COM组件 OLE
#include <ActiveQt/QAxObject>
#include   <QDir>
#include   <QFile>
#include <QDateTime>
#include <QTableWidget>
#include <QString>
#include<QMainWindow>


namespace Ui {
	class exportApplication;
}

class exportApplication : public QMainWindow
{
    Q_OBJECT

public:
    exportApplication(QWidget *parent = nullptr);
    ~exportApplication();

	QDateTime begin_time;

	//槽函数
private slots:
	//显示数据框
	void data_display();

	//保存导出文件
	void SAVE_clicked();

	//数据初始化
	void dataInit();

private:
    Ui::exportApplicationClass ui;
};

.cpp

#include "exportApplication.h"
#include "ui_exportApplication.h"
#include <QtWidgets/QMainWindow>
#include <QMenu>

#include <QMessageBox>

// 打开文件
#include <QFile>
#include <QFileDialog>

// 加载office驱动,导入导出excel

#include <QAxObject>

// 文本流导出word、pdf

#include <QTextDocument>
#include <QTextCursor>
#include <QTextStream>
#include <QTextTable>

// 转为pdf类型
#include <QPdfWriter>
//防止中文乱码
#pragma execution_character_set("utf-8")

exportApplication::exportApplication(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);

	//调用数据初始化方法
	dataInit();

	//连接信号槽
	connect(ui.display, &QPushButton::clicked, this, &exportApplication::data_display);
	connect(ui.SAVE, &QPushButton::clicked, this, &exportApplication::SAVE_clicked);
}

exportApplication::~exportApplication()
{}


void exportApplication::dataInit()
{
	//设置列数
	ui.MESEXCEL->setColumnCount(3);

	//设置水平表头
	ui.MESEXCEL->setHorizontalHeaderLabels(QStringList() << tr("个数") << tr("系统时间") << tr("数据"));

	//设置每列的列宽
	ui.MESEXCEL->setColumnWidth(0, 100);
	ui.MESEXCEL->setColumnWidth(1, 120);
	ui.MESEXCEL->setColumnWidth(2, 100);

	//设置固定宽度
	ui.MESEXCEL->setFixedWidth(500);

	//是否自动拉伸
	ui.MESEXCEL->horizontalHeader()->setStretchLastSection(true);

	//qt页面数据禁止编辑
	ui.MESEXCEL->setEditTriggers(QAbstractItemView::NoEditTriggers);

	//选择行为为整行选择
	ui.MESEXCEL->setSelectionBehavior(QAbstractItemView::SelectRows);

	//设置表头样式
	ui.MESEXCEL->horizontalHeader()->setStyleSheet("QHeaderView::section{background:rgb(0,0,0);color: white;}");

	//显示网格线
	ui.MESEXCEL->setShowGrid(true);

	//设置qt页面单元格样式
	ui.MESEXCEL->setStyleSheet("QTableWidget::Item{border:0px solid rgb(255,255,255);"
		"border-bottom:1px solid rgb(227,23,13);}");

	//隐藏垂直表头
	QHeaderView* headerView = ui.MESEXCEL->verticalHeader();
	headerView->setHidden(true);
}

void exportApplication::data_display()
{
	//获取当前时间
	begin_time = QDateTime::currentDateTime();
	//将时间格式化为小时:分钟:秒.毫秒的格式
	QString strtime = begin_time.toString("HH:mm:ss.zzz");

	//rand生成随机数
	QString data = QString("%1").arg(rand());

	//获取表格行数
	int nCount = ui.MESEXCEL->rowCount();

	//在末尾插入一行
	ui.MESEXCEL->insertRow(nCount);

	//将int转换为string
	QString strnCount = QString::number(nCount);
	QTableWidgetItem  *Hutem0 = new QTableWidgetItem;

	Hutem0->setText(strnCount);
	//指定内容放置位置
	ui.MESEXCEL->setItem(nCount, 0, Hutem0);
	//文本居中对齐
	ui.MESEXCEL->item(nCount, 0)->setTextAlignment(Qt::AlignCenter);

	QTableWidgetItem  *Hutem1 = new QTableWidgetItem;
	Hutem1->setText(strtime);
	ui.MESEXCEL->setItem(nCount, 1, Hutem1);
	ui.MESEXCEL->item(nCount, 1)->setTextAlignment(Qt::AlignCenter);

	QTableWidgetItem  *Hutem2 = new QTableWidgetItem;
	Hutem2->setText(data);
	ui.MESEXCEL->setItem(nCount, 2, Hutem2);
	ui.MESEXCEL->item(nCount, 2)->setTextAlignment(Qt::AlignCenter);

}

void exportApplication::SAVE_clicked()
{
	//保存用户选择的文件导出路径
	//对话框的标题设置为“Excle file”
	//默认的文件名和路径是"./test.xlsx"。
	//	文件过滤器设置为只显示Excel文件(*.xlsx)。

	QString fileName = QFileDialog::getSaveFileName(this, tr("Excle file"), QString("./test.xlsx"), tr("Excel Files(*.xlsx)"));
	if (!fileName.isEmpty())
	{
		//创建一个新的Excel应用程序实例
		QAxObject *excel = new QAxObject;

		//setControl设置控件类型为Excel应用程序
		if (excel->setControl("Excel.Application"))
		{
			//设置excel应用程序不可见
			excel->dynamicCall("SetVisible (bool Visible)", false);

			//关闭excel的显示警告
			excel->setProperty("DisplayAlerts", false);

			//获取工具薄集合
			QAxObject *workbooks = excel->querySubObject("WorkBooks");

			//添加一个新的工作簿
			workbooks->dynamicCall("Add");

			//获取当前活动的工作簿
			QAxObject *workbook = excel->querySubObject("ActiveWorkBook");

			//获取工作薄第一个工作表
			QAxObject *worksheet = workbook->querySubObject("Worksheets(int)", 1);
			QAxObject *cell;

			//获取行数
			int rowCount = ui.MESEXCEL->rowCount();

			//获取列数
			int columnCount = ui.MESEXCEL->columnCount();
			for (int i = 1; i <= columnCount; i++)
			{
				//遍历第一行的每个单元格,设置其行高为40
				cell = worksheet->querySubObject("Cells(int,int)", 1, i);
				cell->setProperty("RowHeight", 40);
				cell->dynamicCall("SetValue(const QString&)", ui.MESEXCEL->horizontalHeaderItem(i - 1)->data(0).toString());
			}
			for (int j = 2; j <= rowCount + 1; j++)
			{
				for (int k = 1; k <= ui.MESEXCEL->columnCount(); k++)
				{

					cell = worksheet->querySubObject("Cells(int,int)", j, k);
					cell->dynamicCall("SetValue(const QString&)", ui.MESEXCEL->item(j - 2, k - 1)->text() + "\t");

					int value = ui.MESEXCEL->item(j - 2, 2)->text().toInt();
					if (value > 20000) //大于20000标红
					{
						//查询单元格的内部对象,用于修改其样式
						QAxObject*interior = cell->querySubObject("Interior");
						interior->setProperty("Color", QColor(Qt::red));
					}
				}
			}

			//保存excel
			workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName));

			//关闭excel
			workbook->dynamicCall("Close()");
			excel->dynamicCall("Quit()");

			//清理资源
			delete excel;
			excel = NULL;
		}
	}
}

ui
在这里插入图片描述
导出文件格式
在这里插入图片描述
效果截图
在这里插入图片描述

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

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

相关文章

用户端是小程序,后台管理系统是PC端的CMS系统

1. 数据库表设计 1.1 课程轮播图表 CREATE TABLE course_banners (id int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 轮播图主键,image_url varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 轮播图图片链接,title varchar(255) CHARAC…

高考志愿智能推荐系统-计算机毕设Java|springboot实战项目

&#x1f34a;作者&#xff1a;计算机毕设残哥 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目、 源…

Lesson 64 Don‘t ... You mustn‘t ...

Lesson 64 Don’t … You mustn’t … 词汇 play n. 戏剧&#xff08;真人演的&#xff0c;话剧&#xff09;v. 玩耍 搭配&#xff1a;play with 物体 / 人    玩…… / 和……一起玩 例句&#xff1a;我正在和Leo玩。    I am playing with Leo.演奏&#xff08;乐器…

代码随想录算法训练营第十六天

力扣题部分: 513.找树左下角的值 题目链接:. - 力扣&#xff08;LeetCode&#xff09; 题面: 给定一个二叉树的 根节点 root&#xff0c;请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 思路(层序遍历): 应该是这道题最简单的方法了&#xff0…

数据结构与算法——DFS(深度优先搜索)

算法介绍&#xff1a; 深度优先搜索&#xff08;Depth-First Search&#xff0c;简称DFS&#xff09;是一种用于遍历或搜索树或图的算法。这种算法会尽可能深地搜索图的分支&#xff0c;直到找到目标节点或达到叶节点&#xff08;没有子节点的节点&#xff09;&#xff0c;然后…

Vue3 reactive 响应式原理源码实现

学习小满的视频&#xff0c;更详细的讲解 Vue3响应式原理 视频 需要了解Proxy、Reflect函数 目录结构&#xff1a; 配置环境&#xff1a; package.json {"name": "vue-reactive","version": "1.0.0","description": &quo…

【Kubernetes】Service 类型

Service 类型 1.NodePort2.ClusterlP3.LoadBalance4.ExternalName 在《Service 概念与实战》一文中&#xff0c;Service 的发布使用的是 NodePort 类型。除此之外&#xff0c;Service 的发布还支持 ClusterlP、LoadBalancer 和 ExternalName 这 3 种类型。 1.NodePort 在把 Se…

基于STM32开发的智能门铃系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 系统初始化按钮与蜂鸣器控制显示与远程通知Wi-Fi通信应用场景 家庭智能门铃办公室访客通知常见问题及解决方案 常见问题解决方案结论 1. 引言 智能门铃系统通过集成按钮、蜂鸣器、显示屏、W…

HTML补充——表格表单

一、表格 1、在现实生活中&#xff0c;我们经常需要使用表格来表示一些格式化数据&#xff1a;课程表、人名表、成绩单 同样在网页中我们也需要使用表格&#xff0c;我们通过table标签创建表格。 2、在table标签中使用tr表示表格中的一行&#xff0c;有几个tr就有几行&#xff…

prometheus数据如何清理

1. 停止prometheus服务 2. 进到prometheus数据目录 3. 删除数据 3.1 删除持久化的数据块 Prometheus 将数据分块存储&#xff0c;每个块对应一个时间段。你可以通过查看目录中的时间戳来找到需要删除的数据块。 每个块的目录名是一个时间戳范围&#xff0c;例如 16094592000…

单片机在线升级架构(bootloader+app)

1、架构&#xff08;bootloaderapp) 在一定的时间内如果没有程序需要更新则自动跳转到app地址执行用户程序 内部flash 512K bootloader 跑裸机 48k 主要实现USB升级和eeprom标志位升级 app 跑freeRtos 464K 程序的基本功能&#xff0c;升级时软件复位开始执行bootloader升级…

互斥锁以及进程间通信

写线程 ---写资源 可以写数据 的条件 1.开始时 &#xff0c;buf空的 2.读线程 读完了 读线程 //buf充当读资源 //1.一开始&#xff0c;buf中没有数据可读的 1.写线程结束 信号量的机制 1.信号量 ----来描述 可使用的资源的个数 2.p操作 表示 使用这个资源 资…

毕业生实习与就业管理系统的设计与实现

TOC springboot297毕业生实习与就业管理系统的设计与实现 绪论 1.1 研究背景 现在大家正处于互联网加的时代&#xff0c;这个时代它就是一个信息内容无比丰富&#xff0c;信息处理与管理变得越加高效的网络化的时代&#xff0c;这个时代让大家的生活不仅变得更加地便利化&a…

保存数据至后台表

保存数据至后台表-供大数据平台使用-JOB程序 *&---------------------------------------------------------------------* *&程序名称 &#xff1a;ZBD_JOB_001 *&程序描述 : 保存数据至后台表-供大数据平台使用-JOB程序 *…

[Linux] 什么是 Shell?

一、什么是 shell ? shell在英语中的意思就是外壳&#xff0c;所以我们习惯称shell程序为壳程序。那为什么又会被叫做壳程序呢&#xff1f;那是因为shell程序是在内核上面的&#xff0c;属于操作系统的外壳部分&#xff0c;因此我们就称之为壳程序(shell)。 在 Linux 中&#…

增材制造正在加速赋能模具产业转型升级

模具&#xff0c;作为制造业的基石&#xff0c;正随着经济的蓬勃发展与产业的深度转型而面临更高要求。特别是注塑模具的冷却系统&#xff0c;传统工艺在面对随形冷却水路时显得力不从心&#xff0c;导致冷却效率无法进一步提升。而3D打印技术的崛起&#xff0c;则为模具领域开…

财务会计与管理会计(七)

文章目录 电商快递费用计算IF、VLOOKUP函数的应用 交费分布统计表SUMPRODUCT函数的应用 考勤签到统计系统OFFSET、MATCH函数的应用 出入库余额自动核算系统SUMPRODUCT、LOOKUP函数的应用 分段收费的典型案例VLOOKUP函数、MIN函数、MAX函数的应用 全额累进与超额累进计算提成全额…

《走走停停》,观后感

他这辈子看起来&#xff0c;好像就不是很成功。但是我们都很怀念这个人。 我们的文化太过强调永远&#xff0c;并把“永远”和“成功”牢牢捆绑了起来。 比如你开了一家咖啡店&#xff0c;这家店给你带来了很多快乐。但后来成本变高了&#xff0c;经营压力也变大了&#xff0…

求个位数(c语言)

1./描述 //给你一个数&#xff0c;让他进行巴啦啦能量&#xff0c;沙鲁沙鲁&#xff0c;小魔仙大变身&#xff0c;如果进行变身的数不满足条件的话&#xff0c;就继续让他变身。。。直到满足条件为止。 //巴啦啦能量&#xff0c;沙鲁沙鲁&#xff0c;小魔仙大变身&#xff1a;对…

2024/8/15 英语每日一段

A new Google update will make it simpler to request the removal of fake explicit images, as public figures, teachers and ordinary people increasingly contend with targeted abuse in the form of “deepfakes,” or realistic-looking images made with AI. While …