Qt编写数据导出到Excel及Pdf和打印数据

1、前言

用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.ziplinux

2、功能特色

  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版本+任意编译器+任意系统。

3、效果图

4、使用方法

//第一步:设置文件路径,标题等信息;
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();
相关文章
相关标签/搜索