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

Apache POI 详解 - Java 操作 Excel/Word/PPT

Apache POI 详解 - Java 操作 Excel/Word/PPT

Apache POI(Poor Obfuscation Implementation)是 Apache 提供的 Java 操作 Microsoft Office 文档(Excel、Word、PPT) 的开源库。它支持 .xls(HSSF)、.xlsx(XSSF)、.doc(HWPF)、.docx(XWPF)、.ppt(HSLF)、.pptx(XSLF)等格式。


1. POI 核心组件

组件功能适用格式
HSSF操作 Excel 97-2003(.xls.xls
XSSF操作 Excel 2007+(.xlsx.xlsx
SXSSF流式处理大 Excel(.xlsx.xlsx
HWPF操作 Word 97-2003(.doc.doc
XWPF操作 Word 2007+(.docx.docx
HSLF操作 PowerPoint 97-2003(.ppt.ppt
XSLF操作 PowerPoint 2007+(.pptx.pptx

2. POI 依赖

Maven 依赖

<!-- Excel 操作(HSSF/XSSF/SXSSF) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>5.2.3</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version>
</dependency><!-- Word 操作(XWPF) -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>5.2.3</version>
</dependency>

3. POI 操作 Excel(XSSF/HSSF)

(1)写入 Excel(XSSF - .xlsx

import org.apache.poi.xssf.usermodel.*;
import java.io.FileOutputStream;public class ExcelWriter {public static void main(String[] args) throws Exception {// 1. 创建工作簿XSSFWorkbook workbook = new XSSFWorkbook();// 2. 创建工作表XSSFSheet sheet = workbook.createSheet("Sheet1");// 3. 创建行(第 0 行)XSSFRow row = sheet.createRow(0);// 4. 创建单元格并写入数据row.createCell(0).setCellValue("姓名");row.createCell(1).setCellValue("年龄");// 5. 写入数据行XSSFRow dataRow = sheet.createRow(1);dataRow.createCell(0).setCellValue("张三");dataRow.createCell(1).setCellValue(25);// 6. 保存到文件try (FileOutputStream fos = new FileOutputStream("output.xlsx")) {workbook.write(fos);}System.out.println("Excel 文件生成成功!");}
}

(2)读取 Excel(XSSF - .xlsx

import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import java.io.FileInputStream;public class ExcelReader {public static void main(String[] args) throws Exception {// 1. 加载 Excel 文件FileInputStream fis = new FileInputStream("output.xlsx");XSSFWorkbook workbook = new XSSFWorkbook(fis);// 2. 获取工作表XSSFSheet sheet = workbook.getSheetAt(0);// 3. 遍历行和单元格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;default:System.out.print("UNKNOWN\t");}}System.out.println();}workbook.close();}
}

(3)SXSSF(流式处理大 Excel)

适用于大数据量(百万行):

import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFRow;
import java.io.FileOutputStream;public class BigExcelWriter {public static void main(String[] args) throws Exception {// 1. 创建 SXSSFWorkbook(默认 100 行缓存)SXSSFWorkbook workbook = new SXSSFWorkbook();SXSSFSheet sheet = workbook.createSheet("大数据");// 2. 写入 100 万行数据for (int i = 0; i < 1_000_000; i++) {SXSSFRow row = sheet.createRow(i);row.createCell(0).setCellValue("数据-" + i);row.createCell(1).setCellValue(i);}// 3. 保存到文件try (FileOutputStream fos = new FileOutputStream("big-data.xlsx")) {workbook.write(fos);}workbook.dispose(); // 清理临时文件System.out.println("大 Excel 文件生成成功!");}
}

4. POI 操作 Word(XWPF)

(1)写入 Word(.docx

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileOutputStream;public class WordWriter {public static void main(String[] args) throws Exception {// 1. 创建文档XWPFDocument document = new XWPFDocument();// 2. 创建段落XWPFParagraph paragraph = document.createParagraph();XWPFRun run = paragraph.createRun();run.setText("Hello, POI Word!");run.setBold(true);run.setFontSize(16);// 3. 保存到文件try (FileOutputStream fos = new FileOutputStream("output.docx")) {document.write(fos);}System.out.println("Word 文件生成成功!");}
}

(2)读取 Word(.docx

import org.apache.poi.xwpf.usermodel.*;
import java.io.FileInputStream;public class WordReader {public static void main(String[] args) throws Exception {// 1. 加载 Word 文件FileInputStream fis = new FileInputStream("output.docx");XWPFDocument document = new XWPFDocument(fis);// 2. 读取所有段落for (XWPFParagraph paragraph : document.getParagraphs()) {System.out.println(paragraph.getText());}document.close();}
}

5. POI 操作 PPT(XSLF)

(1)写入 PPT(.pptx

import org.apache.poi.xslf.usermodel.*;
import java.io.FileOutputStream;public class PPTWriter {public static void main(String[] args) throws Exception {// 1. 创建 PPTXMLSlideShow ppt = new XMLSlideShow();// 2. 创建幻灯片XSLFSlide slide = ppt.createSlide();// 3. 添加标题XSLFTextBox shape = slide.createTextBox();XSLFTextRun textRun = shape.addNewTextParagraph().addNewTextRun();textRun.setText("Hello, POI PPT!");textRun.setFontSize(24.0);// 4. 保存到文件try (FileOutputStream fos = new FileOutputStream("output.pptx")) {ppt.write(fos);}System.out.println("PPT 文件生成成功!");}
}

(2)读取 PPT(.pptx

import org.apache.poi.xslf.usermodel.*;
import java.io.FileInputStream;public class PPTReader {public static void main(String[] args) throws Exception {// 1. 加载 PPT 文件FileInputStream fis = new FileInputStream("output.pptx");XMLSlideShow ppt = new XMLSlideShow(fis);// 2. 遍历所有幻灯片for (XSLFSlide slide : ppt.getSlides()) {for (XSLFShape shape : slide.getShapes()) {if (shape instanceof XSLFTextShape) {System.out.println(((XSLFTextShape) shape).getText());}}}ppt.close();}
}

6. 常见问题

(1)POI 如何处理日期格式?

CellStyle style = workbook.createCellStyle();
style.setDataFormat(workbook.createDataFormat().getFormat("yyyy-MM-dd"));
cell.setCellValue(new Date());
cell.setCellStyle(style);

(2)POI 如何设置单元格样式?

CellStyle style = workbook.createCellStyle();
style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
cell.setCellStyle(style);

(3)POI 如何处理大文件?

  • 使用 SXSSF(Excel)或 Event API(SAX 解析)减少内存占用。

7. 总结

功能API适用格式
Excel 操作HSSF/XSSF/SXSSF.xls/.xlsx
Word 操作HWPF/XWPF.doc/.docx
PPT 操作HSLF/XSLF.ppt/.pptx

POI 是 Java 操作 Office 文档的 最主流库,适用于:

  • 报表导出(Excel)
  • 合同生成(Word)
  • 幻灯片处理(PPT)

建议:

  • 小文件XSSF / XWPF / XSLF
  • 大文件SXSSF(Excel)或 SAX 解析(避免 OOM)
http://www.xdnf.cn/news/14834.html

相关文章:

  • 【网工|知识升华版|实验】5 网络质量探测
  • 【大模型学习】项目练习:文档对话助手
  • Linux开发工具——gcc/g++
  • MacOS 安装brew 国内源【超简洁步骤】
  • SpringBoot 自动配置原理
  • 优雅草蜻蜓T语音会议系统私有化部署方案与RTC技术深度解析-优雅草卓伊凡|clam
  • 金融安全生命线:用AWS EventBridge和CloudTrail构建主动式入侵检测系统
  • 跨平台开发的抉择:Flutter vs 原生安卓(Kotlin)的优劣对比与选型建议​​
  • 第五章 局域网基础
  • 网络编程学习路线
  • AI时代API挑战加剧,API安全厂商F5护航企业数字未来
  • AJAX 安装使用教程
  • 从定位到变现:创客匠人创始人IP打造的底层逻辑与实践路径
  • RediSearch 字段类型与配置选项
  • 当工业设备开始“独立思考“——AI边缘计算网关的泛在化应用
  • 分布式事务理论基础及常见解决方案
  • Linux基本命令篇 —— alias命令
  • Vue 安装使用教程
  • 【格与代数系统】格与哈斯图
  • 【1.6 漫画数据库设计实战 - 从零开始设计高性能数据库】
  • Docker进阶命令与参数——AI教你学Docker
  • 【Python基础】11 Python深度学习生态系统全景解析:从基础框架到专业应用的技术深度剖析(超长版,附多个代码及结果)
  • [Python 基础课程]字符串
  • 主流零信任安全产品深度介绍
  • ESP官网的使用手册网址
  • 【Python】断言(assert)
  • 学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测
  • 清理 Docker 缓存占用
  • 振荡电路Multisim电路仿真实验汇总——硬件工程师笔记
  • 【CSS样式】按钮样式