多线程极速导出/9字段10W行只需2秒/导入导出打印组件/功能丰富简单易用

news2024/9/29 21:29:54

一、功能特点

  1. 组件同时集成了导出数据到csv、xls、pdf和打印数据。
  2. 所有操作全部提供静态方法无需new,数据和属性等各种参数设置采用结构体数据,极为方便。
  3. 同时支持QTableView、QTableWidget、QStandardItemModel、QSqlTableModel等数据源。
  4. 提供静态方法直接传入QTableView、QTableWidget控件,自动识别列名、列宽和数据内容。
  5. 每组功能都提供单独的完整的示例,注释详细,非常适合各阶段Qter程序员。
  6. 原创导出数据机制,不依赖任何office组件或者操作系统等第三方库,支持嵌入式linux。
  7. 速度超快,9个字段10万行数据只需要2秒钟完成。
  8. 只需要四个步骤即可开始急速导出海量数据比如100W条记录到Excel。
  9. 同时提供直接写入数据接口和多线程写入数据接口,不卡主界面。
  10. 可设置标题、副标题、表名。
  11. 可设置导出数据的字段名、列名、列宽。
  12. 可设置末尾列自动拉伸填充,默认拉伸更美观。
  13. 可设置是否启用校验过滤数据,启用后符合规则的数据特殊颜色显示。
  14. 可指定校验的列、校验规则、校验值、校验值数据类型。
  15. 校验规则支持 精确等于==、大于>、大于等于>=、小于<、小于等于<=、不等于!=、包含contains。
  16. 校验值数据类型支持 整型int、浮点型float、双精度型double,默认文本字符串类型。
  17. 可设置随机背景颜色及需要随机背景色的列集合。
  18. 支持分组输出数据,比如按照设备分组输出数据,方便查看。
  19. 可设置csv分隔符、行内容分隔符、子内容分隔符。
  20. 可设置边框宽度、自动填数据类型,默认自动数据类型开启。
  21. 可设置是否开启数据单元格样式,默认不开启,不开启可以节约大概30%的文件体积。
  22. 可设置横向排版、纸张边距等,比如导出到pdf以及打印数据。
  23. 提供图文混排导出数据到pdf以及打印示例,自动分页,支持多图。
  24. 提供一个打印样板中同时包括横向纵向排版示例。
  25. 提供静态函数将控件截图导出到pdf文件。
  26. 提供静态函数将图片转成pdf文件。
  27. 提供静态函数将csv文件转成xls文件,支持列宽表名等参数设置。
  28. 针对每列可分别设置字段对齐样式、内容对齐样式,包括左对齐、居中对齐、右对齐。
  29. 灵活性超高,可自由更改源码设置对齐方式、文字颜色、背景颜色等。
  30. 支持任意excel表格软件,包括但不限于excel2003-2021、wps、openoffice等。
  31. 纯Qt编写,支持任意Qt版本+任意编译器+任意系统。

二、相关链接

  1. 体验地址:https://pan.baidu.com/s/1ZxG-oyUKe286LPMPxOrO2A 提取码:o05q 文件名:bin_dataout.zip
  2. 国内站点:https://gitee.com/feiyangqingyun
  3. 国际站点:https://github.com/feiyangqingyun

三、使用方法

3.1 第一步:引入组件

  • 组件中所有代码文件是一个整体,不支持单个代码文件拆分使用,因为很多通用的方法都放在一个代码文件中,复用很多代码。
  • datehead是本组件用到的头文件以及通用的数据结构体。
  • datahelper是通用的校验列函数和数据导出打印函数。
  • datacreat用于创建html格式的数据,用来导出到pdf和打印数据。
  • datacsv用于导入导出文件csv格式。
  • dataxls是数据导出到xls的核心。
  • dataprint是数据导出到pdf和打印数据。
  1. 将core_dataout整个目录拷贝到你的项目文件夹同级目录。
  2. 打开你的项目的pro文件,引入组件。
INCLUDEPATH += $$PWD/../core_dataout
include ($$PWD/../core_dataout/core_dataout.pri)
  1. 此时在项目树状结构图中可以看到 core_dataout 组件代码。
  2. 演示代码中的quihelper各种函数等,都在core_base组件中,如果需要使用的话,需要先引入该组件。

