当前位置: 首页 > news >正文

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。安装完成后,配置环境变量,使得javajavac命令可以在命令行中直接使用。

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作为开发工具,可以按照以下步骤创建和配置项目:

  1. 打开Eclipse,选择File > New > Java Project
  2. 输入项目名称,例如SimplePoiProject,然后点击Finish
  3. 右键点击项目,选择Configure > Convert to Maven Project
  4. 在弹出的窗口中,添加Apache POI依赖,然后点击Finish
3.6 示例:使用IntelliJ IDEA创建项目

如果你使用IntelliJ IDEA,可以按照以下步骤创建和配置项目:

  1. 打开IntelliJ IDEA,选择File > New > Project
  2. 选择Maven,然后点击Next
  3. 输入项目名称和位置,点击Next
  4. 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公众号
在这里插入图片描述

http://www.lryc.cn/news/384309.html

相关文章:

  • Python错误集锦:faker模块生成xml文件时提示:`xml` requires the `xmltodict` Python library
  • Vue3-尚硅谷笔记
  • RockChip Android12 System之MultipleUsers
  • 第12天:前端集成与Django后端 - 用户认证与状态管理
  • 在ROS2中蓝牙崩溃的原因分析
  • 【PythonWeb开发】Flask中间件钩子函数实现封IP
  • 可以一键生成热点营销视频的工具,建议收藏
  • Unity Meta Quest 开发:关闭 MR 应用的安全边界
  • 4.sql注入攻击(OWASP实战训练)
  • 前端Web开发HTML5+CSS3+移动web视频教程 Day1
  • 中医实训室:在传统针灸教学中的应用与创新
  • React Hooks 小记(七)_useReducer
  • 甲子光年专访天润融通CEO吴强:客户经营如何穿越低速周期?
  • 还不到6个月,GPTs黄了
  • IOS Swift 从入门到精通:BlurEffect BlendMode stroke
  • 西木科技Westwood-Robotics人型机器人Bruce配置和真机配置
  • 【招聘贴】JAVA后端·唯品会·BASE新加坡
  • CVPR2024|vivo提出使用对抗微调获得泛化性更强的SAM,分割性能直接登顶 SOTA!
  • 程序员必备的ChatGPT技巧:从代码调试到项目管理
  • JAVA开发的一套医院绩效考核系统源码:KPI关键绩效指标的清晰归纳
  • 面向对象编程——python
  • 【LeetCode】每日一题:合并K个升序链表
  • 从零开始学docker(四)-安装mysql及主从配置(一)
  • 【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉
  • 新能源汽车 LabCar 测试系统方案(-)
  • 机器学习辅助的乙醇浓度检测(毕设节选)
  • YOLO系列改进
  • cuda与cudnn下载(tensorflow-gpu)
  • git 多分支实现上传文件但避免冲突检测
  • 聊聊 golang 中 channel