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篇心得文章,主要是方便自己编写的应用程序导出Excel数据的,走了不少弯路直接上代码。 实现代码: //人员信息导出 ui->pbtn2->setEnabled(false); // 打开文件对话框,选择 excel文件 QString fil…...
fastGpt
参考本地部署FastGPT使用在线大语言模型 1 rockylinx 1 ollama安装 在rockylinux中安装的,ollama由1.5G,还是比较大,所有采用在windows下下载,然后安装的方式,linux安装 tar -C /usr -xzf ollama-linux-amd64.tgz #…...
如何全方位应对服务可用性的挑战
在数字化转型的浪潮中,运维团队正站在企业IT架构的核心位置,面对着前所未有的挑战。服务响应时间和失败率,作为衡量服务质量的重要指标,一直备受关注。然而,在追求这两项指标优化的同时,运维团队还需关注其…...
二进制方式部署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、自定义扩展(AttributeModifier、AttributeUpdater) Styles装饰器:定义组件重用样式 ;Extend装饰器:定义扩展组件样式 自定义扩展:AttributeModifier、AttributeUpdater 1.1. 区…...
信息安全工程师(73)网络安全风险评估过程
一、确定评估目标 此阶段需要明确评估的范围、目标和要求。评估目标通常包括特定的网络系统、信息系统或网络基础设施,评估范围可能涉及整个组织或仅特定部门。明确评估要求有助于确保评估过程的针对性和有效性。 二、收集信息 在评估开始之前,需要对目标…...
在MacOS玩RPG游戏 - RPGViewerPlus
背景知识 由于我一直使用Mac电脑,所以一直对Mac如何玩RPGMV/RPGMZ游戏的方式有进一步的想法。 网上能给出的方案都是自行启动一个HTTP服务进行,进行服务加载。这个方法有效,但兼容性较差。涉及到自定义功能模块的游戏,都会有报错…...
2024.10.27 直接插入排序 非递归后序遍历(复杂版)
直接插入排序 思路:用temp变量存放需要插入前面有序序列的变量,然后用里面的那个for循环寻找到需要插入的位置。 额外注意的点:arr[j1]temp;这个是因为内置循环每次出来之后所指向的位置是我们要插入的位置的前一个(-1或者插入…...
Ubuntu 22.04系统启动时自动运行ROS2节点
在 Ubuntu 启动时自动运行 ROS2 节点的方法 环境:Ubuntu 系统,ROS2 Humble,使用系统自带的 启动应用程序 目标:在系统启动时自动运行指定的 ROS2 节点 效果展示 系统启动后,自动运行小乌龟节点和键盘控制节点。 实践…...
张三进阶之路 | 基于Spring AOP的Log收集
前情提要 📌 张三对于公司的日志处理系统不满意,认为其性能不佳且功能有限。为了展示自己的能力和技术实力,他决定利用Spring AOP(面向切面编程)开发一个更高效的日志处理系统,并将其存储在Redis中。 首先…...
ubuntu新装ubuntu,重启黑屏
现象:双系统电脑向移动硬盘安装Ubuntu系统后,重启黑屏并显示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背包写就行,只不过需要保证不交叉,w[i]覆盖i点,用一个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,宠物空气净化器到底应该如何选?在所有的家电品类里,宠物空气净化器算是比较特殊的那个,产品迭代太快,我们把今年双11在售的各大主流品牌的宠物空气净化器统一汇总整理,发现基本一多半都是24年下半…...
2024年10月23日第一部分
1.马小民要不要承担责任 2.主动 我就是那种平常沉默寡言孤僻内向自卑又宅又无趣,感觉不管在哪里都是比较边缘不合群的人。6月份遇到一个女生,还是人家主动加的我,断断续续聊了一个月就没下文了,可能我没谈过恋爱吧,快…...
医院信息化与智能化系统(9)
医院信息化与智能化系统(9) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应的…...
逻辑回归与神经网络
从逻辑回归开始学习神经网络 神经网络直观上解释,就是由许多相互连接的圆圈组成的网络模型: 而逻辑回归可以看作是这个网络中的一个圆圈: 圆圈被称为神经元,整个网络被称为神经网络。 本节的任务是我们究竟如何理解具体的一个神…...
隨筆 20241024 Kafka 数据格式解析:批次头与数据体
Kafka作为分布式流处理平台,以其高吞吐量、可扩展性和强大的数据传输能力,成为了现代大数据和实时处理的核心组件之一。在Kafka中,数据的存储和传输遵循一种高效的结构化格式,主要由 批次头(Batch Header)和…...
【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…...
Cropper.js进阶玩法:打造一个可撤销、可缩放、带滤镜的在线图片编辑器
Cropper.js进阶玩法:打造一个可撤销、可缩放、带滤镜的在线图片编辑器 在当今数字内容创作蓬勃发展的时代,轻量级在线图片编辑工具的需求与日俱增。Cropper.js作为一款优秀的JavaScript图片裁剪库,其潜力远不止于基础的裁剪功能。本文将带您深…...
终极Mac菜单栏整理指南:用Ice让你的桌面从此清爽高效
终极Mac菜单栏整理指南:用Ice让你的桌面从此清爽高效 【免费下载链接】Ice Powerful menu bar manager for macOS 项目地址: https://gitcode.com/GitHub_Trending/ice/Ice 你是否厌倦了Mac菜单栏上密密麻麻的图标?是否经常因为找不到需要的应用图…...
Betaflight飞行控制固件:5分钟快速上手指南与完整配置教程
Betaflight飞行控制固件:5分钟快速上手指南与完整配置教程 【免费下载链接】betaflight Open Source Flight Controller Firmware 项目地址: https://gitcode.com/gh_mirrors/be/betaflight 还在为穿越机飞行不稳定而烦恼吗?🤔 想体验…...
XMly-Downloader-Qt5:跨平台喜马拉雅音频下载解决方案的技术重构与实现深度解析
XMly-Downloader-Qt5:跨平台喜马拉雅音频下载解决方案的技术重构与实现深度解析 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-…...
JS 侦探社:如何精准判断一个对象是不是数组?
🕵️♂️ JS 侦探社:如何精准判断一个对象是不是数组? 🤔 为什么判断数组这么难? 在 JavaScript 中,数组本质上也是一种对象。 console.log(typeof []); // "object" console.log(typeof {}…...
CANN Ascend C SetStride API
SetStride 【免费下载链接】asc-devkit 本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。 项目地址: https://gitcode.com/…...
【紧急预警】PlayAI新政策已生效!ElevenLabs未披露的商用语音水印机制曝光——2024年AI语音合规红线与替代方案速览(仅剩72小时窗口期)
更多请点击: https://intelliparadigm.com 第一章:【紧急预警】PlayAI新政策已生效!ElevenLabs未披露的商用语音水印机制曝光——2024年AI语音合规红线与替代方案速览(仅剩72小时窗口期) 水印机制逆向验证结果 通过对…...
别再重复画框了!用AutoCAD 2019/2023的DWG to PDF,一次搞定所有非标图纸尺寸
高效图纸输出:AutoCAD自定义纸张尺寸的终极管理方案 在工程设计领域,图纸输出是工作流程中不可或缺的一环。无论是建筑平面图、机械零件图还是电气布线图,专业设计人员经常面临各种非标准尺寸图纸的输出需求。传统解决方案往往需要反复创建相…...
告别手动复制!Stata 16/17结果输出保姆级教程:从tabstat到outreg2的避坑指南
Stata高效结果输出实战指南:从基础统计到回归报告的自动化流程 第一次用Stata输出描述统计表时,我盯着屏幕上杂乱的.txt文件发呆——明明在命令窗口看到整齐的表格,保存后却变成了一团乱码。这可能是每个Stata初学者都会经历的挫败时刻。本文…...
从ANSI到EBCDIC:跨越地域与时代的字符编码全景解析
1. 字符编码的前世今生:从ASCII到EBCDIC 第一次在Windows记事本里保存文件时,看到"ANSI"这个选项我就懵了——这玩意儿和ASCII有什么关系?后来在跨国项目里处理日文数据时,更被SJIS和EUC-JP搞得焦头烂额。字符编码就像…...
