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

Qt 使用QAxObject将QTableView数据导出到Excel表格

这是我记录Qt学习过程的第6篇心得文章,主要是方便自己编写的应用程序导出Excel数据的,走了不少弯路直接上代码。

实现代码:
//人员信息导出
ui->pbtn2->setEnabled(false);
// 打开文件对话框,选择 excel文件
QString fileName = QFileDialog::getSaveFileName(this, "人员信息导出", "personnel", "excel文件(*.xlsx)");
if (fileName.isEmpty()) return;
this->fun_statusBar("人员信息导出 " + fileName);// 创建Excel应用程序对象
QAxObject *excel = new QAxObject("Excel.Application");
if (!excel->isNull())
{this->fun_statusBar("人员信息导出 创建Excel对象成功!");excel->setProperty("Visible", false);  //设置为false以在后台运行// excel->setProperty("SetVisible(bool)", false);  //设置为false以在后台运行// 新建工作簿QAxObject *workbooks = excel->querySubObject("Workbooks");this->fun_statusBar("人员信息导出 新建Excel工作簿成功!");// 添加一个工作簿QAxObject *workbook = workbooks->querySubObject("Add");this->fun_statusBar("人员信息导出 添加Excel工作簿成功!");QAxObject *worksheets = workbook->querySubObject("Worksheets");// 获取第一个工作簿// QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1);QAxObject *worksheet = workbook->querySubObject("WorkSheets(int)", 1);this->fun_statusBar("人员信息导出 打开Excel获取第一个工作表成功!");// 设置工作表标题worksheet->setProperty("Name", "personnel");// 获取表格数据模型 根据自己表格使用的数据模型更改为 QAbstractItemModel获其他QSqlRelationalTableModel *itemModel = qobject_cast<QSqlRelationalTableModel *>(ui->tableView->model());if (itemModel){this->fun_statusBar("人员信息导出 打开数据表成功!");int rowCount = itemModel->rowCount();int colCount = itemModel->columnCount();QString str = "";// 写入表头for (int col = 1; col <= colCount; ++col){QString data = itemModel->headerData(col - 1, Qt::Horizontal).toString();QAxObject *cell = worksheet->querySubObject("Cells(int,int)", 1, col);cell->setProperty("Value", data);str += data + " ";// 设置文字格式QAxObject *range = cell->querySubObject("Characters()");QAxObject *font = range->querySubObject("Font");font->setProperty("Name", "黑体");                // 字体名称font->setProperty("Size", 12);                    // 字体大小font->setProperty("Color", 0x000000);             // 字体颜色(蓝色)cell->setProperty("HorizontalAlignment", -4108);  // 水平居中cell->setProperty("VerticalAlignment", -4108);    // 垂直居中//设置列宽QAxObject *column = worksheet->querySubObject("Columns(int)", col + 1);int columnWidth{};switch (col){case 0:case 2:case 3:columnWidth = 10;break;case 7:columnWidth = 12;break;case 8:columnWidth = 50;break;case 11:case 12:columnWidth = 14;break;default:columnWidth = 20;break;}column->setProperty("ColumnWidth", columnWidth);  // 设置每列的宽度根据实际自己调整delete font;delete range;delete column;delete cell;}qDebug() << "人员信息导出:表头写入 " + str << Qt::endl;// 写入数据for (int row = 2; row <= rowCount; ++row){str = "";for (int col = 1; col <= colCount; ++col){QVariant data = itemModel->index(row - 2, col - 1).data();QAxObject *cell = worksheet->querySubObject("Cells(int,int)", row, col);// 前缀单引号以确保作为文本处理if (data.toString().length() == 18 && data.toString().contains(QRegExp("\\d{18}"))){// 检查是否是身份证号(假设身份证号是18位数字)cell->dynamicCall("SetValue(const QVariant&)", QString("'") + data.toString());}else if (data.toString().length() == 11 && data.toString().contains(QRegExp("\\d{11}"))){// 检查是否是手机号码(假设手机号码是11位数字)cell->dynamicCall("SetValue(const QVariant&)", QString("'") + data.toString());}else{cell->dynamicCall("SetValue(const QVariant&)", data.toString());}// 设置单元格格式为文本cell->setProperty("NumberFormat", "@");           // "@" 表示文本格式cell->setProperty("HorizontalAlignment", -4108);  // 水平居中cell->setProperty("VerticalAlignment", -4108);    // 垂直居中str += data.toString() + " ";delete cell;}qDebug() << "人员信息导出:数据写入 " + str << Qt::endl;}this->fun_statusBar("人员信息导出 数据表数据写入成功!");// 保存工作簿if (!workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(fileName)).toBool()){skysonya.messageBox("warning", wTitle, "保存Excel文件失败!");}}else{skysonya.messageBox("warning", wTitle, "打开数据表失败!");}// 关闭工作簿workbook->dynamicCall("Close (bool)", false);// 退出Excel应用程序excel->dynamicCall("Quit()");// 清理对象delete worksheet;delete worksheets;delete workbook;delete workbooks;delete excel;
}
else
{skysonya.messageBox("warning", wTitle, "创建Excel对象失败!");
}
ui->pbtn2->setEnabled(true);
this->fun_statusBar()为自己构建的函数,代码如下:
//状态栏信息显示
void MainWindow::fun_statusBar(QString str)
{str = " 提示信息:" + str;this->statusBar()->showMessage(str);qDebug() << str << Qt::endl;
}

