第1部分:引言
1.1 Apache POI简介
Apache POI是一个开源的Java库,用于处理Microsoft Office文档。自2001年首次发布以来,它已经成为Java社区中处理Office文档事实上的标准。Apache POI支持HSSF(用于旧版本的Excel格式,即.xls)和XSSF(用于Excel 2007及以后版本,即.xlsx)两种Excel格式,以及其他Office文档格式。
1.2 为什么选择Apache POI进行Excel操作
- 跨平台性:作为Java库,Apache POI可以在任何支持Java的平台上运行,无需依赖特定的操作系统。
- 开源和免费:Apache POI是一个开源项目,允许开发者免费使用和修改。
- 功能丰富:支持创建、编辑、格式化、图表绘制等多种Excel操作。
- 社区支持:拥有活跃的开发者社区,提供持续的更新和技术支持。
- 与Java集成度高:无缝集成到Java应用程序中,易于学习和使用。
第2部分:Apache POI概览
2.1 Apache POI的历史和发展
Apache POI最初由Andrew C. Oliver于2001年开发,目的是提供一个能够读写Microsoft Office文件格式的Java库。随着时间的推移,Apache POI不断发展壮大,现在已经成为Apache软件基金会的一个顶级项目。它支持包括Excel、Word、PowerPoint在内的多种Office文档格式。
2.2 支持的文件格式
Apache POI支持多种Excel文件格式,主要包括:
- HSSF (Horrible SpreadSheet Format):用于读写旧版的Excel格式(.xls)。
- XSSF (Excel Spreadsheet XML Format):用于读写较新的Excel格式(.xlsx),基于Office Open XML标准。
- SXSSF:用于读写大型Excel文件,支持在内存使用较低的情况下进行操作。
2.3 与其他库的比较
与其他Excel操作库相比,Apache POI具有以下优势:
- 全面性:支持几乎所有Excel功能,包括宏、图表、数据透视表等。
- 成熟度:经过多年的发展,Apache POI已经非常稳定和成熟。
- 社区活跃:拥有一个活跃的开发者社区,不断有新的功能和改进被加入。
2.4 核心组件
Apache POI由以下几个核心组件构成:
- POI-OLE:用于处理OLE2文件格式,如早期的Excel文件。
- POI-HSSF:专门用于处理HSSF格式的Excel文件。
- POI-SXSSF:用于处理SXSSF格式的Excel文件。
- POI-XSSF:用于处理XSSF格式的Excel文件。
- POI-HWPF:用于处理Word文档。
- POI-HSLF:用于处理PowerPoint演示文稿。
2.5 示例:创建一个简单的Excel文件
下面是一个使用Apache POI创建一个简单Excel文件的示例:
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class SimpleExcelExample {
public static void main(String[] args) throws IOException {
try (Workbook workbook = new XSSFWorkbook()) {
Sheet sheet = workbook.createSheet("Simple Sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Hello, Apache POI!");
CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.YELLOW.index);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
cell.setCellStyle(style);
try (FileOutputStream outputStream = new FileOutputStream("simple.xlsx")) {
workbook.write(outputStream);
}
}
}
}
2.6 示例:读取Excel文件
以下示例展示了如何使用Apache POI读取Excel文件中的数据:
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadExcelExample {
public static void main(String[] args) throws IOException {
try (Workbook workbook = new XSSFWorkbook(new FileInputStream("simple.xlsx"))) {
Sheet sheet = workbook.getSheetAt(0);
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
System.out.println(cell.getStringCellValue());
break;
case NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
// 可以根据需要添加其他类型的处理
}
}
}
}
}
}
第3部分:环境搭建
3.1 安装Java开发环境
在使用Apache POI之前,确保你的计算机上安装了Java开发环境(JDK)。可以从Oracle官网下载最新版本的JDK。安装完成后,配置环境变量,使得java
和javac
命令可以在命令行中直接使用。
3.2 添加Apache POI依赖到项目
Apache POI可以通过多种方式添加到你的项目中。以下是几种常见的方法:
3.2.1 使用Maven
如果你的项目使用Maven进行依赖管理,可以在pom.xml
文件中添加以下依赖:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
3.2.2 使用Gradle
对于使用Gradle的项目,在build.gradle
文件中添加以下依赖:
dependencies {
implementation 'org.apache.poi:poi:5.2.2'
implementation 'org.apache.poi:poi-ooxml:5.2.2'
}
3.2.3 手动下载和配置
如果不想使用依赖管理工具,可以从Apache POI官网下载所需的JAR文件,并将其添加到项目的类路径中。
3.3 配置开发工具(IDE)以支持Apache POI
大多数现代IDE(如IntelliJ IDEA、Eclipse等)都支持Maven和Gradle,可以自动识别并下载依赖。确保你的IDE配置正确,可以识别并索引Apache POI库。
3.4 示例:使用Maven创建一个简单的项目
以下是一个使用Maven创建的简单项目的目录结构和pom.xml
配置示例:
simple-poi-project
|-- pom.xml
`-- src
`-- main
|-- java
`-- com.example
`-- SimpleExcelExample.java
pom.xml
:
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>simple-poi-project</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- Apache POI dependencies -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
</dependencies>
</project>
3.5 示例:创建和配置Eclipse项目
如果你使用Eclipse作为开发工具,可以按照以下步骤创建和配置项目:
- 打开Eclipse,选择
File
>New
>Java Project
。 - 输入项目名称,例如
SimplePoiProject
,然后点击Finish
。 - 右键点击项目,选择
Configure
>Convert to Maven Project
。 - 在弹出的窗口中,添加Apache POI依赖,然后点击
Finish
。
3.6 示例:使用IntelliJ IDEA创建项目
如果你使用IntelliJ IDEA,可以按照以下步骤创建和配置项目:
- 打开IntelliJ IDEA,选择
File
>New
>Project
。 - 选择
Maven
,然后点击Next
。 - 输入项目名称和位置,点击
Next
。 - 在
Artifact Coordinates
页面,添加Apache POI依赖,然后点击Finish
。
第4部分:基础操作
4.1 创建一个新的Excel文件
使用Apache POI创建一个新的Excel文件涉及到几个关键步骤:初始化工作簿(Workbook),创建工作表(Sheet),以及添加行(Row)和单元格(Cell)。以下是一个创建新Excel文件并写入一些基础数据的示例:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class CreateNewExcel {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook(); // 创建新的工作簿
Sheet sheet = workbook.createSheet("First Sheet"); // 创建新的工作表
// 在第一行第一列创建单元格并写入数据
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
cell.setCellValue("Apache POI");
// 设置单元格样式
CellStyle style = workbook.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER);
cell.setCellStyle(style);
try (FileOutputStream outputStream = new FileOutputStream("newExcel.xlsx")) {
workbook.write(outputStream); // 写入文件
}
workbook.close(); // 关闭工作簿
}
}
4.2 读取现有的Excel文件
读取Excel文件需要使用Apache POI的读取功能。以下示例展示了如何打开一个现有的Excel文件并读取其内容:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadExistingExcel {
public static void main(String[] args) throws IOException {
try (Workbook workbook = new XSSFWorkbook(new FileInputStream("existingExcel.xlsx"))) {
Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表
for (Row row : sheet) {
for (Cell cell : row) {
switch (cell.getCellType()) {
case STRING:
System.out.println(cell.getStringCellValue());
break;
case NUMERIC:
System.out.println(cell.getNumericCellValue());
break;
// 可以添加更多case来处理不同类型的单元格
}
}
}
}
}
}
4.3 工作簿(Workbook)和工作表(Sheet)的概念
- 工作簿(Workbook):代表整个Excel文件,可以包含多个工作表。
- 工作表(Sheet):是工作簿中的一个单独的表格,可以包含行和列。
4.4 添加多个工作表
以下示例展示了如何在同一个工作簿中添加多个工作表:
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.Sheet;
public class AddMultipleSheets {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet1 = workbook.createSheet("Sheet 1");
Sheet sheet2 = workbook.createSheet("Sheet 2");
// 在每个工作表中添加一些数据
sheet1.createRow(0).createCell(0).setCellValue("Data in Sheet 1");
sheet2.createRow(0).createCell(0).setCellValue("Data in Sheet 2");
// 保存工作簿到文件
try {
workbook.write(new FileOutputStream("multipleSheets.xlsx"));
} catch (IOException e) {
e.printStackTrace();
}
workbook.close();
}
}
4.5 设置单元格样式
Apache POI允许你设置单元格的样式,包括字体、颜色、边框等。以下示例展示了如何设置单元格的背景颜色和字体样式:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.openxmlformats.schemas.drawingml.x2006.main.CTScheme;
import java.io.FileOutputStream;
import java.io.IOException;
public class CellStyles {
public static void main(String[] args) throws IOException {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Styled Sheet");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
// 设置单元格样式
CellStyle style = workbook.createCellStyle();
XSSFFont font = ((XSSFWorkbook) workbook).createFont();
font.setFontName("Arial");
font.setFontHeightInPoints((short) 14);
font.setBold(true);
font.setColor(IndexedColors.RED.getIndex());
style.setFont(font);
cell.setCellValue("Styled Cell");
cell.setCellStyle(style);
try (FileOutputStream outputStream = new FileOutputStream("styledExcel.xlsx")) {
workbook.write(outputStream);
}
workbook.close();
}
}
第5部分:数据读写
5.1 写入数据到单元格
在Excel中写入数据到单元格是基本操作之一。Apache POI提供了多种方法来设置单元格的值,包括字符串、数字、布尔值等。以下是一些写入数据的基本示例:
5.1.1 写入字符串和数字
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.FileOutputStream;
import java.io.IOException;
public class WriteDataToCells {
public static void main(String[] args) throws IOException {
try (Workbook workbook = new XSSFWorkbook();
FileOutputStream outputStream = new FileOutputStream("writeData.xlsx")) {
Sheet sheet = workbook.createSheet("Data Sheet");
Row row = sheet.createRow(0);
// 第一列写入字符串
Cell cell1 = row.createCell(0);
cell1.setCellValue("Hello, Apache POI!");
// 第二列写入数字
Cell cell2 = row.createCell(1);
cell2.setCellValue(1234.56);
workbook.write(outputStream);
}
}
}
5.1.2 写入布尔值和公式
import org.apache.poi.ss.usermodel.*;
public class WriteBooleanAndFormula {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Boolean and Formula");
Row row = sheet.createRow(1);
// 写入布尔值
Cell cell1 = row.createCell(0);
cell1.setCellValue(true);
// 写入公式
Cell cell2 = row.createCell(1);
cell2.setCellFormula("SUM(1, 2, 3, 4)");
// 此处省略文件写入和关闭工作簿的代码
}
}
5.2 读取单元格数据
读取单元格数据同样重要,Apache POI提供了多种方法来获取不同类型的单元格数据。以下是读取数据的示例:
5.2.1 读取不同类型的单元格数据
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;
import java.io.IOException;
public class ReadDifferentCellTypes {
public static void main(String[] args) throws IOException {
try (Workbook workbook = new XSSFWorkbook(new FileInputStream("readData.xlsx"))) {
Sheet sheet = workbook.getSheetAt(0);
Row row = sheet.getRow(0);
Cell cell1 = row.getCell(0);
System.out.println("String Cell: " + cell1.getStringCellValue());
Cell cell2 = row.getCell(1);
System.out.println("Numeric Cell: " + cell2.getNumericCellValue());
// 此处省略其他单元格类型的读取代码
}
}
}
5.3 单元格样式和格式化
单元格样式和格式化是提高Excel文件可读性和专业性的重要手段。以下是设置单元格样式和格式化的示例:
5.3.1 设置数字格式和字体样式
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class CellStyleAndFormatting {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Formatted Data");
Row row = sheet.createRow(0);
Cell cell = row.createCell(0);
// 设置数字格式
cell.setCellValue(12345.67);
cell.setCellStyle(createNumberFormat(workbook, "#,##0.00"));
// 设置字体样式
CellStyle style = createFontStyle(workbook, "Bold", IndexedColors.BLACK.getIndex());
cell.setCellStyle(style);
// 此处省略文件写入和关闭工作簿的代码
}
private static CellStyle createNumberFormat(Workbook workbook, String format) {
CellStyle style = workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat(format));
return style;
}
private static CellStyle createFontStyle(Workbook workbook, String fontName, short color) {
CellStyle style = workbook.createCellStyle();
XSSFFont font = ((XSSFWorkbook) workbook).createFont();
font.setFontName(fontName);
font.setBold(true);
font.setColor(color);
style.setFont(font);
return style;
}
}
5.4 合并单元格
合并单元格是Excel中常用的功能,用于在多个单元格中显示一个值。以下是合并单元格的示例:
import org.apache.poi.ss.usermodel.*;
public class MergeCells {
public static void main(String[] args) {
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("Merged Cells");
Row row = sheet.createRow(0);
// 创建单元格并合并
Cell cell1 = row.createCell(0);
cell1.setCellValue("Merged Cell");
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); // 合并第0行第0到2列
// 此处省略文件写入和关闭工作簿的代码
}
}
欢迎关注vx公众号