写在前面: 我是 扬帆向海,这个昵称来源于我的名字以及女朋友的名字。我热爱技术、热爱开源、热爱编程。技术是开源的、知识是共享的。
这博客是对自己学习的一点点总结及记录,如果您对 Java、算法 感兴趣,可以关注我的动态,我们一起学习。
用知识改变命运,让我们的家人过上更好的生活。
一、Excel导入导出的应用场景
- 数据导入:减轻录入工作量
- 数据导出:统计信息归档
- 数据传输:异构系统之间数据传输
二、POI 简介
1. 什么是POI
Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
- HSSF - 提供读写Microsoft Excel格式档案的功能。(.xls)
- XSSF - 提供读写Microsoft Excel OOXML格式档案的功能。(.xlsx)
- HWPF - 提供读写Microsoft Word格式档案的功能。
- HSLF - 提供读写Microsoft PowerPoint格式档案的功能。
- HDGF - 提供读写Microsoft Visio格式档案的功能。
2. 为什么使用POI
A major use of the Apache POI api is for Text Extraction applications
such as web spiders, index builders, and content management systems.So why should you use POIFS, HSSF or XSSF?
You’d use POIFS if you had a document written in OLE 2 Compound
Document Format, probably written using MFC, that you needed to read
in Java. Alternatively, you’d use POIFS to write OLE 2 Compound
Document Format if you needed to inter-operate with software running
on the Windows platform. We are not just bragging when we say that
POIFS is the most complete and correct implementation of this file
format to date!You’d use HSSF if you needed to read or write an Excel file using Java
(XLS). You’d use XSSF if you need to read or write an OOXML Excel file
using Java (XLSX). The combined SS interface allows you to easily read
and write all kinds of Excel files (XLS and XLSX) using Java.
Additionally there is a specialized SXSSF implementation which allows
to write very large Excel (XLSX) files in a memory optimized way.
三、工程搭建
-
创建一个普通的maven项目
-
pom.xml中引入相关依赖
<dependencies>
<!-- xls 操作2003版本Excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<!--xlsx 操作2007版本Excel -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<!-- 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
四、小文件Excel的写入操作
1、操作2003版本的Excel
public class ExcelWrite {
/**
* 操作2003版本的Excel
*/
@Test
public void writeExcel03() throws Exception {
// 1. 创建新的Excel工作簿workbook
HSSFWorkbook workbook = new HSSFWorkbook();
// 2. 根据 workbook 创建 sheet
HSSFSheet sheet = workbook.createSheet("用户列表");
// 3. 根据sheet创建行
HSSFRow row1 = sheet.createRow(0);
// 4. 根据行创建列
HSSFCell cell1 = row1.createCell(0);
// 5. 向列里面设置值
cell1.setCellValue("扬帆向海");
// 6. 使用输出流写入到文件中
// 6.1 定义输出流
OutputStream out = new FileOutputStream("D:\\文档\\poi-test\\03Excel.xls");
// 6.2 把workbook中的内容通过输出流写入到文件中
workbook.write(out);
// 7. 关闭流
out.close();
}
}
执行结果:
2、操作2007版本的Excel
/**
* 操作2007版本的Excel
*/
@Test
public void writeExcel07() throws Exception {
// 1. 创建新的Excel工作簿workbook
XSSFWorkbook workbook = new XSSFWorkbook();
// 2. 根据 workbook 创建 sheet
XSSFSheet sheet = workbook.createSheet("用户列表");
// 3. 根据sheet创建行
XSSFRow row1 = sheet.createRow(0);
// 4. 根据行创建列
XSSFCell cell1 = row1.createCell(0);
// 5. 向列里面设置值
cell1.setCellValue("扬帆向海07");
// 6. 使用输出流写入到文件中
// 6.1 定义输出流
OutputStream out = new FileOutputStream("D:\\文档\\poi-test\\07Excel.xlsx");
// 6.2 把workbook中的内容通过输出流写入到文件中
workbook.write(out);
// 7. 关闭流
out.close();
}
执行结果:
五、大文件写入操作HSSF、XSSF和SXSSF
1、使用HSSF
/**
* 操作大数据量的2003版Excel
*/
@Test
public void writeBigExcel03() throws Exception {
//创建一个SXSSFWorkbook
//-1:关闭 auto-flushing,将所有数据存在内存中
HSSFWorkbook workbook = new HSSFWorkbook();
//创建一个sheet
HSSFSheet sheet = workbook.createSheet();
// 循环多次
for (int i = 0; i < 65536; i++) {
HSSFRow row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
HSSFCell cell = row.createCell(j);
cell.setCellValue(j);
}
}
FileOutputStream out = new FileOutputStream("D:\\文档\\poi-test\\03BigExcel.xls");
workbook.write(out);
out.close();
}
缺点:最多只能处理65536行,否则会抛出异常
java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0…65535)
优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快
2、使用XSSF
/**
* 操作大数据量的2007版Excel
*/
@Test
public void writeBigExcel07() throws Exception {
//创建一个XSSFWorkbook
XSSFWorkbook workbook = new XSSFWorkbook();
//创建一个sheet
XSSFSheet sheet = workbook.createSheet();
// 循环多次
for (int i = 0; i <= 65536; i++) {
XSSFRow row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
XSSFCell cell = row.createCell(j);
cell.setCellValue(j);
}
}
FileOutputStream out = new FileOutputStream("D:\\文档\\poi-test\\07BigExcel.xlsx");
workbook.write(out);
out.close();
}
缺点:写数据时速度非常慢,非常耗内存,也会发生内存溢出,如100万条
优点:可以写较大的数据量,如20万条
3、使用SXSSF
/**
* 操作大数据量的2007版Excel
*/
@Test
public void writeBigData() throws Exception {
//创建一个SXSSFWorkbook
SXSSFWorkbook workbook = new SXSSFWorkbook();
//创建一个sheet
Sheet sheet = workbook.createSheet();
// 循环多次
for (int i = 0; i <= 65536; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < 10; j++) {
Cell cell = row.createCell(j);
cell.setCellValue(j);
}
}
FileOutputStream out = new FileOutputStream("D:\\文档\\poi-test\\07BigData.xlsx");
workbook.write(out);
out.close();
//清除临时文件
((SXSSFWorkbook) workbook).dispose();
}
优点:可以写非常大的数据量,如100万条甚至更多条,写数据速度快,占用更少的内存
注意:
过程中会产生临时文件,需要清理临时文件(C:\Users\helen\AppData\Local\Temp)
默认由100条记录被保存在内存中,如果查过这数量,则最前面的数据被写入临时文件。如果想自定义内存中数据的数量,可以使用new SXSSFWorkbook(数量)
六、Excel文件的读操作
public class ExcelRead {
/**
* 测试读取03版本Excel里面的内容
*/
@Test
public void readExcel03() throws Exception {
// 1. 获取读取文件的输入流
FileInputStream in = new FileInputStream("D:\\文档\\poi-test\\03Excel.xls");
// 2. 创建workbook,把输入流传递进去
HSSFWorkbook workbook = new HSSFWorkbook(in);
// 3. 根据workbook获取sheet
HSSFSheet sheet = workbook.getSheetAt(0);
// 4.根据sheet获取行
HSSFRow row = sheet.getRow(0);
// 5. 根据行获取列
HSSFCell cell = row.getCell(0);
// 6. 获取cell里面的值
String value = cell.getStringCellValue();
System.out.println(value);
// 关闭流资源
in.close();
}
}
执行结果:
由于水平有限,本博客难免有不足,恳请各位大佬不吝赐教!
转载:https://blog.csdn.net/weixin_43570367/article/details/103880612