• 5230阅读
  • 15回复

Qt编写数据导出到Excel及Pdf和打印数据 [复制链接]

上一主题 下一主题
离线liudianwu
 

只看楼主 倒序阅读 楼主  发表于: 2019-09-18

一、前言
用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询的数据,其中导出数据到Excel最常见,基本上有三种方法。
方法一使用QAxObject,小数据量还可以,数据量一大直接懵逼,性能指数级下降,而且不支持跨平台,只能在WIN上玩一玩,对于大量的linux开发者来说,直接废了。
方法二使用第三方开源的QtXlsx,这个做的还是可以,使用人群也比较多,据说不依赖office组件跨平台的,缺点就是不支持xls格式,只支持高版本的xlsx,使用稍微比较繁琐,用户更多的需要的是直接一个函数传入对应的数据即可,越简单越好。
方法三使用csv格式作为导出数据,纯文本的数据存储格式,默认逗号作为分隔符,也可以指定其他符号作为分隔符,csv格式也是各种表格软件都支持的格式,相当轻便,作为各大系统或者平台和编程语言之间交互数据还是非常方便的,很多工业控制领域的软件都会采用这种格式,缺点就是太简单了,不能分组或者指定过滤条件特殊颜色显示等。
在对比了三种方式以后,决定自己造个轮子,主要是为了自身项目的需要写的,后面慢慢的客户需求多了,增加了通用常用场景的数据导出需求,目标要求至少包含三点:速度够快、使用够简洁、不依赖任何组件。
Demo示例地址:[https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ](https://pan.baidu.com/s/1uQsDQO5E5crUBN2J-nPeLQ)  提取码:1jkp  名称:bin_dataout.zip

二、功能特点
1. 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,尤其是支持嵌入式linux。
2. 10万行数据9个字段只需要2秒钟完成。
3. 只需要四个步骤即可开始急速导出大量数据到Excel。
4. 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面
5. 可设置标题、副标题、表名。
6. 可设置字段名称、列宽度。
7. 可设置是否启用校验过滤数据、校验的列、校验规则、校验值,符合规则的特殊颜色显示。
8. 可设置随机背景颜色及需要随机背景色的列集合。
9. 支持分组输出数据,比如按照设备分组输出数据,方便查看。
10. 可自定义行内容分隔符。
11. 可追加数据形式写入数据,建议每次追加的数据小于10000条。
12. 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
13. 支持任意excel表格软件,包括但不限于excel2003/2007/2010/2013/2017/wps/openoffice等。
14. 除了提供导出到Excel类以外,还提供导出到Pdf文件以及打印数据的类。
15. 注释完善,详细完整的使用demo,支持QTableWidget、QTableView、数据库三种数据源。
16. 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

三、效果图



四、使用方法
  1. //第一步:设置文件路径,标题等信息;
  2. QList<QString> columnNames;
  3. QList<int> columnWidths;
  4. columnNames << "防区号" << "防区名称" << "告警类型" << "告警内容" << "告警时间";
  5. columnWidths << 65 << 100 << 120 << 150 << 180;
  6. QString file = qApp->applicationDirPath() + "/1.xls";
  7. ExcelThread::Instance()->init();
  8. ExcelThread::Instance()->setFileName(file);
  9. ExcelThread::Instance()->setSheetName("告警信息");
  10. ExcelThread::Instance()->setTitle("所有告警信息");
  11. ExcelThread::Instance()->setSubTitle(QString("%1 导出告警信息").arg(DATETIME));
  12. ExcelThread::Instance()->setColumnNames(columnNames);
  13. ExcelThread::Instance()->setColumnWidths(columnWidths);
  14. //第二步:打开文件,启动线程;
  15. ExcelThread::Instance()->open();
  16. ExcelThread::Instance()->start();
  17. //第三步:逐行输入数据;
  18. QStringList list;
  19. list << "防区上线" << "防区离线" << "防区旁路" << "防区报警" << "防区故障";
  20. for (int i = 0; i < logCount; i++) {
  21.     int index = qrand() % 4;
  22.     QStringList temp;
  23.     temp.append(QString::number(i + 1));
  24.     temp.append("防区" + QString::number(i + 1));
  25.     temp.append("主机上报");
  26.     temp.append(list.at(index));
  27.     temp.append(DATETIME);
  28.     ExcelThread::Instance()->appendContent(temp.join(";"));
  29. }
  30. //第四步:关闭文件,关闭线程;
  31. ExcelThread::Instance()->close();
  32. ExcelThread::Instance()->stop();


欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线圣域天子

只看该作者 1楼 发表于: 2019-09-18
有源码不?
离线alan66

只看该作者 2楼 发表于: 2019-09-18
有源码吗?

只看该作者 3楼 发表于: 2019-09-18
回 alan66 的帖子
alan66:有源码吗? (2019-09-18 10:12) 

需要money的
离线mengkun

只看该作者 4楼 发表于: 2019-09-18


原理是输出的文件实际是一个 xml 格式(纯文本),然后将后缀名改为了 “.xls” 伪装成 Excel 格式

很不错的思路,学习了!
离线liudianwu

只看该作者 5楼 发表于: 2019-09-18
回 mengkun 的帖子
mengkun:[图片]
原理是输出的文件实际是一个 xml 格式(纯文本),然后将后缀名改为了 “.xls” 伪装成 Excel 格式 [表情]
很不错的思路,学习了! (2019-09-18 10:56) 

是的,openxls
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线305750665

只看该作者 6楼 发表于: 2019-09-18
好东西~ 刘总V5
雨田哥: 群号:853086607
QQ: 3246214072

刘典武-feiyangqingyun:专业各种自定义控件编写+UI定制+输入法定制+视频监控+工业控制+仪器仪表+嵌入式linux+各种串口网络通信,童叟无欺,量大从优,欢迎咨询购买定制!QQ:517216493
离线24131583

只看该作者 7楼 发表于: 2019-09-18
思路很棒!
在线uidab

只看该作者 8楼 发表于: 2019-09-18
大侠又来分享了~~~
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线niyouhua

只看该作者 9楼 发表于: 2019-09-18
回 uidab 的帖子
uidab:大侠又来分享了~~~[表情]  (2019-09-18 17:22) 

是来打广告的
离线zzzzzzhuzhu

只看该作者 10楼 发表于: 2019-09-26
刘大佬能不能开点源  天天看你打广告
离线niyouhua

只看该作者 11楼 发表于: 2019-09-27
回 zzzzzzhuzhu 的帖子
zzzzzzhuzhu:刘大佬能不能开点源  天天看你打广告 (2019-09-26 19:37) 

都开源了还怎么卖钱啊
离线赵帅

只看该作者 12楼 发表于: 2019-10-26
加我 QQ 69639822
离线liudianwu

只看该作者 13楼 发表于: 2019-10-27
回 赵帅 的帖子
赵帅:加我 QQ 69639822 (2019-10-26 14:36) 

我Q517216493
欢迎关注微信公众号:Qt实战 (各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发)QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线hejiang177

只看该作者 14楼 发表于: 2019-11-03
大神牛逼
老是要密码
离线david850911

只看该作者 15楼 发表于: 2019-11-30
请教一下导出到PDF有用到第三方库吗?
书生浪了
快速回复
限100 字节
 
上一个 下一个