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 依赖

xml 复制代码
<!-- 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)

java 复制代码
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)

java 复制代码
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)

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

java 复制代码
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)

java 复制代码
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)

java 复制代码
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)

java 复制代码
import org.apache.poi.xslf.usermodel.*;
import java.io.FileOutputStream;

public class PPTWriter {
    public static void main(String[] args) throws Exception {
        // 1. 创建 PPT
        XMLSlideShow 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)

java 复制代码
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 如何处理日期格式?

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

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

java 复制代码
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)
相关推荐
奶油话梅糖43 分钟前
打开项目 0.9 秒、内存只有 IDEA 的 1/12:OpenIDEA 用 Rust 把 IntelliJ IDEA 重造了一遍
java·rust·github·intellij-idea
vipxieliang1 小时前
语言对比卡:PHP vs Go vs Java 的优缺点、适用场景与「为什么选 PHP」
java·go·php
Rain的Java大神之路1 小时前
公交App上“还有2站,约5分钟”怎么实现?90%的人答错这道大厂面试题:GPS漂移、ETA不准、10万QPS热点读全拆透(附完整代码)
java·后端·面试
golang学习记1 小时前
IDEA 2026.3 远程开发迎来重磅升级
java·ide·intellij-idea·远程开发
天天被压力1 小时前
【A股分钟级高频数据完全手册 #04】指数分钟级行情数据接口:沪深指数Pro版最新分时取数
java·人工智能·python
敲代码的小小酥2 小时前
谈SpringMVC与Spring WebFlux的区别与适用场景
java·后端·spring
天天被压力2 小时前
【A股分钟级高频数据完全手册 #03】股票历史1分钟K线数据接口怎么用:Pro版批量拉取与本地缓存
java·人工智能·python
apcipot_rain2 小时前
C++转Java日记(02)
java·开发语言·c++
nice_lcj5202 小时前
【从零理解 Spring AI · 03】Spring AI 在 Spring 生态里的位置
java·spring boot·大模型·spring ai·ai应用开发
码农小河6612 小时前
基于SSM+JSP的高校专业信息管理系统【附源码+数据库】
java·开发语言·数据库