skysonya.messageBox()函数前文中已有介绍。

相关文章:

Qt 使用QAxObject将QTableView数据导出到Excel表格

这是我记录Qt学习过程的第6篇心得文章&#xff0c;主要是方便自己编写的应用程序导出Excel数据的&#xff0c;走了不少弯路直接上代码。 实现代码&#xff1a; //人员信息导出 ui->pbtn2->setEnabled(false); // 打开文件对话框&#xff0c;选择 excel文件 QString fil…...

fastGpt

参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的&#xff0c;ollama由1.5G&#xff0c;还是比较大&#xff0c;所有采用在windows下下载&#xff0c;然后安装的方式&#xff0c;linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…...

如何全方位应对服务可用性的挑战

在数字化转型的浪潮中&#xff0c;运维团队正站在企业IT架构的核心位置&#xff0c;面对着前所未有的挑战。服务响应时间和失败率&#xff0c;作为衡量服务质量的重要指标&#xff0c;一直备受关注。然而&#xff0c;在追求这两项指标优化的同时&#xff0c;运维团队还需关注其…...

二进制方式部署k8s集群

目标任务: 1、Kubernetes集群部署架构规划 2、部署Etcd数据库集群 3、在Node节点安装Docker 4、部署Flannel网络插件 5、在Master节点部署组件(api-server,schduler,controller-manager) 6、在Node节点部署组件(kubelet,kube-proxy) 7、查看集群状态 8、运行⼀个测…...

Vivado时序报告七:Report Clock NetworkReport Clock Interaction详解

目录 一、前言 二、Report Clock Network 2.1 Report Clock Network流程 2.2 Report Clock Network报告 三、Report Clock Interaction 3.1 示例设计 3.2 配置选项 3.2.1 Options 3.2.2 Timer_Settings 3.3 Clock Interaction报告 3.3.1 Clock Pair Classification …...

HarmonyOS 组件样式@Style 、 @Extend、自定义扩展(AttributeModifier、AttributeUpdater)

1. HarmonyOS Style 、 Extend、自定义扩展&#xff08;AttributeModifier、AttributeUpdater&#xff09; Styles装饰器&#xff1a;定义组件重用样式   ;Extend装饰器&#xff1a;定义扩展组件样式   自定义扩展&#xff1a;AttributeModifier、AttributeUpdater 1.1. 区…...

信息安全工程师(73)网络安全风险评估过程

一、确定评估目标 此阶段需要明确评估的范围、目标和要求。评估目标通常包括特定的网络系统、信息系统或网络基础设施&#xff0c;评估范围可能涉及整个组织或仅特定部门。明确评估要求有助于确保评估过程的针对性和有效性。 二、收集信息 在评估开始之前&#xff0c;需要对目标…...

在MacOS玩RPG游戏 - RPGViewerPlus

背景知识 由于我一直使用Mac电脑&#xff0c;所以一直对Mac如何玩RPGMV/RPGMZ游戏的方式有进一步的想法。 网上能给出的方案都是自行启动一个HTTP服务进行&#xff0c;进行服务加载。这个方法有效&#xff0c;但兼容性较差。涉及到自定义功能模块的游戏&#xff0c;都会有报错…...

2024.10.27 直接插入排序 非递归后序遍历(复杂版)

直接插入排序 思路&#xff1a;用temp变量存放需要插入前面有序序列的变量&#xff0c;然后用里面的那个for循环寻找到需要插入的位置。 额外注意的点&#xff1a;arr[j1]temp;这个是因为内置循环每次出来之后所指向的位置是我们要插入的位置的前一个&#xff08;-1或者插入…...

Ubuntu 22.04系统启动时自动运行ROS2节点

在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境&#xff1a;Ubuntu 系统&#xff0c;ROS2 Humble&#xff0c;使用系统自带的 启动应用程序 目标&#xff1a;在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后&#xff0c;自动运行小乌龟节点和键盘控制节点。 实践…...

张三进阶之路 | 基于Spring AOP的Log收集

前情提要 &#x1f4cc; 张三对于公司的日志处理系统不满意&#xff0c;认为其性能不佳且功能有限。为了展示自己的能力和技术实力&#xff0c;他决定利用Spring AOP&#xff08;面向切面编程&#xff09;开发一个更高效的日志处理系统&#xff0c;并将其存储在Redis中。 首先…...

