Qt数据库应用之实现数据分组导出

目录
  • 一、前言
  • 二、功能特点
  • 三、体验地址
  • 四、效果图
  • 五、相关代码

一、前言

数据分组导出和打印这个需求并不是近期的需求,而是之前做温湿度监控系统的时候提的需求,当然也有几个系统用到了,比如啤酒保鲜监控系统。这个需求的应用场景是,有很多个设备,每个设备都产生了很多的运行日志、报警日志等,这些日志按照时间顺序存储在数据库中,用户需要按照不同设备分组导出,同时对应统计有多少行记录,开始时间和结束时间,以副标题的形式展示在文档中。

数据源有了,关键是如何组织这些数据,传入参数的时候以特定分隔符做标记,取出来生成文档的时候,按照特定分隔符分割字符串,然后循环遍历取出数据,按照html格式填充一行行表格内容,最终形成一个完整的html字符串集合,这个字符串集合既可以保存到xls文档,也可以作为打印的内容,导出到pdf就是打印到pdf文件。在分组导出的同时,还可以设置过滤条件,符合特定条件的记录不同颜色显示。

二、功能特点

  • 组件同时集成了导出数据到csv、xls、pdf和打印数据。
  • 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。
  • 同时支持QtableView、QTableWidget、QStandardItemModel、QsqlTableModel等数据源。
  • 提供静态方法直接传入QTableView、QTableWidget控件,自动识别列名、列宽和数据内容。
  • 每组功能都提供单独的完整的示例,注释详细,非常适合各阶段Qter程序员。
  • 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,支持嵌入式linux。
  • 速度超快,9个字段10万行数据只需要2秒钟完成。
  • 只需要四个步骤即可开始急速导出海量数据比如100W条记录到excel。
  • 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
  • 可设置标题、副标题、表名。
  • 可设置导出数据的字段名、列名、列宽。
  • 可设置末尾列自动拉伸填充,默认拉伸更美观。
  • 可设置是否启用校验过滤数据,启用后符合规则的数据特殊颜色显示。
  • 可指定校验的列、校验规则、校验值、校验值数据类型。
  • 校验规则支持 精确等于==、大于>、大于等于>=、小于initFORM(); } frmDataOut3::~frmDataOut3() { delete ui; } void frmDataOut3::showEvent(QShowEvent *) { static bool isshow = false; if (!isShow) { isShow = true; QMetaObject::invokeMethod(this, "on_btnLoad_clicked"); } } void frmDataOut3::setInfo(int type, int count) { QString str1 = "生成数据"; if (type == 1) { str1 = "导出数据"; } else if (type == 2) { str1 = "打印数据"; } ui->labInfo1->setText(str1); ui->labInfo2->setText(QString("共 %1 条").arg(count)); QString msec = QString::number((float)time.elapsed() / 1000, 'f', 3); ui->labInfo3->setText(QString("用时 %1 秒").arg(msec)); } void frmDataOut3::getContent(int maxCount, QStringList &content, QStringList &subTitle1, QStringList &subTitle2) { content.clear(); subTitle1.clear(); subTitle2.clear(); maxCount = maxCount >= rowCount ? rowCount : maxCount; QString sql = QString("select * from MsgInfo order by DeviceID asc,MsgTime asc limit %1").arg(maxCount); QSqlQuery query; if (!query.exec(sql)) { return; } int count = 0; int logID = 0; QString tempDeviceID = "0"; QString temp = ""; QString startTime = ""; QString endTime = ""; while (query.next()) { count++; logID++; QString deviceID = query.value(0).toString(); QString deviceName = query.value(1).toString(); QString deviceTel = query.value(2).toString(); QString deviceWeight = query.value(3).toString(); QString deviceTemp = query.value(4).toString(); QString devicePressure = query.value(5).toString(); QString msgType = query.value(6).toString(); QString msgTime = query.value(7).toString(); QString msGContent = query.value(8).toString(); //如果是一个全新的设备,则添加子标题,添加上一个设备的数据集合后清空集合数据. if (deviceID != tempDeviceID) { subTitle1