Qt编写数据导出到Excel及Pdf和打印数据
一、前言
用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到Excel最常见,基本上有三种方法。
方法一使用QAxObject,小数据量还可以,数据量一大直接懵逼,性能指数级下降,而且不支持跨平台,只能在WIN上玩一玩,对于大量的linux开发者来说,直接废了。
方法二使用第三方开源的QtXlsx,这个做的还是可以,使用人群也比较多,据说不依赖office组件跨平台的,缺点就是不支持xls格式,只支持高版本的xlsx,使用稍微比较繁琐,用户更多的需要的是直接一个函数传入对应的数据即可,越简单越好。
方法三使用csv格式作为导出数据,纯文本的数据存储格式,默认逗号作为分隔符,也可以指定其他符号作为分隔符,csv格式也是各种表格软件都支持的格式,相当轻便,作为各大系统或者平台和编程语言之间交互数据还是非常方便的,很多工业控制领域的软件都会采用这种格式,缺点就是太简单了,不能分组或者指定过滤条件特殊颜色显示等。
在对比了三种方式以后,决定自己造个轮子,主要是为了自身项目的需要写的,后面慢慢的客户需求多了,增加了通用常用场景的数据导出需求,目标要求至少包含三点:速度够快、使用够简洁、不依赖任何组件。
Demo示例地址:https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ 提取码:1jkp 名称:bin_dataout.zip
二、功能特点
- 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,尤其是支持嵌入式linux。
- 10万行数据9个字段只需要2秒钟完成。
- 只需要四个步骤即可开始急速导出大量数据到Excel。
- 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
- 可设置标题、副标题、表名。
- 可设置字段名称、列宽度。
- 可设置是否启用校验过滤数据、校验的列、校验规则、校验值,符合规则的特殊颜色显示。
- 可设置随机背景颜色及需要随机背景色的列集合。
- 支持分组输出数据,比如按照设备分组输出数据,方便查看。
- 可自定义行内容分隔符。
- 可追加数据形式写入数据,建议每次追加的数据小于10000条。
- 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
- 支持任意excel表格软件,包括但不限于excel2003/2007/2010/2013/2017/wps/openoffice等。
- 除了提供导出到Excel类以外,还提供导出到Pdf文件以及打印数据的类。
- 注释完善,详细完整的使用demo,支持QTableWidget、QTableView、数据库三种数据源。
- 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。
三、效果图