ubuntu新装ubuntu,重启黑屏

现象&#xff1a;双系统电脑向移动硬盘安装Ubuntu系统后&#xff0c;重启黑屏并显示Minimal BASH-like line editing is supported. For the first word, TAB lists possible command completions. Anywhere else TAB lists possible device or file completions. 又拔下无法启…...

太极安全监控系统0.8

完善后的代码及功能详细介绍 完善后的代码 python import os import sys import subprocess import re import datetime import threading import tkinter as tk from tkinter import messagebox, simpledialog, ttk import scapy.all as scapy import whois import numpy as …...

E-清楚姐姐的布告规划【01背包】

就当一个01背包写就行&#xff0c;只不过需要保证不交叉&#xff0c;w[i]覆盖i点&#xff0c;用一个if来判断即可 #include<bits/stdc.h> #define int long long using namespace std; int w[5005]; int f[5005]; int t,n,m; signed main() {cin>>t;while(t--){…...

哪款宠物空气净化器噪音低?希喂、美的、安德迈测评分享

今年双11&#xff0c;宠物空气净化器到底应该如何选&#xff1f;在所有的家电品类里&#xff0c;宠物空气净化器算是比较特殊的那个&#xff0c;产品迭代太快&#xff0c;我们把今年双11在售的各大主流品牌的宠物空气净化器统一汇总整理&#xff0c;发现基本一多半都是24年下半…...

2024年10月23日第一部分

1.马小民要不要承担责任 2.主动 我就是那种平常沉默寡言孤僻内向自卑又宅又无趣&#xff0c;感觉不管在哪里都是比较边缘不合群的人。6月份遇到一个女生&#xff0c;还是人家主动加的我&#xff0c;断断续续聊了一个月就没下文了&#xff0c;可能我没谈过恋爱吧&#xff0c;快…...

医院信息化与智能化系统(9)

医院信息化与智能化系统(9) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应的…...

逻辑回归与神经网络

从逻辑回归开始学习神经网络 神经网络直观上解释&#xff0c;就是由许多相互连接的圆圈组成的网络模型&#xff1a; 而逻辑回归可以看作是这个网络中的一个圆圈&#xff1a; 圆圈被称为神经元&#xff0c;整个网络被称为神经网络。 本节的任务是我们究竟如何理解具体的一个神…...

隨筆 20241024 Kafka 数据格式解析:批次头与数据体

Kafka作为分布式流处理平台&#xff0c;以其高吞吐量、可扩展性和强大的数据传输能力&#xff0c;成为了现代大数据和实时处理的核心组件之一。在Kafka中&#xff0c;数据的存储和传输遵循一种高效的结构化格式&#xff0c;主要由 批次头&#xff08;Batch Header&#xff09;和…...

【WiFi7】 支持wifi7的手机

数据来源 Smartphones with WiFi 7 - list of all latest phones 2024 Motorola Moto X50 Ultra 6.7" 1220x2712 Snapdragon 8s Gen 3 16GB RAM 1024 GB 4500 mAh a/b/g/n/ac/6e/7 Sony Xperia 1 VI 6.5" 1080x2340 Snapdragon 8 Gen 3 12GB RAM 512 G…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

虚拟电厂发展三大趋势:市场化、技术主导、车网互联

市场化&#xff1a;从政策驱动到多元盈利 政策全面赋能 2025年4月&#xff0c;国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》&#xff0c;首次明确虚拟电厂为“独立市场主体”&#xff0c;提出硬性目标&#xff1a;2027年全国调节能力≥2000万千瓦&#xff0…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...

恶补电源:1.电桥

一、元器件的选择 搜索并选择电桥&#xff0c;再multisim中选择FWB&#xff0c;就有各种型号的电桥: 电桥是用来干嘛的呢&#xff1f; 它是一个由四个二极管搭成的“桥梁”形状的电路&#xff0c;用来把交流电&#xff08;AC&#xff09;变成直流电&#xff08;DC&#xff09;。…...

规则与人性的天平——由高考迟到事件引发的思考

当那位身着校服的考生在考场关闭1分钟后狂奔而至&#xff0c;他涨红的脸上写满绝望。铁门内秒针划过的弧度&#xff0c;成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定"&#xff0c;构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...

【实施指南】Android客户端HTTPS双向认证实施指南

&#x1f510; 一、所需准备材料 证书文件&#xff08;6类核心文件&#xff09; 类型 格式 作用 Android端要求 CA根证书 .crt/.pem 验证服务器/客户端证书合法性 需预置到Android信任库 服务器证书 .crt 服务器身份证明 客户端需持有以验证服务器 客户端证书 .crt 客户端身份…...