Apache POI 是一款在 Java 开发中广受欢迎的开源库,主要用于处理各种 Microsoft Office 文件格式,Excel 文件便是其中之一。凭借其功能强大的 API,POI 不仅支持对 Excel 文件的读取、写入和修改,还为 Java 开发者在处理 Excel 相关业务时提供了极大的便利。
在 Maven 项目中使用 POI 时,需要在 pom.xml
文件中添加 POI 相关的依赖。以下是配置示例:
<dependencies>
<dependency>
<groupId>org.apache.poigroupId>
<artifactId>poi-ooxmlartifactId>
<version>5.0.0version>
dependency>
dependencies>
添加上述依赖后,Maven 会自动下载并管理 POI 及其相关依赖项,确保项目能够顺利使用 POI 的功能。
以下是一个基础的示例,展示如何使用 POI 将数据写入 Excel 文件:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelWriteExample {
public static void main(String[] args) {
// 创建一个新的 Excel 工作簿,使用 XSSFWorkbook 表示 Excel 2007 及以上版本的 .xlsx 格式
Workbook workbook = new XSSFWorkbook();
// 在工作簿中创建一个名为 "Sheet1" 的工作表
Sheet sheet = workbook.createSheet("Sheet1");
// 定义要写入的数据,采用二维数组的形式
String[][] data = {
{"姓名", "年龄", "性别"},
{"张三", "25", "男"},
{"李四", "30", "女"}
};
// 遍历数据数组,逐行逐列将数据写入工作表
for (int i = 0; i < data.length; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < data[i].length; j++) {
Cell cell = row.createCell(j);
cell.setCellValue(data[i][j]);
}
}
// 将数据保存到文件系统中
try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {
workbook.write(fos);
System.out.println("文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行该代码后,会在项目根目录下生成一个名为 example.xlsx
的 Excel 文件,文件中包含预定义的数据。
以下是读取上述 Excel 文件内容的代码示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class ExcelReadExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("example.xlsx")) {
// 通过文件输入流创建工作簿对象
Workbook workbook = new XSSFWorkbook(fis);
// 获取工作簿中的第一个工作表
Sheet sheet = workbook.getSheetAt(0);
// 遍历工作表中的每一行
for (Row row : sheet) {
// 遍历当前行中的每一个单元格
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
System.out.print(cell.getStringCellValue() + "\t");
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
System.out.print(cell.getDateCellValue() + "\t");
} else {
System.out.print(cell.getNumericCellValue() + "\t");
}
break;
case BOOLEAN:
System.out.print(cell.getBooleanCellValue() + "\t");
break;
default:
System.out.print("\t");
}
}
System.out.println();
}
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行该代码,控制台将输出 Excel 文件中的所有数据,按行列顺序展示。
在处理大文件时,如果将整个 Excel 文件加载到内存中,可能会导致内存溢出。例如:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class MemoryProblemExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream("large_file.xlsx")) {
Workbook workbook = new XSSFWorkbook(fis);
Sheet sheet = workbook.getSheetAt(0);
// 大文件加载到内存可能会导致 OutOfMemoryError
} catch (IOException e) {
e.printStackTrace();
}
}
}
当文件 large_file.xlsx
很大时,调用 XSSFWorkbook(fis)
可能会消耗大量内存,导致 OutOfMemoryError
。
SXSSFWorkbook
写入大文件: SXSSFWorkbook
是 XSSFWorkbook
的流式写入版本,它采用了逐行写入的方式,避免将所有数据一次性加载到内存中。如下示例:import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class ExcelWriteLargeFileExample {
public static void main(String[] args) {
Workbook workbook = new SXSSFWorkbook(100); // 设置内存中最多保留 100 行
Sheet sheet = workbook.createSheet("Sheet1");
for (int i = 0; i < 10000; i++) {
Row row = sheet.createRow(i);
for (int j = 0; j < 3; j++) {
Cell cell = row.createCell(j);
cell.setCellValue("数据" + i + "-" + j);
}
}
try (FileOutputStream fos = new FileOutputStream("large_example.xlsx")) {
workbook.write(fos);
System.out.println("大文件写入成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
除了 POI,Java 生态中还有其他一些常用的 Excel 操作库,下面简要介绍几种:
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import java.util.List;
import java.util.Map;
public class HutoolExcelExample {
public static void main(String[] args) {
ExcelReader reader = ExcelUtil.getReader("example.xlsx");
List<Map<String, Object>> rows = reader.readAll();
for (Map<String, Object> row : rows) {
System.out.println(row);
}
}
}
JXL:JXL 是一个较为简单的 Excel 操作库,适用于处理 .xls
格式的文件。由于对 .xlsx
格式支持较弱,它更适用于旧版 Excel 文件。
EasyExcel:EasyExcel 是阿里巴巴开源的一个高效 Excel 处理工具,特别适用于大数据量的 Excel 文件,内存消耗较低。以下是使用 EasyExcel 写入文件的示例:
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.write.builder.ExcelWriterBuilder;
import java.util.ArrayList;
import java.util.List;
public class EasyExcelExample {
public static void main(String[] args) {
String fileName = "easyexcel_example.xlsx";
List<Data> dataList = new ArrayList<>();
for (int i = 0; i < 10; i++) {
Data data = new Data("姓名" + i, i, "性别" + i);
dataList.add(data);
}
EasyExcel.write(fileName, Data.class).sheet("Sheet1").doWrite(dataList);
}
public static class Data {
private String name;
private int age;
private String gender;
public Data(String name, int age, String gender) {
this.name = name;
this.age = age;
this.gender =
gender;
}
// Getters and Setters
}
}
本文详细介绍了如何使用 Apache POI 进行 Excel 文件的读写操作,包括常见的使用场景和一些优化建议。对于需要处理大数据量的 Excel 文件,介绍了 SXSSFWorkbook
的使用方法,避免内存溢出问题。此外,还简要介绍了其他流行的 Excel 操作工具,如 Hutool、JXL 和 EasyExcel,它们各具特色,适合不同的需求。
通过掌握这些工具和技巧,你可以在 Java 项目中高效地处理 Excel 文件,提升开发效率和应用性能。