在日常工作中,经常可能会使用到poi来进行数据导出,但是在导出的过程中,如果对poi类使用不当,则可能会出现一些问题,比较严重,下面对poi中三种不同的类来进行说明。

1. HSSFWorkbook(excel 2003)

HSSFWorkbook 针对是 EXCEL2003 版本,扩展名为 .xls;所以 此种的局限就是 导出的行数 至多为 65535 行,此种 因为行数不够多 所以一般不会发生OOM。

2.  XSSFWorkbook (excel 2007)

这种形式的出现 是由于 第一种HSSFWorkbook 的局限性而产生的,因为其所导出的行数比较少,所以 XSSFWookbook应运而生 其 对应的是EXCEL2007+(1048576行,16384列)扩展名 .xlsx,最多可以 导出 104 万行,不过 这样 就伴随着一个问题---OOM 内存溢出,原因是 你所 创建的 book sheet row cell 等 此时是存在 内存的 并没有 持久化,那么 随着 数据量增大 内存的需求量也就增大,那么很大可能就是要 OOM了。

3. SXSSFWorkbook(excel 2007后,poi使用3.8+版本)

因为数据量过大 导致内存吃不消 那么 可以 让内存 到量持久化 吗? 
答案是 肯定的,

此种的情况 就是 设置 最大 内存条数 比如  设置 最大内存量为5000 rows  --new SXSSFWookbook(5000),此时 当 行数 达到 5000 时,把 内存 持久化 写到 文件中,以此 逐步 写入  避免OOM,那么这样 就完美解决了大数据下导出的问题;

下面给出一个使用SXSSFWorkbook来进行excel导出的模版工具类:

这里需要注意的是导出的SXSSFWorkbook 是一个Workbook类,可以直接使用write方法写入OutputStream;

其次吗,传入的headers这个Map是list对象中的列名与字段名的对应,如:

map.put("num", "序号");
map.put("applyId", "申请编号");

