使用Apache POI生成xlsx格式Excel文件

Apache POI个人总结

开发者在使用java开发Microsoft Office相关办公文件时,Apache POI常常会被使用到,对比其它工具,它提供的接口更加丰富,功能也更加全面,其官网资料和样例也非常丰富(样例在官网的Components APIs栏目下)。个人认为无需在它和EasyExcel等之间纠结使用哪个,看自己的需求和喜好吧!使用POI时,一定要注意以下两个问题:

1. Out of Memory exception,官网上已经有多次针对这个bug的修复,例如新增SXSSFWorkbook处理大数据量,但POI依旧会占用非常多的运存,开发完成后一定要多造点数据和场景去测试。

2. 因为POI使用了log4j,复杂点的项目都会很容易发生依赖冲突,发生冲突时,常见以下错误

Exception in thread "main" java.lang.NoSuchMethodError: org.apache.logging.log4j.Logger.atTrace()Lorg/apache/logging/log4j/LogBuilder;
	at org.apache.xmlbeans.impl.schema.SchemaTypeSystemImpl.<init>(SchemaTypeSystemImpl.java:196)
	at org.apache.poi.schemas.ooxml.system.ooxml.TypeSystemHolder.<init>(TypeSystemHolder.java:9)
	at org.apache.poi.schemas.ooxml.system.ooxml.TypeSystemHolder.<clinit>(TypeSystemHolder.java:6)
	at org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook.<clinit>(CTWorkbook.java:22)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.onWorkbookCreate(XSSFWorkbook.java:475)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:232)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:226)
	at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:214)
	at poi.SimpleHoldReport.main(SimpleHoldReport.java:22)

Process finished with exit code 1

实例

该实例可在GithubGitee上找到,大家可以用作参考。假设有以下模拟数据,我们需要用这些数据生成一个2007(+)版本的持仓报表excel文件

    p
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
POI海量数据⼤数据⽂件⽣成 海量数据⼤数据⽂件⽣成SXSSFWorkbook使⽤简介 使⽤简介   在之前我们知道处理xls的excel⽤的workbook是HSSFWorkbook,处理xlsxexcel⽤的是XSSFWorkbook。   上⾯两个类导出excel的时候数据会驻留在内存中,所以当数据量⼤的时候容易造成内存溢出。SXSSFWorkbook是⽤来⽣成海 量excel数据⽂件,主要原理是借助临时存储空间⽣成excelPOI要求3.8以上,⽣成的⽂件格式要求是07及以上版本,因为excel07级以 上版本的⾏数1048576,量很⼤,⽽03版本的只有6万多。   读取07及以上版本的excel仍然是"XSSFWorkbook",写⼊则为"SXSSFWorkbook "。 导出的代码:(⼀个简单的测试,如果想封装⼯具类,参考:) package cn.xm.exam.utils; import java.io.File; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.streaming.SXSSFWorkbook; public class SXSSFExcelUtil { public static void main(String[] args) { String[] title = { "id", "name", "sex" }; // 创建⼀个⼯作簿 Workbook workbook = new SXSSFWorkbook(); // 创建⼀个⼯作表sheet Sheet sheet = workbook.createSheet(); // 创建第⼀⾏ Row row = sheet.createRow(0); // 创建⼀个单元格 Cell cell = null; // 创建表头 for (int i = 0; i < title.length; i++) { cell = row.createCell(i); cell.setCellValue(title[i]); } // 从第⼆⾏开始追加数据 for (int i = 1; i <= 10000; i++) { // 创建第i⾏ Row nextRow = sheet.createRow(i); // 参数代表第⼏列 Cell cell2 = nextRow.createCell(0); cell2.setCellValue("a" + i); cell2 = nextRow.createCell(1); cell2.setCellValue("user" + i); cell2 = nextRow.createCell(2); cell2.setCellValue("男"); } // 创建⼀个⽂件 File file = new File("G:/tt1.xls"); try { file.createNewFile(); // 打开⽂件流 FileOutputStream outputStream = new FileOutputStream(file); workbook.write(outputStream); outputStream.close(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } 补充:SXFFSWoorkbook导出的excel相⽐于XSSFWoorkbook导出的更节省空间: 下⾯分别是SXXFS\XFFS\HFFS导出上⾯1万条数据的excel的⽂件⼤⼩: 补充:测试HSSF\XSSF导出的数据占⽤内存,⽽SXFFS导出的数据不容易造成内存溢出 数据改为5万条并且写⼊之后查看内存信息: (1)查看XSSF导出的时候占⽤JVM内存 package cn.xm.exam.utils; import java.io.File; import java.io.FileOutputStream; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.Row; import org.apache

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值