温锦文欧普厨电及净水器总代理 发表于 2024-5-13 17:29:27

一文搞定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]
查看完整版本: 一文搞定POI,再也不怕excel导入导出了