Apache POI操作excel
第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公众号