e.g:

 /**** @param title*            sheet名* @param headers*            标题* @param list*            数据列表*/public static <T> SXSSFWorkbook export(String title, Map<String, String> headers, List<T> list) {SXSSFWorkbook workbook = new SXSSFWorkbook();// 声明一个工作薄generateSheet(title, headers, list, workbook);return workbook;}private static void generateHeaders(SXSSFRow row, Map<String, String> headers) {int i = 0;Cell cell;XSSFRichTextString text;for (Map.Entry<String, String> header : headers.entrySet()) {cell = row.createCell(i);text = new XSSFRichTextString(header.getValue());cell.setCellValue(text);i++;}}public static String formatString(Object s) {if (s == null || "null".equals(String.valueOf(s))) {return "";}Pattern pattern = Pattern.compile("[0-9]*");String data = s.toString().replaceAll(",", ",");if (pattern.matcher(data).matches() && data.length() > 12) {return data + "\t";} else {return data;}}public static <T> void generateSheet(String title, Map<String, String> header, List<T> list,SXSSFWorkbook workbook) {SXSSFSheet sheet = workbook.createSheet(title);// 生成一个表格sheet.setDefaultColumnWidth(15);// 设置表格默认列宽度为15个字节SXSSFRow row = sheet.createRow(0);// 产生表格标题行generateHeaders(row, header);JSONObject json;for (int i = 0; i < list.size(); i++) {row = sheet.createRow(i + 1);json = JSONObject.fromObject(list.get(i));int cellCount = 0;Cell cell;for (Map.Entry<String, String> column : header.entrySet()) {cell = row.createCell(cellCount++);if (column.getKey().split("\\.").length == 2) {// Object.nameJSONObject subJson = JSONObject.fromObject(json.get(column.getKey().split("\\.")[0]));if (subJson.isEmpty()) {cell.setCellValue("");} else {cell.setCellValue(formatString(subJson.get(column.getKey().split("\\.")[1])));}} else {if (column.getKey().equals("num")) {cell.setCellValue(i + 1);} else {cell.setCellValue(formatString(json.get(column.getKey())));}}}}}

使用POI进行数据导出excel时的OOM服务挂掉,cpu飙升的问题相关推荐

  1. 使用easypoi和原生poi接口实现导出excel时选中指定单选框

    使用easypoi和原生poi接口实现导出excel时选中指定单选框 工程需求:导出excel时,选中指定的单选框 步骤一:在excel模板中插入三个单选框 步骤二:设置单选框的单元格连接 我们发现 ...

  2. Java程序员从笨鸟到菜鸟之(一百零四)java操作office和pdf文件(二)利用POI实现数据导出excel报表...

    在上一篇博客中,我们简单介绍了java读取word,excel和pdf文档内容 ,但在实际开发中,我们用到最多的是把数据库中数据导出excel报表形式.不仅仅简单的读取office中的数据.尤其是在生 ...

  3. 解决POI大数据导出Excel内存溢出、应用假死

    最近公司一个06年统计项目在导出Excel时造成应用服务器内存溢出.假死现象:查看代码发现问题一次查询一整年的数据导致堆内存被撑爆(假死),随后改用批量查询往Excel中写数据,同样的问题又出现了!! ...

  4. java批量文件打包成压缩成zip下载和大量数据导出excel时的处理方法

    对于我们来说,java导出数据成excel或其他数据文件,或者下载资源是开发中的家常便饭, 但是在导出的时候,如果点击一个按钮导出几百万条数据,如果不作处理的话很可能会出现一系列的问题. 这里介绍打包 ...

  5. POI导出Excel时下拉列表值超过255的问题(String literals in formulas can‘t be bigger than 255 characters ASCII)

    一.简单的描述问题:(记录问题) 首先说一下我们导出的这个Excel表,我们是通过POI来生成一个Excel表,然后在Excel表中添加了下拉列表,然后将数据库中取出的数据放到下拉列表中,这样每次导出 ...

  6. java excel中重复数据 事务处理_Java导出excel时合并同一列中相同内容的行思路详解...

    一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...

  7. hutool导出excel时对数据进行单元格合并

    使用hutool导出excel时,可以使用ExcelWriter类中的merge(int firstRow, int lastRow, int firstCol, int lastCol)方法对单元格 ...

  8. Controller数据导出Excel 详细教程——easypoi-base,easypoi-web,easypoi-annotation

    Controller获取数据导出Excel,详细教程 1:导入对应依赖 <dependency><groupId>cn.afterturn</groupId>< ...

  9. 大量数据导出Excel方案

    序 最近可能会遇到大量数据导出Excel的场景,今天趁现在需求告一段落来做下技术预研,然后这里就顺便分享给大家. 一.数据量预判 因为我们是做物联网的,这里要导出的数据就是设备的上报数据.客户说要这些 ...

最新文章

  1. qt 启动画面显示图片_用QT实现软件启动画面的效果,学习参考!
  2. 利用Inotify和Rsync将webproject文件自己主动同步到多台应用server
  3. IE8提示JS错误(KB927917)终极解决方法
  4. shell之九九乘法表
  5. 获取套接字相关联信息
  6. Iterator作用
  7. TimeJot – Last Time 改名,新增中文界面、数字属性,还是那个时间线管理神器[Android]
  8. oracle u01目录 100,文件目录空间利用率达到100%而导致数据库异常挂起的故障处理过...
  9. SQL Server数据库迁移最佳实践,可降低风险和停机时间
  10. excel制作跨职能流程图_你会用Excel制作流程图吗?超级强大的功能
  11. 三羊献瑞——第六届蓝桥杯C语言B组(省赛)第三题
  12. PETS:伯克利大神Sergey Levine指导的概率集成轨迹采样算法
  13. 微信团队分享:微信支付代码重构以及软件架构上的思考
  14. Css选择器命名规则
  15. 软考中级软件设计师教程(第5版)知识点笔记第一章计算机系统知识持续更新中...
  16. Navicat安装教程
  17. 个人打卡签到表html代码,员工日常工作出勤签到登记表模板
  18. 三星s6如何打开位置服务器,三星S6开发者选项在哪里?怎么打开
  19. “互联网+”拯救了星巴克
  20. oracle 数据库如何获取一条sql语句执行所消耗耗费的时间?

热门文章

  1. r740服务器增加内存,戴尔R740服务器获取cpu、内存、硬盘参数信息。
  2. java swing form_在java swing中创建表单最简单的方法是什么?
  3. python文件读写_python基础-文件读写'r' 和 'rb'区别
  4. 八十一、最快最优的快速排序和优化
  5. 二、HDFS基本架构和shell操作
  6. 一块V100运行上千个智能体、数千个环境,这个曲率引擎框架实现RL百倍提速
  7. 京东 | AI人才联合培养计划
  8. 如何用Transformer来做目标检测?一文简述DERT及其变体
  9. 在物体检测任务上进行预训练的实验分析
  10. 直播 | SemEval-2020自由文本关系抽取冠军方案解读(附NLP竞赛常用技巧总结)