基于POI的可快速定制Excel导出脚本设想

2023-11-04 09:59

本文主要是介绍基于POI的可快速定制Excel导出脚本设想,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于POI的可快速定制Excel导出脚本设想

背景

  年关将至,业务人员提出了好多比较着急但是又不常用的取数需求。所谓不常用,大概了是由于业务人员前期调研产生的临时需求,后续也不会大面积铺开,没必要专门分配人员去开发。所谓比较着急,开发人员开发出来需要一段时间,等到投产窗口投产又得一段时间,一定程度上可能错过这个市场机遇,基于此,提出这个设想。

  目前从网络上所查到的方法都是基于poi去实现的,且实现方法比较简单,不太适用于比较复杂的业务场景(超大规模数据导出(一个excel装不下),大规模数据分组(以千为单位)导出等),秉承着“用户至上”的原则,急业务人员之所急,想业务人员之所想,于是便提出了如此设想。

  为了能够满足可快速定制的功能,参考了一些开源项目的配置文件和流程控制文件,这些大都是基于yml文件和json文件去实现的,因此决定通过json+sql来实现可定制的功能

可定制的json文件

目前json文件设想如下:

{"fileName":"文件名称","titleTemplate" : [  //之所以用数组的形式是为了可以日后扩展为一个文件中多个sheet页{"sheetName" : "sheet页名称","title":[{"titleName": "表头的标题","headName": "与后续内容数据对应的一个key","heightSize": 单元格宽度}]}],"contentTemplate": [ //同样采用数组的方式是为了保证每个sheet都有对应的sql[{"execute":"select distinct street as street from epidemic_house",  //待执行的sql"args":"street",       //需要去传递的参数作为下个分组使用"split": true},{"execute":"select * from epidemic_house where street = ${street}" //需要导出文件用的sql,参数为上个sql传递过来的,根据上个sql执行结果分批执行,待生成文件sql无args参数(目前仅仅支持一个参数)}]]
}

json文件中的titleTemplate是为了生成导出excel中的标题信息,contentTemplate是通过sql去查询需要的数据,最后通过java代码去完成excel的拼接(目前只支持一个sheet页的处理,不支持多个sheet页的处理)

一个简单的样例

该案例是为了完成对待处理数据的超大规模分组,根据street参数生成每个street为分组的excel数据

{"fileName":"20221124高风险地区分类","titleTemplate" : [{"sheetName" : "poiScript测试","title":[{"titleName": "街道","headName": "street","heightSize":3000},{"titleName": "社区","headName": "village","heightSize":4000},{"titleName": "具体地区","headName": "location","heightSize":4500},{"titleName": "时间","headName": "time","heightSize":3000}]}],"contentTemplate": [[{"execute":"select distinct street as street from epidemic_house","args":"street","split": true},{"execute":"select * from epidemic_house where street = ${street}"}]]
}

代码部分

代码部分并无特别惊艳之处,只是实现了两个最主要的功能

  • 1、实现对超大规模数据拆分并生成多个excel
  • 2、实现通过sql的迭代查询从而完成超大规模数据的分组导出
    代码一:实现对超大规模数据拆分并生成多个excel
    /*** 提前判断内容的数据连是否过大excel是否装得下,是否需要分成多个excel文件* @param sheetName* @param titleData* @param contentData* @param fileName*/private void preCreateExcelFile(String sheetName, JSONArray titleData, JSONArray contentData, String fileName) {if(contentData.size() < EXCEL_ROE_LIMIT + 1)  {createExcelFile(sheetName, titleData, contentData, fileName);} else {int totalCount = contentData.size()/EXCEL_ROE_LIMIT + 1;for(int i=1;i<= totalCount; i++) {int fromIndex = (i-1)*EXCEL_ROE_LIMIT;JSONArray subContentData = new JSONArray();for(int j = fromIndex; j<((fromIndex+ + EXCEL_ROE_LIMIT)>contentData.size()?contentData.size():(fromIndex+ + EXCEL_ROE_LIMIT)); j++) {subContentData.add(contentData.getJSONObject(j));}createExcelFile(sheetName, titleData, subContentData, fileName + "part" + i);subContentData.clear();}}}

代码二:实现通过sql的迭代查询从而完成超大规模数据的分组导出

/*** 开始进行分文件处理* @param contentData 内容信息* @param titleData 标题信息*/private void createSplitExcelByFile(JSONArray contentData, JSONObject titleData, String fileName) {String args = "";JSONArray titleName = titleData.getJSONArray("title");List<Map<String, Object>> tempExecMap = Lists.newArrayList();for(int i=0;i<contentData.size();i++) {JSONObject contentJSON = contentData.getJSONObject(i);String execute = contentJSON.getString(EXECUTE);if(!StringUtils.isEmpty(args)) {//当前待执行的sql是最终生成文件的sql,执行处理if(CollectionUtils.isEmpty(tempExecMap)) {//如果不需要根据参数进行拆分的话,直接导出createExcelFile(titleData.getString(SHEET_NAME), titleName,  executeOrder(execute, titleName), fileName);} else {//需要分组,根据之前查询的分组结果进行拆分for(int j=0;j<tempExecMap.size();j++) {execute = execute.replaceAll("\\$\\{" + args + "\\}", "\"" + tempExecMap.get(j).get(args).toString() + "\"");preCreateExcelFile(titleData.getString(SHEET_NAME), titleName,  executeOrder(execute, titleName), fileName+tempExecMap.get(j).get(args));execute = contentJSON.getString(EXECUTE);}}} else {//有参数,表示当前待处理的sql并不是最终生成文件的sql,作为前置查询条件继续执行tempExecMap = poiScriptService.executeOrder(execute);args = contentJSON.getString(ARGS);}}}

样例json执行结果

这些excel根据超大规模分组实现的,共分类为五百个excel,每个excel数据量上万,截图仅展示一小部分

在这里插入图片描述

详细的代码链接请看:https://github.com/rootdeng77/rootdeng.github.io/tree/master/src/main/java/com/example/rootdeng/POIScript

这篇关于基于POI的可快速定制Excel导出脚本设想的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/344989

相关文章

使用EasyPoi快速导出Word文档功能的实现步骤

《使用EasyPoi快速导出Word文档功能的实现步骤》EasyPoi是一个基于ApachePOI的开源Java工具库,旨在简化Excel和Word文档的操作,本文将详细介绍如何使用EasyPoi快速... 目录一、准备工作1、引入依赖二、准备好一个word模版文件三、编写导出方法的工具类四、在Export

前端导出Excel文件出现乱码或文件损坏问题的解决办法

《前端导出Excel文件出现乱码或文件损坏问题的解决办法》在现代网页应用程序中,前端有时需要与后端进行数据交互,包括下载文件,:本文主要介绍前端导出Excel文件出现乱码或文件损坏问题的解决办法,... 目录1. 检查后端返回的数据格式2. 前端正确处理二进制数据方案 1:直接下载(推荐)方案 2:手动构造

C#利用Free Spire.XLS for .NET复制Excel工作表

《C#利用FreeSpire.XLSfor.NET复制Excel工作表》在日常的.NET开发中,我们经常需要操作Excel文件,本文将详细介绍C#如何使用FreeSpire.XLSfor.NET... 目录1. 环境准备2. 核心功能3. android示例代码3.1 在同一工作簿内复制工作表3.2 在不同

java读取excel文件为base64实现方式

《java读取excel文件为base64实现方式》文章介绍使用ApachePOI和EasyExcel处理Excel文件并转换为Base64的方法,强调EasyExcel适合大文件且内存占用低,需注意... 目录使用 Apache POI 读取 Excel 并转换为 Base64使用 EasyExcel 处

Python Excel 通用筛选函数的实现

《PythonExcel通用筛选函数的实现》本文主要介绍了PythonExcel通用筛选函数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录案例目的示例数据假定数据来源是字典优化:通用CSV数据处理函数使用说明使用示例注意事项案例目的第一

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

Java利用Spire.XLS for Java设置Excel表格边框

《Java利用Spire.XLSforJava设置Excel表格边框》在日常的业务报表和数据处理中,Excel表格的美观性和可读性至关重要,本文将深入探讨如何利用Spire.XLSforJava库... 目录Spire.XLS for Java 简介与安装Maven 依赖配置手动安装 JAR 包核心API介

springboot集成easypoi导出word换行处理过程

《springboot集成easypoi导出word换行处理过程》SpringBoot集成Easypoi导出Word时,换行符n失效显示为空格,解决方法包括生成段落或替换模板中n为回车,同时需确... 目录项目场景问题描述解决方案第一种:生成段落的方式第二种:替换模板的情况,换行符替换成回车总结项目场景s

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定