前言:最近没有更新,懈怠了。前两天刚写了一个execl导出的需求,过来总结一下这方面的内容
大概在很久很久以前,微软的电子表格软件 Excel 以操作简单、存储数据直观方便,还支持打印报表,在诞生之初,可谓深得办公室里的白领青睐,极大的提升了工作的效率,不久之后,便成了办公室里的必备工具。
随着更多的新语言的崛起,例如我们所熟悉的 java,后来便有一些团队开始开发一套能与 Excel 软件无缝切换的操作工具!
这其中就有我们所熟悉的 apache 的 poi,其前身是 Jakarta 的 POI Project项目,之后将其开源给 apache 基金会!
当然,在java生态体系里面,能与Excel无缝衔接的第三方工具还有很多,因为 apache poi 在业界使用的最广泛,因此其他的工具不做过多介绍!
所以!第一步当然是引入jar包啦:
<!--xls(03)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<!--xlsx(07)-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
主要就是这个两个jar包针对着不同的execl版本
先看导出:
从整个流程来看无非是把数据填充到execl中的一个个单元格里
在 poi 工具库中,导出 api 可以分三种方式
HSSF方式:这种方式导出的文件格式为office 2003专用格式,即.xls,优点是导出数据速度快,但是最多65536行数据:
Workbook workbook = new HSSFWorkbook();
XSSF方式:这种方式导出的文件格式为office 2007专用格式,即.xlsx,优点是导出的数据不受行数限制,所有的数据先写入内存再导出,缺点导出速度慢
Workbook workbook = new XSSFWorkbook();
SXSSF方式:SXSSF 是 XSSF API的兼容流式扩展,主要解决当使用 XSSF 方式导出大数据量时,内存溢出的问题,主要特性是低内存,导出的时候,先将数据写入磁盘再导出,避免报内存不足,支持导出大批量的excel数据
Workbook workbook = new SXSSFWorkbook();
再看导入:
其实导入也是三种方式,分别对应着导出的三种方式
HSSF方式:
//获取文件流 FileInputStream inputStream = new FileInputStream(PATH + "用户信息表BigData.xls"); //1.创建工作簿,使用excel能操作的这边都看看操作 Workbook workbook = new HSSFWorkbook(inputStream); //2.得到表 Sheet sheet = workbook.getSheetAt(0); //3.得到行 Row row = sheet.getRow(0); //4.得到列 Cell cell = row.getCell(0);
XSSF方式:
//获取文件流 FileInputStream inputStream = new FileInputStream(PATH + "用户信息表2007BigData.xlsx"); //1.创建工作簿,使用excel能操作的这边都看看操作 Workbook workbook = new XSSFWorkbook(inputStream); //2.得到表 Sheet sheet = workbook.getSheetAt(0); //3.得到行 Row row = sheet.getRow(0); //4.得到列 Cell cell = row.getCell(0);
SXSSF方式:
//获取文件流 //1.创建工作簿,使用excel能操作的这边都看看操作 OPCPackage opcPackage = OPCPackage.open(PATH + "用户信息表2007BigData.xlsx"); XSSFReader xssfReader = new XSSFReader(opcPackage); StylesTable stylesTable = xssfReader.getStylesTable(); ReadOnlySharedStringsTable sharedStringsTable = new ReadOnlySharedStringsTable(opcPackage); // 创建XMLReader,设置ContentHandler XMLReader xmlReader = SAXHelper.newXMLReader(); xmlReader.setContentHandler(new XSSFSheetXMLHandler(stylesTable, sharedStringsTable, new SimpleSheetContentsHandler(), false)); // 解析每个Sheet数据 Iterator<InputStream> sheetsData = xssfReader.getSheetsData(); while (sheetsData.hasNext()) { try (InputStream inputStream = sheetsData.next();) { xmlReader.parse(new InputSource(inputStream)); } }
关于导入导出主要使用的方法:
Sheet sheet = workbook.createSheet(); Row row = sheet.createRow(0); // 创建行从0开始 Cell cell = row.createCell(0); // 创建单元格从0开始 cell.setCellValue(“值”); // 设置单元格的值 Sheet sheet = workbook.getSheetAt(0); Row row = sheet.getRow(0); Cell cell = row.getCell(0);
扩展:
easypoi和easyexcel都是基于apache poi进行二次开发的。都有使用注解进行导入导出。
不同点在于:
1、easypoi 在读写数据的时候,优先是先将数据写入内存,优点是读写性能非常高,但是当数据量很大的时候,会出现oom,当然它也提供了 sax 模式的读写方式,需要调用特定的方法实现。
2、easyexcel 基于sax模式进行读写数据,不会出现oom情况,程序有过高并发场景的验证,因此程序运行比较稳定,相对于 easypoi 来说,读写性能稍慢!
easypoi 与 easyexcel 还有一点区别在于,easypoi 对定制化的导出支持非常的丰富,如果当前的项目需求,并发量不大、数据量也不大,但是需要导出 excel 的文件样式千差万别,那么我推荐你用 easypoi;反之,使用 easyexcel !
标签:execl,java,导出,导入,poi,workbook,new,sheet,row From: https://www.cnblogs.com/zccjava/p/17393731.html