3.2 第二步:获取数据

  • 无论是导出到xls还是pdf或者打印,前提是都要拿到需要处理的数据集合。
  • 拿到数据的方式基本上两种,一种是数据库查询比如QSqlTableModel,一种是界面控件取数据比如QTableView、QTableWidget、QStandardItemModel。
  • QTableView一般有两种数据源,一个是QSqlTableModel,一个是QStandardItemModel。
  • 数据集合按照一行行数据来,中间用英文的 分号 ; 隔开,最后统一放到QStringList中。
3.2.1 示例QSqlTableModel
void frmDataOut2::on_btnLoad_clicked()
{
    model->setTable("MsgInfo");
    model->select();
    ui->tableView->setModel(model);
    for (int i = 0; i < columnCount; i++) {
        model->setHeaderData(i, Qt::Horizontal, columnNames.at(i));
        ui->tableView->setColumnWidth(i, columnWidths.at(i));
    }
}

QStringList frmDataOut2::getContent()
{
    QStringList content;
    QString sql = QString("select * from MsgInfo limit %1").arg(100);
    QSqlQuery query;
    if (!query.exec(sql)) {
        return content;
    }

    //循环遍历数据
    while (query.next()) {
        QStringList list;
        for (int i = 0; i < column; i++) {
            list << query.value(i).toString();
        }
        content << list.join(";");
    }
    return content;
}
3.2.2 示例QStandardItemModel
void frmSimple::on_btnLoad_clicked()
{
    //清空数据
    model->clear();    
    //设置列数及列标题和列宽
    model->setColumnCount(column);
    for (int i = 0; i < column; ++i) {
        model->setHeaderData(i, Qt::Horizontal, columnNames.at(i));
        ui->tableView->setColumnWidth(i, columnWidths.at(i));
    }

    //循环添加行数据
    for (int i = 0; i < row; ++i) {
        //循环添加一行的列
        QList<QStandardItem *> items;
        for (int j = 0; j < column; ++j) {
            QStandardItem *item = new QStandardItem;
            item->setText(QString("行%1_列%2").arg(i + 1).arg(j + 1));
            items << item;
        }
        model->appendRow(items);
    }
    ui->tableView->setModel(model);
}

QStringList frmSimple::getContent()
{
    //从 QTableView 获取数据
    QStringList content;
    for (int i = 0; i < row; ++i) {
        QStringList list;
        for (int j = 0; j < column; ++j) {
            list << model->item(i, j)->text();
        }
        //每行数据作为一个整体字符串分割存入
        content << list.join(";");
    }
    return content;
}
3.2.3 示例QTableWidget
void frmDataOut1::on_btnLoad_clicked()
{
    QStringList list;
    list << "防区上线" << "防区离线" << "防区旁路" << "防区报警" << "防区故障";

    ui->tableWidget->clearContents();
    for (int i = 0; i < rowCount; i++) {
        //随机生成告警内容
        int index = rand() % 4;
        QTableWidgetItem *item1 = new QTableWidgetItem(QString::number(i + 1));
        QTableWidgetItem *item2 = new QTableWidgetItem("防区" + QString::number(i + 1));
        QTableWidgetItem *item3 = new QTableWidgetItem("主机上报");
        QTableWidgetItem *item4 = new QTableWidgetItem(list.at(index));
        QTableWidgetItem *item5 = new QTableWidgetItem(DATETIME);
        item5->setTextAlignment(Qt::AlignCenter);

        ui->tableWidget->setItem(i, 0, item1);
        ui->tableWidget->setItem(i, 1, item2);
        ui->tableWidget->setItem(i, 2, item3);
        ui->tableWidget->setItem(i, 3, item4);
        ui->tableWidget->setItem(i, 4, item5);
    }
}

QStringList frmDataOut1::getContent()
{
    QStringList content;
    for (int i = 0; i < row; i++) {
        QStringList list;
        for (int j = 0; j < column; j++) {
            list << ui->tableWidget->item(i, j)->text();
        }
        content << list.join(";");
    }
    return content;
}

