今天在开发中遇到用户列表导入导出的功能实现,这里了解到使用POI函数库可以完成此任务!特此记录一下
POI
Apache POI是Apache软件基金会开放的源码函数库,POI提供API给Java程序对Office格式文档读和写的功能。
- HSSF:提供读写Excel格式档案的功能。Excel2003
- XSSF:提供读写OOXML格式档案的功能。Excel2007
- HWPF:提供读写Word文档的功能。
- HSLF:提供读写PPT的功能。
- HDGF:提供读写Visio格式档案的功能。
上面提及到的五个对象分别操作不同文件。
这里只测试了Excel读写相关,剩下的只需要修改文件后缀名和指定对象即可。
相关依赖
创建完项目后,首先需要引入POI的相关依赖。
<dependencies>
<!-- xls -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!-- xlsx -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- test -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
将数据保存到Excel2003
步骤
1、创建workbook对象,workbook是接口,实现类指定要操作的对象,例如要操作的文件是Excel2003就创建的是HSSFWorkbook
,如果操作的是Excel2007那就创建XSSFWorkbook
。
2、创建Sheet对象,Sheet具体指的就是哪张表
3、创建Row,指明要将写入的数据放在第几行
4、创建Cell,指明将数据写在第几列,也就是第几个单元格
5、最后创建输出流,将内存中的数据持久化
/**
* 向Excel2003版本中写入数据
*/
@Test
public void writeTest03() throws IOException {
//1、创建Workbook
Workbook workbook = new HSSFWorkbook();
//2、创建sheet,默认名字是sheet1,sheet2...
Sheet sheet = workbook.createSheet("会员列表");
//3、创建row 参数是0代表第1行,参数是1代表第二行...
Row row1 = sheet.createRow(0);
//4、创建cell 第0列
Cell cell = row1.createCell(0);
//5、在cell中填充数据
cell.setCellValue("datao");
//6、向文件中写入数据,以上步骤都是在内存中完成的,想要将文件持久化到磁盘需要文件输出流
FileOutputStream outputStream = new FileOutputStream("E:\1.xls");
workbook.write(outputStream);
//7、关闭流
outputStream.close();
}
将数据保存在Excel2007
步骤和上面的基本一样,只是workbook的实现类不同,保存的文件名后缀不同。
public void writeTest07() throws IOException {
//1、创建Workbook
Workbook workbook = new XSSFWorkbook();
//2、创建sheet,默认名字是sheet1,sheet2...
Sheet sheet = workbook.createSheet("用户列表");
//3、创建row 参数是0代表第1行,参数是1代表第二行...
Row row1 = sheet.createRow(0);
//4、创建cell 第0列
Cell cell = row1.createCell(0);
//5、在cell中填充数据
cell.setCellValue("贝姐");
//6、向文件中写入数据,以上步骤都是在内存中完成的,想要将文件持久化到磁盘需要文件输出流,注意保存到文件的后缀名,03版本的Excel文件是以.xls结尾
//excel2007版本是以.xlsx结尾
FileOutputStream outputStream = new FileOutputStream("E:\2.xlsx");
workbook.write(outputStream);
//7、关闭流
outputStream.close();
}
写入大文件
-
使用HSSFWorkbook写入数据有个缺点就是写入的数据是有限的,最大不能超过65535行,超过会写不进去,抛出异常,
java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0..65535)
。
他是先将内存中的数据一次性写入磁盘。 -
如果使用XSSFWorkbook写入大数据时,虽然不会报错,但是他写入速度很慢。(当写入100万行数据时内存才会溢出)
-
如果写入大文件,推荐使用SXSSFWorkbook,它可以写入100万条数据以上,并且写入速度很快,分段写入。
SXSSFWorkbook官方的解释:实现“BigGridDemo”策略的流式XSSFWorkbook版本。这允许写入非常大的文件而不会耗尽内存,因为任何时候只有可配置的行部分被保存在内存中。
请注意,仍然可能会消耗大量内存,这些内存基于您正在使用的功能,例如合并区域,注释…仍然只存储在内存中,因此如果广泛使用,可能需要大量内存。
从Excel中读取
- 创建文件输出入流
- 创建workbook构造参数传入输入流
- 读取指定的sheet
- 根据sheet读取行
- 根据行读取单元格
- 输出结果
- 关闭输入流
//从Excel中读取值,并输出
@Test
public void read03Test() throws IOException {
//1、创建输入流,指定要读取的文件
InputStream inputStream = new FileInputStream("E:\1.xls");
//2、创建workbook将输入流传过去
HSSFWorkbook hssfWorkbook = new HSSFWorkbook(inputStream);
//3、指定读取的sheet
HSSFSheet sheet = hssfWorkbook.getSheet("会员列表");
//4、获取指定行
HSSFRow row = sheet.getRow(0);
//5、获取指定cell
HSSFCell cell = row.getCell(0);
//6、从cell中也就是单元格中获取数据
String cellValue = cell.getStringCellValue();
//输出结果
System.out.println(cellValue);
//关闭输入流
inputStream.close();
}