-
使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)
2020-11-29 16:49:38使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)
参考文章:
(1)使用NPOI或POI 导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)
(2)https://www.cnblogs.com/daxiongblog/p/11388729.html
备忘一下。 -
poi导出excel (大数据)
2016-03-29 23:18:37POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。... 3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处理较少POI之前的版本不支持大数据量处理 如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。3.8版本的POI新出来了SXSSFWorkbook,可以支持大数据量的操作,只是SXSSFWorkbook只支持.xlsx格式,不支持.xls格式。
3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处理较少的数据量,SXSSFWorkbook用来处理大数据量以及超大数据量的导出。
HSSFWorkbook的使用方法和之前的版本的使用方法一致,这里就不在陈述使用方法了
SXSSFWorkbook的使用例子如下:public static void downExcel(String pathUrl) throws Exception{ File f = new File(pathUrl); FileOutputStream out = new FileOutputStream(f); Workbook workbook = new SXSSFWorkbook(); Sheet sheet = workbook.createSheet("第一页"); for (int i =0;i<1000;i++){ Row row = sheet.createRow(i); Cell cell0 = row.createCell(0); cell0.setCellValue("小时候可牛了"+i); Cell cell1 = row.createCell(1); cell1.setCellValue("小时候可帅了"+i); Cell cell2 = row.createCell(2); cell2.setCellValue("小时候可牛了"+i); Cell cell4 = row.createCell(3); cell4.setCellValue("小时候可牛了"+i); Cell cell5 = row.createCell(4); cell5.setCellValue("小时候可牛了"+i); Cell cell6 = row.createCell(5); cell6.setCellValue("小时候可牛了"+i); Cell cell7 = row.createCell(6); cell7.setCellValue("小时候可牛了"+i); } workbook.write(out); out.flush(); out.close(); workbook.close(); }
-
poi导出大数据excel
2014-02-25 10:10:09使用poi导出大量数据,避免内存溢出问题 -
POI3.8 导出大数据excel
2016-10-17 17:23:48今天项目需要导出站点对应的频道展示,导出时使用的poi3.8中的HSSFWorkbook workBook =new HSSFWorkbook();来创建workBook,但是在循环样式的时候,会报java.lang.IllegalStateException: The maximum number of ...今天项目需要导出站点对应的频道展示,导出时使用的poi3.8中的HSSFWorkbook workBook =new HSSFWorkbook();来创建workBook,但是在循环样式的时候,会报:
java.lang.IllegalStateException: The maximum number of cell styles was exceeded. You can define up to 4000 styles in a .xls workbook
详情见:
报错解决办法SXSSFWorkbook workBook =new SXSSFWorkbook();@RequestMapping(value="/api/uploadExcelByPoi",method=RequestMethod.GET)public void uploadExcelByPoi(@RequestParam(value="chSiteId", required=true) Integer chSiteId,HttpServletRequest request,HttpServletResponse response){ //查询需要的集合 List<FocChannel> list = focChannelsService.uploadExcelByPoi(chSiteId); //3.创建workbook SXSSFWorkbook workBook =new SXSSFWorkbook(); //根据workBook创建sheet Sheet sheet = workBook.createSheet("站点频道展示"); //根据sheet创建行 Row rowHead = sheet.createRow(0); //创建excel的头部标题行,及标题行的样式的设置 createTitleCell(workBook,rowHead,sheet); //创建主题内容 buildMainbody(list, workBook, sheet); //导出Excel downLoadExcel(request, response, workBook); } private void downLoadExcel(HttpServletRequest request, HttpServletResponse response, SXSSFWorkbook workBook) { SimpleDateFormat sim=new SimpleDateFormat("yyyyMMddhhmmss"); String strDate = sim.format(new Date()); //随机数 RandomStringUtils randomStringUtils=new RandomStringUtils(); //生成指定长度的字母和数字的随机组合字符串 String randomStr = randomStringUtils.randomAlphanumeric(5); String xlsName= strDate+randomStr+"站点频道信息表.xls" ; FileUtil.downloadXLSFile(request, response, workBook, xlsName); } private void buildMainbody(List<FocChannel> list, SXSSFWorkbook workBook, Sheet sheet) { for (int i = 0; i < list.size(); i++) { buildMainBodyAandMainBodyStyle(list, workBook, sheet, i); } } private void buildMainBodyAandMainBodyStyle(List<FocChannel> list, SXSSFWorkbook workBook, Sheet sheet, int i) { CreationHelper createHelper = workBook.getCreationHelper(); CellStyle cellStyle = workBook.createCellStyle(); cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("yyyy-MM-dd")); Row rowBody = sheet.createRow(i+1); //创建列 FocChannel foc = list.get(i); Cell idCell= rowBody.createCell(0); idCell.setCellValue(i+1); Cell timeCell = rowBody.createCell(1); SimpleDateFormat sim=new SimpleDateFormat("yyyy-MM-dd"); timeCell.setCellValue(sim.format(new Date())); Cell inspectCell = rowBody.createCell(2); inspectCell.setCellValue("新增"); Cell websiteCell= rowBody.createCell(3); websiteCell.setCellValue("网站"); Cell webSiteNameCell= rowBody.createCell(4); webSiteNameCell.setCellValue(foc.getChCascadeName()); Cell accountCell = rowBody.createCell(5); accountCell.setCellValue("频道"); Cell urlCell= rowBody.createCell(6); urlCell.setCellValue(foc.getChUrl()); Cell newUrlCell=rowBody.createCell(7); newUrlCell.setCellValue(""); Cell causeCell=rowBody.createCell(8); causeCell.setCellValue(""); CellStyle fontStyle = bulidMainFontStyleHead(workBook); idCell.setCellStyle(fontStyle); //timeCell.setCellStyle(cellStyle); timeCell.setCellStyle(fontStyle); inspectCell.setCellStyle(fontStyle); websiteCell.setCellStyle(fontStyle); webSiteNameCell.setCellStyle(fontStyle); accountCell.setCellStyle(fontStyle); urlCell.setCellStyle(fontStyle); newUrlCell.setCellStyle(fontStyle); causeCell.setCellStyle(fontStyle); } /** * 创建excel的头部标题行 * @param rowHead * @param sheet */ private void createTitleCell(SXSSFWorkbook workBook,Row rowHead, Sheet sheet) { //根据row创建cll Cell idCell = rowHead.createCell(0); idCell.setCellValue("序号"); Cell timeCell = rowHead.createCell(1); timeCell.setCellValue("反馈时间"); Cell inspectCell = rowHead.createCell(2); inspectCell.setCellValue("新增/核查"); Cell websiteCell = rowHead.createCell(3); websiteCell.setCellValue("网站/论坛"); Cell webSiteNameCell = rowHead.createCell(4); webSiteNameCell.setCellValue("名称"); Cell accountCell = rowHead.createCell(5); accountCell.setCellValue("频道/账号"); Cell urlCell = rowHead.createCell(6); urlCell.setCellValue("频道链接"); Cell newUrlCell=rowHead.createCell(7); newUrlCell.setCellValue("涉及新闻链接"); Cell causeCell=rowHead.createCell(8); causeCell.setCellValue("核查原因"); CellStyle buildStyleTitle = bulidFontStyleHead(workBook); buildStyleTitle.setWrapText(true);//设置自动换行 idCell.setCellStyle(buildStyleTitle); timeCell.setCellStyle(buildStyleTitle); inspectCell.setCellStyle(buildStyleTitle); websiteCell.setCellStyle(buildStyleTitle); accountCell.setCellStyle(buildStyleTitle); urlCell.setCellStyle(buildStyleTitle); webSiteNameCell.setCellStyle(buildStyleTitle); causeCell.setCellStyle(buildStyleTitle); newUrlCell.setCellStyle(buildStyleTitle); //设置列宽(给时间的单元格的宽度给大点,防止时间显示格式错误!) sheet.setColumnWidth(0, 20*256); sheet.setColumnWidth(1, 20*300); sheet.setColumnWidth(2, 20*256); sheet.setColumnWidth(3, 20*256); sheet.setColumnWidth(4, 20*256); sheet.setColumnWidth(5, 20*256); sheet.setColumnWidth(6, 20*500); sheet.setColumnWidth(7, 20*400); sheet.setColumnWidth(8, 20*400); } private CellStyle bulidMainFontStyleHead(SXSSFWorkbook workBook) { //设置样式 CellStyle style = workBook.createCellStyle(); Font font = workBook.createFont(); font.setFontHeightInPoints((short) 11);//字号 //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗 //font.setColor(HSSFColor.RED.index);//设置字体颜色 font.setFontName("微软雅黑"); // 将“黑体”字体应用到当前单元格上 style.setFont(font); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//内容左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//内容上下居中 return style; } private CellStyle bulidFontStyleHead(SXSSFWorkbook workBook) { //设置样式 CellStyle style = workBook.createCellStyle(); Font font = workBook.createFont(); font.setFontHeightInPoints((short) 11);//字号 font.setBoldweight(Font.BOLDWEIGHT_BOLD);//加粗 //font.setColor(HSSFColor.RED.index);//设置字体颜色 font.setFontName("黑体"); // 将“黑体”字体应用到当前单元格上 style.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());//北京颜色 style.setFillPattern(CellStyle.SOLID_FOREGROUND); // style.setFillBackgroundColor(HSSFColor.GREY_40_PERCENT.index); style.setFont(font); style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//内容左右居中 style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//内容上下居中 return style; }
-
apache poi 写excel 大数据_Excel也能玩转大数据,Power Query了解一下?
2020-11-30 03:41:48前言最近实务上连续遇到两个类似的案例,合并为一个其实就是超大数据量的表格合并加透视的问题,比如从业务系统内导出一个月的数据就有30万行以上,Excel文档的大小在50M左右,需要合并透视整年或数年的数据。...点击上方蓝色字关注我们!前言
最近实务上连续遇到两个类似的案例,合并为一个其实就是超大数据量的表格合并加透视的问题,比如从业务系统内导出一个月的数据就有30万行以上,Excel文档的大小在50M左右,需要合并透视整年或数年的数据。
手工粘贴再透视的话,最主要的问题就是Excel不支持100万行以上的数据,所以你连享受Excel文档卡死的资格都没有。
碰到这种问题用SQL当然好,数据量完全不在话下,各种汇总、查询的速度都非常快,不过对于看到英文字母就头晕的同学来说就不太友好了,虽然学习起来并不难,但依旧有一定门槛,常用的查询代码一般也要摸3天才能摸熟。话说回来,虽然我学了这玩意儿,但是在实务中真正用到的次数却屈指可数,导致我每次使用的时候都要回头把之前学的东西再捡一遍,也许是自己涉及这个数据量级的项目不多吧。
简介
其实MS对于Excel数据量的限制也早有了解决方案,那就是Power Query和Power Pivot。
在Excel2010时,MS推出了Power Query的插件(可以在官网下载),使得Excel处理数据的能力大幅提升,在Excel2016中直接内置了Power Query,放在数据选项卡中:
Power Query可以理解为一个查询数据的软件,这个名字可以类比微软自家的其他软件,比如我们熟知的PPT叫"PowerPoint"。
Power Pivot可以理解为透视表软件,它比Excel内置的透视表强大了很多,一般被用来建立数据模型,对于我们来说就把他当做超级透视表就行了。
其实Power Pivot就是微软把自家数据库SQL Server的分析服务引擎拆出来装到了Excel中。
顺便提一句:MrExcel.com创始人Bill这样说:Power Pivot是Excel在20年的改进中最棒的改进。
所以说,你学这个就够了,懂伐?
在Excel的COM加载项中,把Power Pivot调出来:
上面大概介绍了一下PQ和PP,可能你会觉得有点绕,很复杂的样子,其实这个东西用起来真的很简单,在试用了几次Power Pivot后,我觉得对于财审人员日常的工作来说,基本上可以不用去学SQL了,因为用PQ用起来不需要学什么代码,最多就几个函数稍微记一下,其他的都靠点,并且上载进Excel后,数据透视什么就跟平时普通的透视操作一样,大幅降低了学习成本。
如果你手里有Office Excel2016的话,下载案例花几分钟跟着我的步骤走一遍试试吧,以后碰到几百万行的表也不怕了。
本文的案例,后台回复【PQ】获取下载地址。
案例
需求
下面我以一个40-50万数据的例子,来简单的演示一下怎样用PQ:
这里有两个月的数据,我通过复制,把数据拉到47万行和57万行,单个文档的大小在25-30M。
需求:将其合并,再一起透视。
先直接看动图吧,真的很简单,之前手工几小时都搞不定的东西,用这个只需要2分钟就能搞定。
1.载入数据并调整数据类型:
2.上载至Excel并数据透视:
01
使用power query载入数据
1.在数据选项卡中,依次点击【从文件】-【从文件夹】
2.选好了文件夹路径后,可以看到要导入的文档都进来了,确认没问题后,点击右下角的【编辑】↓
3.进入编辑界面后,我们看到文档的信息都被导入进来了↓
4.表格中的数据都以二进制的形式储存在第一列"content"中,所以我们需要用一个函数把他们提取出来:
5.依次点击选项卡【添加列】-【自定义列】
输入函数"=Excel.Workbook([content],true)",注意大小写,大家直接复制就行。
这个函数的两个参数:
1.[content]就是要解析的列名。
2.如果每个文档的第一行是标题行,就写true,他会把所有的文档标题行放在第一行并去重。
一般来说,我们直接复制这个函数就行了。
如果是csv的文件,函数为:Csv.Document([Content],[Delimiter=",", Encoding=936])
6.输入好函数后,点击确定,可以看到我们的自定义列,点击右上角的展开按钮。
7.在新出来的列中,找到Data列,继续点击右上角的展开按钮,我们需要的数据就全部合并且加载进来了。
8.加载完成后,会自动选中展开的数据,点击鼠标右键-删除其他列,留下我们需要的列即可。
02
转换数据类型,上载至Excel
1.加载进来后,数据类型一般会自动变成文本,如果我们不进行数据类型的转换的话,在后面的透视过程中是不能求和的,因此,在这里把小数、日期都直接转换好↓
2.转换数据类型后,将PQ编辑器中的数据上载至Excel中:
如果数据量大的话,尽量不要直接点关闭并上载,否则所有数据直接灌入Excel就爆炸了,这个按钮我建议只有汇总多个相同格式的工作簿且单个工作簿的数据不多的情况下使用。
在弹出的选项框中,选中【仅创建连接】并勾选【将此数据添加到数据模型】
这样的话,所有的数据就没有直接添加进Excel中,Excel仅作为呈现数据的界面,查询等操作都在PQ的引擎中进行。
加载完成后,在Excel的右侧会显示加载状态。
03
数据透视
前面已经把所有的文档通过PQ上载进Excel中了,到了数据透视这一步就是所有人都熟悉的:插入透视表-选择字段并进行透视了。
这里唯一要说的就是勾上【使用此工作簿的数据模型】
之后的操作就完全和透视表完全一样了。
04
刷新数据源
之前我们导入了7、8月的表,如果我们又获取了9-12月表,那么直接把文档放在同一文件夹下,在Excel的右侧点击刷新,就能把新增的表按上述步骤自动过进来,再也不用手动进行设置了。
这篇文章我用最简单的案例把PQ全部流程都走了一遍,在实际情况中大家应该会碰到一些别的坑,比如有些数据我们是不需要的,那么在PQ编辑器中上载至Excel之前,筛选需要的内容即可,上载的内容为筛选后的内容。
这个功能熟练之后,以后同一个格式的汇总,无论是多工作表还是多工作簿的都不在话下了,更多的技巧可以去知乎或者相关的论坛看看。
end
如果文章对你有帮助,点一下右下角的[在看]吧,谢谢你的支持。
-
poi多线程大数据导出excel文件.zip
2020-08-14 09:20:36对大数据量的导出excel,用多线程,用倒数计数器对文件进行生成,使用poi,可以支持大数据量的生成,项目中使用的poi是3.1的,上传的是4.1的。 -
apache poi 写excel 大数据_开源推荐:POI库在Java下的批量导入导出实战(兼容xls,xlsx)
2020-11-20 10:31:59目前我所接触过的导入导出技术主要有POI和iReport,poi主要作为一些数据批量导入数据库,iReport做报表导出。另外还有jxl类似poi的方式,不过貌似很久没跟新了,2007之后的office好像也不支持,这里就不说了。2、POI... -
poi excel大数据导出-SXSSFWorkbook
2017-06-29 14:40:31POI之前的版本不支持大数据量处理,如果数据过多则经常报OOM错误,有时候调整JVM大小效果也不是太好。... 3.8版本的POI对excel的导出操作,一般只使用HSSFWorkbook以及SXSSFWorkbook,HSSFWorkbook用来处 -
使用POI3.8导出大数据excel方法(解决内存溢出)
2013-04-28 16:27:48工作中遇到大数据导出excel内存溢出的问题,在使用jxl和POI3.8之前的版本都找不到很好的解决办法,通过设置jvm内存效果也不理想。但是在POI3.8以上版本中提供了SXSSFWorkbook的新类,可以通过参数设置常驻内存中的... -
POI3.8 导出大数据excel(50万左右)
2014-11-12 09:19:11转载地址http://blog.csdn.net/yys79/article/details/26443603 -
poi导出excel支持xls、xlsx格式大数据导出java工具类
2018-03-30 09:24:25使用poi导出excel支持xls、xlsx格式大数据导出java工具类,支持同一个单元格不同文本格式。找了好久,加上自己修改后,调试通过,发布出来分享,(调整student类位置)包含所需jar包,工具类,使用示例 -
poi导出大数据,先生成多个excel在生成一个jar包
2017-04-19 10:21:13poi导出大数据,先生成多个excel在生成一个jar包 -
java通过poi导出大数据的excel
2018-03-06 10:54:10java中导出excel第一步 创建一个个workbook对象创建一个工作空间设置表格样式第二部 设置标题 设置表列sheet.createRow(rownum++); 创建一行第三部 设置表列sheet.createRow(rownum++);创建一行第四部 创建行对象... -
POI生成Excel格式大数据导入导出报表
2020-02-23 14:10:52一、 技术 二、 Excel格式报表生成POI 1、 Excel导入大数据 (一) 、依赖 (二) 、模板编写 (三) 、Handler编写 (四)、SpringUtil ...2、 Excel导出大数据 (一)、Controller层 (二) 、ExcelExport... -
poi大数据导出excel
2018-11-13 20:40:46由于本人采取的是利用反射的方式,这样的好处,可以兼容,导出所有类型的数据,例如,订单,充值记录等等。 既然是公有的接口,肯定有一定的约束规范。 (1)导出的表头需要自己设置一个动态数组 (2) 头部的宽度... -
基于haddop的HDFS和Excel开源库POI导出大数据报表(二)
2016-08-28 10:12:33接着上一篇《基于haddop的HDFS和Excel开源库POI导出大数据报表(一)》的遗留的问题开始,这篇做优化处理。 优化导出流程 在一开始的时候,当我获取到订单的数量,遍历订单,获取用户id和用户的地址id,逐条查询,... -
easypoi 大数据 百万_POI导出Excel,百万数据量
2020-12-30 13:08:27大数据量导出到Excelpublic static void Excel2007AboveOperate(String filePath) throws IOException {XSSFWorkbook workbook1 = new XSSFWorkbook(new FileInputStream(new File(filePath)));SXSSFWorkbook ... -
基于haddop的HDFS和Excel开源库POI导出大数据报表
2018-04-28 22:10:44关键词Java、PHP、hdfs、mqrocket、excel、poi、报表需求背景在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的输出即可完成,只要指定respose的相应Content-Type即可。... -
POI导出大数据工具类
2018-04-29 23:50:46/** * 本文转自自码云https://gitee.com/guokeyunman/poi-commons/repository/archive/tanx1.0.zip,如有侵权请联系删除 */package com.goktech.commons.excel.utils.writer;import java.io.IOException;import ... -
POI -- 02 -- Excel大数据导出
2019-06-03 21:25:03之前提及了 Excel 大数据的读取,现在我们再来了解下 Excel 大数据的导出 结合官方文档 (SXSSF) 给出的例子,归纳如下 Excel 工具类 public class LargeExcelExportUtil { /** * 生成单个sheet * * @param ... -
基于haddop的HDFS和Excel开源库POI导出大数据报表(一)
2016-08-21 18:56:28Java、PHP、hdfs、mqrocket、excel、poi、报表 需求背景 在业务需求方面,每个企业或多或少都会有报表导出的作业,量少则可是使用输出流或者字符串的输出即可完成,只要指定respose的相应Content-Type即可。如果大量... -
Springboot+poi导出Excel
2018-11-05 06:27:50Springboot+poi导出Excel 一、引入jar包 注意需要引入3.8版本,POI3.8提供了SXSSFWorkbook类,来处理大数据内存溢出的问题.可设置默认内存大小,多出的部分可存入硬盘中,不会内存溢出. <!-- poi依赖 --> <... -
java 使用POI导出大数据,服务器内存不释放
2016-04-20 05:49:07RT,我用java 使用POI导出大数据, 数据是可以导出来。但是服务器的内存一直不释放。导一次 内存就会增加100M-2G 视数据量大小。当超过JVM设置的15G时,服务就会瘫痪掉,无法访问、 主要代码如下, ``` MapList ... -
解决POI大数据导出Excel内存溢出、应用假死
2017-09-16 17:42:02最近公司一个06年统计项目在导出Excel时造成应用服务器内存溢出、假死现象;查看代码发现问题一次查询一整年的数据导致堆内存被撑爆(假死),随后改用批量查询往Excel中写数据,同样的问题又出现了!!!随后在网上... -
Excel大数据导出处理
2017-02-28 15:33:00项目数据导出使用3.6poi导出Excel表,在数据量不大的情况的可以正常导出。当数据量非常大时,容易造成内存溢出。 HSSFWorkbook 2003(行数列数限制) XSSFWorkbook 2007以上(可以满足中等数量数据的导出,但...
-
数量遗传与动植物分子育种:理论、技术和平台-报告19徐云碧.pdf
-
国家注册渗透测试工程师(Web安全)
-
【数据分析-随到随学】Spark理论及实战
-
【分布式技术】--分布式事务Seata-2
-
C# 面向对象之关于静态static
-
T+专属云15.0新增功能
-
【数据分析-随到随学】Hive详解
-
火绒右键管理助手——Windows可用
-
windows运行go项目完整教程.zip
-
Go操作Mysql
-
小学数学知识点大全 (代数初步知识)<NLP 颜色标记>
-
基于STM32F03ZET6移植RT-Thread
-
2021年茶艺师(初级)复审考试及茶艺师(初级)考试申请表
-
C# 嵌套类、匿名类与密封类
-
2021年美容师(中级)多少分及格及美容师(中级)新版试题
-
信号的采样及采样定理.pdf
-
转行做IT-第1章 计算机基础
-
【数据分析-随到随学】Mysql数据库
-
云计算基础-Linux系统管理员
-
2021年R2移动式压力容器充装考试及R2移动式压力容器充装考试APP