3.3 第三步:设置数据

  • 无论是导出到xls还是pdf或者打印,都需要设置数据结构体,传入列名、列宽、数据集合等信息。
  • 如果是导出到xls还需要设置文件名及表名。
  • 如果是导出到pdf需要设置文件名。
  • 打印不需要设置文件名和表名。
void frmSimple::on_btnXls_clicked()
{
    //设置结构体数据
    DataContent dataContent;
    //填充内容
    dataContent.content = getContent();
    //设置列名列宽
    dataContent.columnNames = columnNames;
    dataContent.columnWidths = columnWidths;
    //设置文件名
    dataContent.fileName = "d:/0.xls";
    //设置表名
    dataContent.sheetName = "测试信息";

    //调用静态函数保存
    DataXls::saveXls(dataContent);
    //打开刚才导出的文件
    QUIHelper::openFile(dataContent.fileName, "导出测试信息");
}

void frmSimple::on_btnPdf_clicked()
{
    //设置结构体数据
    DataContent dataContent;
    //填充内容
    dataContent.content = getContent();
    //设置列名列宽
    dataContent.columnNames = columnNames;
    dataContent.columnWidths = columnWidths;
    //设置文件名
    dataContent.fileName = "d:/0.pdf";

    //调用静态函数保存
    DataPrint::savePdf(dataContent);
    //打开刚才导出的文件
    QUIHelper::openFile(dataContent.fileName, "导出测试信息");
}

void frmSimple::on_btnPrint_clicked()
{
    //设置结构体数据
    DataContent dataContent;
    //填充内容
    dataContent.content = getContent();
    //设置列名列宽
    dataContent.columnNames = columnNames;
    dataContent.columnWidths = columnWidths;

    //调用静态函数打印
    DataPrint::print(dataContent);
}

3.4 第四步:执行操作

  • 数据导入导出组件dataout提供了统一的数据结构体用来设置数据和其他参数。
  • 封装了统一的静态函数DataXls::saveXls用来导出到xls、DataPrint::savePdf用来导出到pdf、DataPrint::print用来打印数据。
  • 支持各种详细复杂的参数设置以及海量数据导出多线程操作,具体参见详细使用demo。
//调用静态函数保存到xls
DataXls::saveXls(dataContent);
//调用静态函数保存到pdf
DataPrint::savePdf(dataContent);
//调用静态函数打印数据
DataPrint::print(dataContent);

四、最简方法

为了方便入门级的Qter(Qt程序员)也能直接上手使用,比如很多时候已经把数据加载到了QTableView、QTableWigdte中,只想直接传入这个控件及数据模型,就给我导出数据到csv/xls/pdf和打印数据就行,甚至可以不传入文件名称,弹出对话框让用户选择。立即安排。

void frmSimple::on_btnCsv1_clicked()
{
    QString file = QUIHelper::appPath() + "/db/dataout_tableview.csv";
    DataHelper::DataOut(ui->tableView, model, 0, file, "测试标题", "测试信息");
    //打开刚才导出的文件
    QUIHelper::openFile(file, "导出测试信息");
}

void frmSimple::on_btnXls1_clicked()
{
    //通用函数直接传入控件
#if 1
    QString file = QUIHelper::appPath() + "/db/dataout_tableview.xls";
    DataHelper::DataOut(ui->tableView, model, 1, file, "测试标题", "测试信息");
#else
    //不传入文件名则会弹出对话框选择保存文件名
    QString file = DataHelper::DataOut(ui->tableView, model, 1);
#endif
    //打开刚才导出的文件
    QUIHelper::openFile(file, "导出测试信息");
}

void frmSimple::on_btnPdf1_clicked()
{
    //通用函数直接传入控件
    QString file = QUIHelper::appPath() + "/db/dataout_tableview.pdf";
    DataHelper::DataOut(ui->tableView, model, 2, file, "测试标题", "测试信息");
    //打开刚才导出的文件
    QUIHelper::openFile(file, "导出测试信息");
}

void frmSimple::on_btnPrint1_clicked()
{
    //通用函数直接传入控件
    DataHelper::DataOut(ui->tableView, model, 3, "", "测试标题");
}