四、使用方法
//第一步:设置文件路径,标题等信息;
QList<QString> columnNames;
QList<int> columnWidths;
columnNames << "防区号" << "防区名称" << "告警类型" << "告警内容" << "告警时间";
columnWidths << 65 << 100 << 120 << 150 << 180;
QString file = qApp->applicationDirPath() + "/1.xls";
ExcelThread::Instance()->init();
ExcelThread::Instance()->setFileName(file);
ExcelThread::Instance()->setSheetName("告警信息");
ExcelThread::Instance()->setTitle("所有告警信息");
ExcelThread::Instance()->setSubTitle(QString("%1 导出告警信息").arg(DATETIME));
ExcelThread::Instance()->setColumnNames(columnNames);
ExcelThread::Instance()->setColumnWidths(columnWidths);
//第二步:打开文件,启动线程;
ExcelThread::Instance()->open();
ExcelThread::Instance()->start();
//第三步:逐行输入数据;
QStringList list;
list << "防区上线" << "防区离线" << "防区旁路" << "防区报警" << "防区故障";
for (int i = 0; i < logCount; i++) {
int index = qrand() % 4;
QStringList temp;
temp.append(QString::number(i + 1));
temp.append("防区" + QString::number(i + 1));
temp.append("主机上报");
temp.append(list.at(index));
temp.append(DATETIME);
ExcelThread::Instance()->appendContent(temp.join(";"));
}
//第四步:关闭文件,关闭线程;
ExcelThread::Instance()->close();
ExcelThread::Instance()->stop();
Qt编写数据导出到Excel及Pdf和打印数据的更多相关文章
- Qt中将QTableView中的数据导出为Excel文件
如果你在做一个报表类的程序,可能将内容导出为Excel文件是一项必须的功能.之前使用MFC的时候我就写过一个类,用于将grid中的数据导出为Excel文件.在使用了QtSql模块后,我很容易的将这个类 ...
- 机房收费系统——在VB中将MSHFlexGrid控件中的数据导出到Excel
机房收费系统中,好多查询的窗体都包含同一个功能:将数据库中查询到的数据显示在MSHFlexGrid控件中,然后再把MSHFlexGrid控件中的数据导出到Excel表格中. 虽然之前做过学生信息管理系 ...
- struts2结合poi-3.7实现数据导出为excel
我们在处理数据的时候,有可能要将数据导出到excel文件中,那么java中是怎么实现的呢?apache开发的poi就可以帮我们实现啦,它也是开源的代码,导入相应的jar包,就可以轻松实现,下面让我们来 ...
- 学习笔记 DataGridView数据导出为Excel
DataGridView数据导出为Excel 怎样把WinForm下的“DGV”里的绑定数据库后的数据导出到Excel中. 比如:在窗体里有个一“DGV”,DataGridView1,绑定了数据源 ...
- 将C1Chart数据导出到Excel
大多数情况下,当我们说将图表导出到Excel时,意思是将Chart当成图片导出到Excel中.如果是这样,你可以参考帮助文档中保存和导出C1Chart章节. 不过,也有另一种情况,当你想把图表中的数据 ...
- vb.net-三种将datagridview数据导出为excel文件的函数
第一种方法较慢,但是数据格式都比较好,需要引用excel的 Microsoft.Office.Interop.Excel.dll office.dll #Region "导出excel函数 ...
- 数据导出至Excel文件--好库编程网http://code1.okbase.net/codefile/SerializeHelper.cs_2012122018724_118.htm
using System; using System.IO; using System.Data; using System.Collections; using System.Data.OleDb; ...
- 数据导出到Excel中
自己修改后的一个数据导出到Excel的方法,粘出来与大家共享. 只需要将 System.Web.HttpContext.Current.Response.Charset = ...
- asp.net将数据导出到excel
本次应用datatable导出,若用gridview(假设gridview设为了分页显示)会出现只导出当前页的情况. protected void btnPrn_Click(object sender ...
随机推荐
- linux个人常用命令【持续更新】
netstat -tnl 查看网络相关的端口情况 ps -A 查看所有进程的情况 cat /proc/cpuinfo| grep "physical id"| sort| uniq ...
- MySQL进阶18- 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'- 删除/查看/修改-三个练习
/* MySQL-进阶18 存储过程 和 函数 存储过程和函数:类似于java中的方法 好处: 1.提高代码的重用性 2.简化操作 */ #存储过程 /* 含义: 一组已经预见编译好的SQL语句的集合 ...
- No qualifying bean of type 'org.springframework.scheduling.TaskScheduler' available
2019-07-22 17:59:30,966 [DEBUG] [localhost-startStop-1] [ScheduledAnnotationBeanPostProcessor.java : ...
- JavaScript 弹出窗口总结
1: window.open <!-- window.open('page.html', 'newwindow', 'height=100, width=400, top=0,left=0, t ...
- 二十三.Subversion基本操作、使用Subversion协同工作、制作nginx的RPM包
1.Subversion基本操作 web1 1.1 安装Subversion服务器 ]# yum -y install subversion 1.1.1 创建版本库 ]# mkdir /var/svn ...
- 二十二. 安装部署Tomcat服务器、使用Tomcat部署虚拟主机、使用Varnish加速Web
web proxy web1 web2 1.安装部署Tomcat服务器 web1 1.1 使用RPM安装JDK环境 ]# yum -y install java-1.8.0-openjdk ]# ...
- 后台(一)vue+element-ui (按需加载)
vue init webpack 项目名称 npm install axios //先安装! npm install --save axios vue-ax ...
- web+页面支持批量下载吗
一.此方法火狐有些版本是不支持的 window.location.href = 'https://*****.oss-cn-**.aliyuncs.com/*********';二.为了解决火狐有些版 ...
- java大文件上传解决方案
最近遇见一个需要上传百兆大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现. 在某些业务中,大文件上传是一个比较重要的交互场景,如上传入库比较大的Excel表 ...
- mount/umount
mount 挂载文件系统 6的 查看当前挂载情况 7的 将文件系统挂载到目录下,这个目录中的文件随着文件系统走,文件系统挂到那,里面的文件就在哪 挂载到其他地方 指定卷标的 指定文件UUID 指定ac ...