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

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

时间:2024-09-26 08:53:47浏览次数:8  
标签:dataContent 导出 dataout ui 功能丰富 pdf 多线程 数据

一、功能特点

  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, "", "测试标题");
}

四、效果图








标签:dataContent,导出,dataout,ui,功能丰富,pdf,多线程,数据
From: https://www.cnblogs.com/feiyangqingyun/p/18432677

相关文章

  • Windows使用使用旧版有道云客户端导出所有笔记
    使用旧版有道云笔记客户端导出所有笔记最近在复习之前的笔记,边复习边整理,准备把之前在有道云笔记的文档全部整理导出,原因你懂得(有道云笔记是越做越烂了!!!),有道云笔记新版本的客户端不支持导出所有笔记。依稀记得老版本好像是支持全部导出的,我找到了2年前保存的旧版本的客户......
  • Redis6 多线程模型
    优质博文:IT-BLOG-CN一、单线程的优缺点对于一个请求操作Redis主要做3件事情:从客户端读取数据/解析、执行Redis命令、回写数据给客户端。所以主线程其实就是把所有操作的这3件事情串行一起执行,因为是基于内存,所以执行速度非常快。优点&缺点:【1】优点:不存在锁的竞争问题和......
  • 银行存取款多线程
    importjava.util.Random;importjava.lang.*;/***银行存取款**@authorLaccoliths*/publicclassBank{privateintcount=0;/***存钱*@parammoney:存钱数*/publicsynchronizedvoidaddMoney(intmoney){count+......
  • Linux 基础入门操作 第十章 多线程实现
    10线程介绍线程是进程的一条执行路径。每个线程共享其所附属的进程的所有的资源,包括打开的文件、页表(因此也就共享整个用户态地址空间)、信号标识及动态分配的内存等等。线程和进程的关系是:线程是属于进程的,线程运行在进程空间内,同一进程所产生的线程共享同一物理内存空间......
  • 前端使用xlsx模板导出表格
    前端使用xlsx模板导出表格 前言前端导出表格有很多种方案,但是表格样式一旦复杂了,那么就得用代码写excel的样式,还是比较麻烦的。每次样式不一样,就得重新写,这时使用表格模板的优势就体现出来了,想导出不同样式的表格直接修改表格模板即可。方案我找了两种方案:1、使用xlsx-tem......
  • 【Linux】多线程:线程池的创建、日志类、RAII互斥锁、单例模式:饿汉方式与懒汉方式
    目录一、线程池概念二、线程的封装及线程池类成员变量的介绍 三、单例模式饿汉方式(EagerInitialization)懒汉方式(LazyInitialization)四、RAII类型的互斥锁 五、日志类的实现六、简单的任务类创建七、线程池的创建 一、线程池概念线程池(ThreadPool)是一种基于......
  • 抖音商家店铺电话采集工具 抖音小店商家电话导出软件
    淘宝商家电话采集器是一款方便快捷地获取淘宝商家电话号码的工具。无论是进行商业合作、咨询产品信息,还是维权投诉,获取商家的电话号码都是至关重要的。下面是一份淘宝商家电话采集器的使用指南,附带代码示例。让我们一起来了解如何使用这款实用工具。安装依赖库首先,在Python......
  • JavaEE——多线程
    接着上篇博客我们已经学习了进程的相关概念,了解到进程里面的相关重要属性,那么这篇博客呢我们要学习一个新的知识点——线程!一、引入进程的目的首先引入进程这个概念,是为了解决“并发编程”这样的问题。因为CPU再往小了做,比较困难了,这是因为CPU进入了多核心的时代,要想进一......
  • JavaEE——多线程Thread 类及常见方法
    目录 一、Thread(Stringname)二、是否后台线程isDeamon()三、是否存活isAlive()四、run()方法和start()方法的区别五、中断线程法一:法二:六、线程等待join()七、线程休眠sleep()一、Thread(Stringname)定义:这个东西是给线程(thread对象)起一个名字。起一个......
  • CSDN文章导出md并迁移至博客园
    一、获取所有文章地址1.进csdn首页,点击自己的头像 2.在个人主页界面,按F12打开控制台,并找到network,找到get-business开头的请求,右键copy他的url3.选择console,输入一下代码,其中fetch里面的url是你刚才复制的地址,并把里面的size改为100(这个是返回的文章内容数,上限为100),page是......