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

发布于:2025-07-04 ⋅ 阅读:(10) ⋅ 点赞:(0)

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. 创建 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

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)

网站公告

今日签到

点亮在社区的每一天
去签到