void frmSimple::on_btnCsv2_clicked()
{
    QString fileName = QUIHelper::appPath() + "/db/dataout_tablewidget.csv";
    DataHelper::dataout(ui->tableWidget, 0, fileName, "测试标题", "测试信息");
    //打开刚才导出的文件
    QUIHelper::openFile(fileName, "导出测试信息");
}

void frmSimple::on_btnXls2_clicked()
{
    QString fileName = QUIHelper::appPath() + "/db/dataout_tablewidget.xls";
    DataHelper::dataout(ui->tableWidget, 1, fileName, "测试标题", "测试信息");
    //打开刚才导出的文件
    QUIHelper::openFile(fileName, "导出测试信息");
}

void frmSimple::on_btnPdf2_clicked()
{
    //通用函数直接传入控件
    QString fileName = QUIHelper::appPath() + "/db/dataout_tablewidget.pdf";
    DataHelper::dataout(ui->tableWidget, 2, fileName, "测试标题", "测试信息");
    //打开刚才导出的文件
    QUIHelper::openFile(fileName, "导出测试信息");
}

void frmSimple::on_btnPrint2_clicked()
{
    //通用函数直接传入控件
    DataHelper::dataout(ui->tableWidget, 3, "", "测试标题");
}

四、效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2167020.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何使用GitHub Desktop管理GitLab库

不管是新手还是老手&#xff0c;Github Desktop都是在苹果系统和Windows系统上管理与创建项目的不错的方式&#xff0c;GitHub Desktop都能够让在GitHub上的工作流更为简单快捷。 注意&#xff0c;以下步骤只支持原版的GitHub Desktop 第一步 从这下载GitHub Desktop打开你的G…

CSS中<a>超链接的样式

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><!-- 伪类选择器 -->&…

大模型RAG入门到实战基础教程(非常详细),大模型RAG入门到精通,收藏这一篇就够了!

写在前面 大模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;的浪潮已经席卷了几乎各行业&#xff0c;但当涉及到专业场景或行业细分域时&#xff0c;通用大模型就会面临专业知识不足的问题。相对于成本昂贵的“Post Train”或“SFT”&#xff0c;基于RAG的技…

css 中 ~ 符号的使用

直接看代码 <script setup> </script><template><div class"container"><p><a href"javascript:;">纪检委</a><a href"javascript:;">中介为</a><a href"javascript:;">…

Vxe UI vue 使用 vxe-form 表单实现简历模板

Vxe UI 使用 vxe-form 表单实现简历模板 查看 github <template><div><p>边框&#xff1a;<vxe-switch v-model"border"></vxe-switch>标题背景&#xff1a;<vxe-switch v-model"titleBackground"></vxe-switch&…

【GreenHills】使用“gsrec”命令生成二进制文件

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 记录在GHS中修改工程命令&#xff0c;输出hex&#xff0c;bin文件等&#xff0c;对问题进行快速答疑&#xff0c;GHS编译器如何去使用”gsrec“生成不同的二进制文件。 2、 问题场景 客户想要生成hex&#xff0c;bi…

【每日一题】LeetCode 2306.公司命名(位运算、数组、哈希表、字符串、枚举)

【每日一题】LeetCode 2306.公司命名&#xff08;位运算、数组、哈希表、字符串、枚举&#xff09; 题目描述 给定一个字符串数组 ideas&#xff0c;表示在公司命名过程中使用的名字列表。我们需要从 ideas 中选择两个不同的名字&#xff0c;称为 ideaA 和 ideaB。然后交换 i…

深入探索Go语言反射机制:reflect包的高级用法和实战技巧

深入探索Go语言反射机制:reflect包的高级用法和实战技巧 引言reflect包的作用和重要性为什么reflect包对于Go语言开发者的重要性 reflect包的基础reflect包的导入和基本用法reflect的核心概念&#xff1a;类型&#xff08;Type&#xff09;和值&#xff08;Value&#xff09;使…

数字化TPM:从概念到实践的飞跃之旅

