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

2023年 8月 13日 26.9k 0

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

一、前言

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

数据源有了,关键是如何组织这些数据,传入参数的时候以特定分隔符做标记,取出来生成文档的时候,按照特定分隔符分割字符串,然后循环遍历取出数据,按照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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论