当前位置: 技术文章>> 如何在 Java 中读取和写入 Excel 文件?
文章标题:如何在 Java 中读取和写入 Excel 文件?
在Java中读取和写入Excel文件是一项常见的任务,特别是在处理报表、数据分析或自动化办公任务时。Apache POI是Java处理Microsoft Office文档的一个强大库,特别是它对于Excel文件的处理非常出色。这里,我将详细介绍如何使用Apache POI库在Java中读取和写入Excel文件(以.xls和.xlsx格式为例),同时确保内容既专业又易于理解,避免任何可能暴露文章由AI生成的痕迹。
### 一、准备工作
首先,你需要在你的Java项目中引入Apache POI库。如果你使用Maven作为构建工具,可以在你的`pom.xml`文件中添加以下依赖项:
```xml
org.apache.poi
poi
5.2.3
org.apache.poi
poi-ooxml
5.2.3
```
请注意,版本号(此处为5.2.3)可能会随时间更新,请访问Apache POI官网获取最新版本。
### 二、读取Excel文件
#### 读取.xls文件(Excel 2003及以前版本)
要读取`.xls`格式的文件,你可以使用`HSSFWorkbook`类。以下是一个基本的示例,展示如何读取工作簿中的第一个工作表及其内容:
```java
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadXlsExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream(new File("example.xls"));
Workbook workbook = new HSSFWorkbook(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:
System.out.print(cell.getNumericCellValue() + "\t");
break;
// 其他类型处理...
}
}
System.out.println(); // 换行
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
#### 读取.xlsx文件(Excel 2007及以后版本)
对于`.xlsx`文件,使用`XSSFWorkbook`类。处理逻辑与`.xls`文件相似,只是工作簿的创建方式略有不同:
```java
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// 其他导入与之前相同
public class ReadXlsxExample {
public static void main(String[] args) {
try (FileInputStream fis = new FileInputStream(new File("example.xlsx"));
Workbook workbook = new XSSFWorkbook(fis)) {
// 后续逻辑与ReadXlsExample相同
} catch (IOException e) {
e.printStackTrace();
}
}
}
```
### 三、写入Excel文件
#### 写入.xls或.xlsx文件
写入Excel文件的过程与读取类似,但你需要先创建工作簿、工作表、行和单元格,并设置单元格的值。Apache POI支持`.xls`和`.xlsx`格式的写入,主要通过`HSSFWorkbook`和`XSSFWorkbook`类实现。
以下是一个写入`.xlsx`文件的示例,但请注意,对于`.xls`文件的写入,只需将`XSSFWorkbook`替换为`HSSFWorkbook`即可:
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteXlsxExample {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook(); // 创建工作簿
Sheet sheet = workbook.createSheet("Example Sheet"); // 创建工作表
// 创建行(从0开始)
Row row = sheet.createRow(0);
// 在行中创建单元格(从0开始)并设置值
Cell cell = row.createCell(0);
cell.setCellValue("Hello, World!");
// 写入到文件
try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {
workbook.write(fos);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
workbook.close(); // 关闭工作簿释放资源
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
```
### 四、高级操作
Apache POI库提供了许多高级功能,比如设置单元格样式、调整列宽、合并单元格、添加公式等。以下是一个简单的示例,展示如何设置单元格样式:
```java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
// 假设其他导入已存在
public class AdvancedExample {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Styled Sheet");
// 创建单元格样式
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); // 水平居中
style.setVerticalAlignment(VerticalAlignment.CENTER); // 垂直居中
Font font = workbook.createFont();
font.setBold(true);
font.setFontHeightInPoints((short) 14);
style.setFont(font);
// 应用样式到单元格
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Styled Cell");
cell.setCellStyle(style);
// 写入文件等操作...
}
}
```
### 五、性能优化
在处理大型Excel文件时,性能是一个关键问题。`XSSFWorkbook`(针对`.xlsx`)在处理大量数据时可能会消耗大量内存。为了优化性能,Apache POI提供了`SXSSFWorkbook`类,它是一个基于窗口的API,用于处理大数据量的Excel文件,通过限制内存中同时存在的行数来减少内存消耗。
```java
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
// 其他逻辑与XSSFWorkbook类似,但使用SXSSFWorkbook
```
### 六、总结
通过上面的介绍,你应该能够掌握在Java中使用Apache POI库读取和写入Excel文件的基本方法。无论是处理简单的数据导入导出任务,还是复杂的报表生成,Apache POI都提供了强大的支持。此外,通过利用Apache POI的高级功能和性能优化技巧,你可以更加高效地处理Excel文件,满足各种业务需求。
最后,提醒一点,Apache POI库持续更新,为了获取最新的功能和修复,建议定期查看Apache POI的官方文档和更新日志。同时,在开发过程中,也可以参考“码小课”网站上的相关教程和示例代码,以获得更多的帮助和灵感。