数字化TPM&#xff0c;顾名思义&#xff0c;是将传统TPM理念与现代信息技术深度融合的产物。它不仅仅关注设备维护的“全面性”和“预防性”&#xff0c;更强调通过大数据、云计算、物联网等先进技术&#xff0c;实现设备状态的实时监控、故障预警、智能决策及优化管理。这一转…

MyBatis 深层次 Map 自动嵌套:解锁数据映射新境界

在 Java 开发的征程中&#xff0c;MyBatis 以其强大的数据库映射功能而备受青睐。其中&#xff0c;深层次 Map 自动嵌套这一特性更是为开发者带来了诸多惊喜与便利。 前提&#xff1a;首先开启自动映射&#xff01; java和mysql命名规则不一样&#xff0c;每次在mybatis中起别…

【成功案例】解决浙江xx电子有限公司的勒索病毒

01 背景 当地时间 2020年5月18日&#xff0c;思而听网络科技有限公司&#xff08;以下简称思而听&#xff09;接到浙江xx电子有限公司&#xff08;以下简称xx电子&#xff09;的求救邮件&#xff0c;邮件中指出&#xff0c;xx电子的内部计算机收到了不明黑客的恶意勒索病毒攻击…

MySQL_聚合函数

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

如何在算家云搭建text-generation-webui(文本生成)

一、text-generation-webui 简介 text-generation-webui 是一个流行的用于文本生成的 Gradio Web UI。支持 transformers、GPTQ、AWQ、EXL2、llama.cpp (GGUF)、Llama 模型。 它的特点如下&#xff0c; 3 种界面模式&#xff1a;default (two columns), notebook, chat支持多…

揭秘计算机内部奥秘:从CPU到操作系统,深入探索进程与线程的工作原理

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 引言 计算的需求在人类的历史中是广泛存在的&#xff0c;发展大体经历了从一般计…

视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法

LntonAIServer作为一款智能视频监控平台&#xff0c;集成了多种先进的视频质量诊断功能&#xff0c;其中包括抖动检测和过暗检测算法。这些算法对于提升视频监控系统的稳定性和图像质量具有重要意义。 以下是对抖动检测算法和过暗检测算法的应用场景及优势的详细介绍。 一、L…

电商必备的8个AI工具

让我们来谈谈电子商务的 AI 工具。 这篇文章旨在帮助你找到真正的 AI 电子商务软件&#xff0c;以协助你进行内容创建和管理、销售、客户服务自动化、营销策略审计、竞争情报等。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - …

云和恩墨携手华为,发布zCloud数据库备份管理一体机并宣布共建数据保护生态...

为期三天的第九届华为全联接大会&#xff08;HUAWEI CONNECT 2024&#xff09;于9月19日在上海世博中心&展览馆盛大召开。20日下午&#xff0c;一场围绕“全场景数据保护&#xff0c;护航数智化时代”的专题论坛举办&#xff0c;云和恩墨受邀参加&#xff0c;并期待与华为合…

神舟笔记本安装Control Center无法打开

神舟笔记本安装Control Center无法打开 1.1 下载驱动 首先来到神舟笔记本官方&#xff0c;下载笔记本对应的驱动&#xff1a;http://archive.hasee.com/Chinese/download/computer.aspx?cid105001003001001 选择型号搜索&#xff08;例如笔者的时Z8-CT7NT&#xff09;&#…

UE4_Niagara基础实例—使用自定义模块

功能实现&#xff1a;用音频来触发粒子特效。 效果&#xff1a; 根据音量调节粒子大小 分析&#xff1a;我们想通过音量来控制Curl Noise Forc强度e的strength参数&#xff0c;但经过搜索会发现既没有这个参数&#xff0c;也没有这个模块&#xff0c;那么只能自定义这个模块。…

解决IDEA每次创建新项目时都要指定Maven仓库和Maven配置文件的问题

文章目录 0. 前言1. 打开新项目的设置2. 搜索 Maven 相关的配置3. 更改Maven主路径、配置文件、本地仓库4. 更改新项目的Maven配置后没生效 0. 前言 在 IDEA 中每次创建新项目时&#xff0c;使用的都是默认的 Maven 仓库和默认的配置文件&#xff0c;需要我们手动修改&#xf…