百万数据报表导出

  • 需求:使用Apache POI完成百万数据量的Excel报表导出
  • 对比:
    • 我们都知道Excel可以分为早期的Excel2003版本(使用POI的HSSF对象操作)和Excel2007版本(使用POI的XSSF
      操作),两者对百万数据的支持如下:
      • Excel 2003:在POI中使用HSSF对象时,excel 2003最多只允许存储65536条数据,一般用来处理较少的数据
        量。这时对于百万级别数据,Excel肯定容纳不了
      • Excel 2007:当POI升级到XSSF对象时,它可以直接支持excel2007以上版本,因为它采用ooxml格式。这时
        excel可以支持1048576条数据,单个sheet表就支持近百万条数据。但实际运行时还可能存在问题,原因是执
        行POI报表所产生的行对象,单元格对象,字体对象,他们都不会销毁,这就导致OOM(内存溢出)的风险
  • 方案:
    • 对于百万数据量的Excel导入导出,只讨论基于Excel2007的解决方法。在ApachePoi 官方提供了对操作大数据量的
      导入导出的工具和解决办法,操作Excel2007使用XSSF对象,可以分为三种模式:
      • 用户模式:用户模式有许多封装好的方法操作简单,但创建太多的对象,非常耗内存(之前使用的方法)
      • 事件模式:基于SAX方式解析XML,SAX全称Simple API for XML,它是一个接口,也是一个软件包。它是一
        种XML解析的替代方法,不同于DOM解析XML文档时把所有内容一次性加载到内存中的方式,它逐行扫描文
        档,一边扫描,一边解析
      • SXSSF对象:是用来生成海量excel数据文件,主要原理是借助临时存储空间生成excel
      • 官方介绍图片:
  • 分析:
    • 基于XSSFWork导出Excel报表,是通过将所有单元格对象保存到内存中,当所有的Excel单元格全部创建完成之后
      一次性写入到Excel并导出。当百万数据级别的Excel导出时,随着表格的不断创建,内存中对象越来越多,直至内
      存溢出。Apache Poi提供了SXSSFWork对象,专门用于处理大数据量Excel报表导出.
  • 解决:
    • 在实例化SXSSFWork这个对象时,可以指定在内存中所产生的POI导出相关对象的数量(默认100),一旦内存中
      的对象的个数达到这个指定值时,就将内存中的这些对象的内容写入到磁盘中(XML的文件格式),就可以将这些
      对象从内存中销毁,以后只要达到这个值,就会以类似的处理方式处理,直至Excel导出完成。
    • 就是在new的时候换成SXSSFWork对象,别的就跟正常的导出是一样的.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Qt中导出Excel通常使用QAxObject库,同时使用多线程可以提高程序的响应速度和效率。 以下是一个简单的示例代码,以导出一个包含50000个单元格的Excel表格为例: ```cpp #include <QApplication> #include <QAxObject> #include <QThread> class ExcelExporter : public QObject { Q_OBJECT public: ExcelExporter(QObject *parent = nullptr) : QObject(parent) {} public slots: void exportExcel() { QAxObject *excel = new QAxObject("Excel.Application", this); excel->setProperty("Visible", false); QAxObject *workbooks = excel->querySubObject("Workbooks"); QAxObject *workbook = workbooks->querySubObject("Add()"); QAxObject *worksheets = workbook->querySubObject("Worksheets"); QAxObject *worksheet = worksheets->querySubObject("Item(int)", 1); for (int i = 1; i <= 50000; i++) { QString cell = QString("A%1").arg(i); QAxObject *range = worksheet->querySubObject("Range(QString)", cell); range->setProperty("Value", i); delete range; } workbook->dynamicCall("SaveAs(const QString&)", "test.xlsx"); workbook->dynamicCall("Close()"); excel->dynamicCall("Quit()"); delete excel; } }; int main(int argc, char *argv[]) { QApplication a(argc, argv); ExcelExporter exporter; QThread thread; exporter.moveToThread(&thread); QObject::connect(&thread, &QThread::started, &exporter, &ExcelExporter::exportExcel); QObject::connect(&exporter, &ExcelExporter::finished, &thread, &QThread::quit); QObject::connect(&exporter, &ExcelExporter::finished, &exporter, &ExcelExporter::deleteLater); QObject::connect(&thread, &QThread::finished, &thread, &QThread::deleteLater); thread.start(); return a.exec(); } ``` 其中,`ExcelExporter`是一个QObject子类,用于导出Excel表格。`exportExcel()`是导出函数,该函数在另一个线程中运行。在`main()`函数中,我们将`ExcelExporter`移动到新线程中,并连接信号和槽以启动线程和在导出完成后关闭线程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值