一文搞定POI,再也不怕excel导入导出了
写在前面在Java日常开发过程中,实现Excel文件的导入导出功能是一项常见的需求。
通过使用相干的Java库,如Apache POI、EasyPoi或EasyExcel,可以轻松地实现Excel文件的读写操作。
而这篇文章将介绍如何在Java中使用Apache POI、EasyPoi 和EasyExcel库来举行Excel文件的导入和导出操作,资助您快速掌握这一实用的技能。
一、使用场景
下面是excel导入导出的几个最常用的使用场景。
①企业管理系统:企业管理系统通常必要导入员工信息、客户信息、销售数据等大量数据到系统中,以及导出报表、数据分析结果等信息。
②学校教务系统:学校教务系统大概必要导入门生信息、课程表、成绩等数据,以及导出门生成绩单、教师工资表等信息。
③电子商务平台:电子商务平台必要导入商品信息、订单数据等内容,以及导出销售报表、库存清单等信息,方便管理和分析。
④ 人力资源管理系统:人力资源管理系统必要导入员工档案、薪资信息等数据,以及导出薪资条、考勤报表等信息,方便人力资源管理和工资结算。
⑤ 医院信息系统:医院信息系统大概必要导入患者信息、医疗记录等数据,以及导出医疗报告、统计分析等信息,方便医护人员举行医疗服务和管理。
以上仅是一些常见的使用场景,实际上各种系统中的Excel导入导出功能可以根据详细需求举行定制和扩展
二、三个库简介
1、Apache POI
Apache POI是一个流行的Java库,用于处理Microsoft Office格式文件,包括Excel、Word和PowerPoint。它提供了丰富的API,可以创建、读取和修改各种类型的Office文档。
官网:https://poi.apache.org/
优点:
[*]功能强大:支持处理复杂的Excel文件,包括单元格、样式、图表等内容。
[*]稳定性高:作为一个成熟的开源项目,得到广泛支持和连续维护。
[*]灵活性:可以满足各种定制化需求,可以实现复杂的Excel处理功能。
缺点:
[*]学习曲线较陡:对于初学者来说,学习成本大概较高。
[*]性能相对较低:在处理大量数据时,性能大概受到肯定影响。
2、EasyPoi
easypoi功能如同名字easy,主打的功能就是轻易,让一个没见打仗过poi的人员 就可以方便的写出Excel导出,Excel模板导出,Excel导入,Word模板导出,通过简单的注解和模板 语言(熟悉的表达式语法),完成以前复杂的写法
官网: https://gitee.com/lemur/easypoi
优点:
[*]简单易用:EasyPoi 提供了简洁的 API 接口,使得 Excel 操作更加便捷。
[*]功能丰富:支持 Excel 文件的导入导出、模板导出、校验等多种功能。
[*]易于扩展:EasyPoi 基于 Apache POI 和 JexcelApi,可以方便地扩展和定制功能。
[*]文档齐备:EasyPoi 提供了详细的文档和示例,便于开发人员学习和使用。
缺点:
[*]功能有限:相比于 Apache POI,EasyPoi 大概在一些高级功能上有所限制。
[*]大概存在性能题目:由于封装层的存在,EasyPoi 在处理大量数据时大概存在肯定的性能损耗。
3、EasyExcel
EasyExcel是一个阿里巴巴基于Apache POI封装的开源框架,专注于Excel文件的读写操作。它提供了简洁易用的API,简化了Excel处理的流程。
官网:https://easyexcel.opensource.alibaba.com/
优点:
[*]简单易用:提供了简洁的API,使用起来非常方便。
[*]高性能:在处理大量数据时具有较高的性能,可以大概快速导入导出Excel文件。
[*]支持注解:支持使用注解配置Excel文件的导入导出规则,简化了开发过程。
缺点:
[*]功能相对有限:相比Apache POI,功能相对简单,大概无法满足某些复杂的Excel处理需求。
[*]定制化能力较弱:定制化能力不如Apache POI灵活。
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311124959958-1289964027.png
三 、各版本Excel 区别
不同版本的Excel在功能和格式上大概会有一些差异。以是后续在处理不同版本的excel时,会有少许不同
以下是一些常见的Excel版本之间的区别
1、Excel 97-2003(.xls)
[*]最大行数为65536行,最大列数为256列。
[*]支持的最大单元格格式有限。
[*]不支持新的Excel特性,如条件格式、表格样式等。
[*]文件巨细限制为2GB。
2、Excel 2007及以上版本(.xlsx)
[*]最大行数和列数均有较大提升,支持数百万行数和16384列。
[*]支持更多的单元格格式和样式。
[*]引入了新的功能,如条件格式、表格样式、数据透视表等。
[*]支持更多的图表类型和图表样式。
[*]文件巨细限制较大,最多可达16,384 x 1,048,576个单元格。
四 、Excel 根本结构介绍
Java是面向对象的操作语言,万物皆对象。相识了Excel根本结构有助于我们将Excel与Java中对象关联起来
[*]工作簿(Workbook): Excel文件以工作簿的情势存在,一个工作簿可以包罗多个工作表(Sheet)
[*]工作表(Sheet): 每个工作表由行(Row)和列(Column)构成,交叉形成单元格(Cell),用于存储数据、文本、公式等内容
[*]单元格(Cell): Excel中的最小单元,用于存储数据或公式。每个单元格有一个唯一的地址,例如A1、B2等
[*]行(Row)和列(Column): 行是程度方向的一组单元格,列是垂直方向的一组单元格。行用数字标识,列用字母标识
[*]公式(Formula): Excel支持使用公式举行计算和数据处理。公式以等号(=)开头,可以引用其他单元格的数值或内容举行运算
[*]函数(Function): Excel提供了大量的内置函数,用于举行各种复杂的计算和数据处理,如SUM(求和)、AVERAGE(平均值)、VLOOKUP(垂直查找)
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311124959865-1571332855.png
五、Apache POI根本操作
由于Excel分为03版本和07版本,以是我们在使用的时候必要
注:
[*]处理03版本excel时,重要使用HSSFWorkbook、HSSFSheet、HSSFRow、HSSFCell等对象来操作Excel文件;
[*]处理07版本及之后版本excel时,重要使用XSSFWorkbook、XSSFSheet、XSSFRow、XSSFCell等对象来操作Excel文件
其他操作根本是一样的,相识这个之后,后续操作就很简单了~
5.1 根本写操作
5.1.103版本写excel
① 引入依靠
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.1.2</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.10</version>
</dependency>②实例代码
public class AppTest
{
String filepath="E:\\xiezhrspace\\excel-demo\\fileoutput\\";
@Test
public void poiexcel03Test() throwsException{
//1、创建一个工作簿
Workbook workbook = new HSSFWorkbook();
//2、创建一个工作表
Sheet sheet = workbook.createSheet("第一个工作表");
//3、创建一行
//3.1 创建第一行
Row row1 = sheet.createRow(0);
//3.2 创建第二行
Row row2 = sheet.createRow(1);
//3.3 创建第三行
Row row3 = sheet.createRow(2);
//4 创建一个单元格
//4.1 创建第一行第一个单元格
Cell cell11 = row1.createCell(0);
//4.2 创建第一行第二个单元格
Cell cell12 = row1.createCell(1);
//4.3 创建第二行第一个单元格
Cell cell21 = row2.createCell(0);
//4.4 创建第二行第二个单元格
Cell cell22 = row2.createCell(1);
//4.5 创建第三行第一个单元格
Cell cell31 = row3.createCell(0);
//4.6 创建第三行第二个单元格
Cell cell32 = row3.createCell(1);
// 5 设置单元格的值
//5.1 设置第一行第一个单元格
cell11.setCellValue("个人公众号");
//5.2 设置第一行第二个单元格
cell12.setCellValue("XiezhrSpace");
//5.3 设置第二行第一个单元格
cell21.setCellValue("个人博客");
//5.4 设置第二行第二个单元格
cell22.setCellValue("www.xiezhr.cn");
//5.5 设置第三行第一个单元格
cell31.setCellValue("当前时间");
//5.6 设置第三行第二个单元格
String curdate = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
cell32.setCellValue(curdate);
FileOutputStream fileOutputStream = new FileOutputStream(filepath + "poiexcel03.xls");
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
}
}③ excel写出结果
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311124959837-201802769.png
5.1.207版本写excel
07 版本依靠与处理03版本的有点不一样,代码根本上稳定
① 所需依靠
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>② 代码修改
07版本操作与03版本操作根本没什么变化,我们只需将03版本代码中new HSSFWorkbook() 修改成new XSSFWorkbook()
new FileOutputStream(filepath + "poiexcel03.xls") 修改成new FileOutputStream(filepath + "poiexcel07.xlsx") 即可
Workbook workbook = new XSSFWorkbook();
...省略
FileOutputStream fileOutputStream = new FileOutputStream(filepath + "poiexcel07.xlsx");③ 最终结果
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311124959775-1836900558.png
5.1.303版本批量写excel
①代码
@Test
public void testBigDateExcelTest() throws Exception {
Workbook workbook = new HSSFWorkbook();
Sheet sheet = workbook.createSheet("大文件导出测试");
long begin = System.currentTimeMillis();
for (int rowNum = 0; rowNum <65536 ; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10 ; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue("("+(rowNum+1) + "," + (cellNum+1)+")");
}
}
FileOutputStream fileOutputStream = new FileOutputStream(filepath + "03版本批量写入.xls");
workbook.write(fileOutputStream);
fileOutputStream.close();
workbook.close();
long end = System.currentTimeMillis();
System.out.println("耗时:"+(double)(end-begin)/1000+"秒");
}④ 添补数据
Workbook workbook = new XSSFWorkbook();
...省略
FileOutputStream fileOutputStream = new FileOutputStream(filepath + "07版本批量写入.xlsx");⑤ 最终结果
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311125000115-657074985.png
8.4.3 复杂添补
当excel模板相对复杂时,也可以添补
① 预备复杂模板
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311125000154-824721142.png
② 预备添补对象
参照8.4.1末节
③预备数据
参照8.4.1末节
④添补数据
@Test
public void batchWriteExcel07optTest() throws Exception {
Workbook workbook = new SXSSFWorkbook();
Sheet sheet = workbook.createSheet("大文件导出优化测试");
long begin = System.currentTimeMillis();
for (int rowNum = 0; rowNum <65536 ; rowNum++) {
Row row = sheet.createRow(rowNum);
for (int cellNum = 0; cellNum < 10 ; cellNum++) {
Cell cell = row.createCell(cellNum);
cell.setCellValue("("+(rowNum+1) + "," + (cellNum+1)+")");
}
}
FileOutputStream fileOutputStream = new FileOutputStream(filepath + "07版本批量写入优化.xlsx");
workbook.write(fileOutputStream);
// 清理临时文件
((SXSSFWorkbook) workbook).dispose();
fileOutputStream.close();
workbook.close();
long end = System.currentTimeMillis();
System.out.println("耗时:"+(double)(end-begin)/1000+"秒");
}⑤ 最终结果
https://img2024.cnblogs.com/blog/2381533/202403/2381533-20240311125000246-473845083.png
九、文章末节
文中只例举出excel 常用操作,如果这些还不满足你的需求,大家可以查看官方文档。
官方文档还黑白常详细的,并且都给出了详细的demo。
另外文中例举出的代码已提交到https://gitee.com/xiezhr/excel-demo.git接待大家访问查看
本期内容到此就结束了,希望对你有所资助,我们下期再见 (●'◡'●)
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]