Skip to content

Apache POI 使用指南

标签
Apache
ApachePOI
字数
860 字
阅读时间
5 分钟

1 简介

Apache POI 是一个强大的 Java 库,用于读写 Microsoft Office 格式的文件。它支持 Excel、Word、PowerPoint 等多种文件格式,是企业级应用中常用的工具。

2 安装

2.1 Maven

在项目的 pom.xml 文件中添加以下依赖:

xml
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>5.2.3</version>
</dependency>

2.2 Gradle

在项目的 build.gradle 文件中添加以下依赖:

groovy
implementation 'org.apache.poi:poi-ooxml:5.2.3'

3 基本用法

Apache POI 提供了丰富的 API 来操作不同类型的 Office 文件。以下是一些基本概念:

  • Workbook: 表示整个 Excel 文件。
  • Sheet: 表示 Excel 文件中的一个工作表。
  • Row: 表示工作表中的一行。
  • Cell: 表示工作表中的一个单元格。

4 读写 Excel 文件

4.1 创建 Excel 文件

java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelWriter {

    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");

        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue("Hello, Apache POI!");

        try (FileOutputStream outputStream = new FileOutputStream("example.xlsx")) {
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

4.2 读取 Excel 文件

java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;

public class ExcelReader {

    public static void main(String[] args) {
        try (FileInputStream inputStream = new FileInputStream("example.xlsx")) {
            Workbook workbook = new XSSFWorkbook(inputStream);
            Sheet sheet = workbook.getSheetAt(0);

            for (Row row : sheet) {
                for (Cell cell : row) {
                    System.out.print(cell.getStringCellValue() + "\t");
                }
                System.out.println();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5 读写 Word 文件

5.1 创建 Word 文件

java
import org.apache.poi.xwpf.usermodel.*;

import java.io.FileOutputStream;
import java.io.IOException;

public class WordWriter {

    public static void main(String[] args) {
        XWPFDocument document = new XWPFDocument();

        XWPFParagraph paragraph = document.createParagraph();
        XWPFRun run = paragraph.createRun();
        run.setText("Hello, Apache POI!");

        try (FileOutputStream outputStream = new FileOutputStream("example.docx")) {
            document.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

5.2 读取 Word 文件

java
import org.apache.poi.xwpf.usermodel.*;

import java.io.FileInputStream;
import java.io.IOException;

public class WordReader {

    public static void main(String[] args) {
        try (FileInputStream inputStream = new FileInputStream("example.docx")) {
            XWPFDocument document = new XWPFDocument(inputStream);

            for (XWPFParagraph paragraph : document.getParagraphs()) {
                System.out.println(paragraph.getText());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6 读写 PowerPoint 文件

6.1 创建 PowerPoint 文件

java
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTextBox;
import org.apache.poi.xslf.usermodel.XSLFTextParagraph;
import org.apache.poi.xslf.usermodel.XSLFTextRun;

import java.io.FileOutputStream;
import java.io.IOException;

public class PowerPointWriter {

    public static void main(String[] args) {
        XMLSlideShow ppt = new XMLSlideShow();
        XSLFSlide slide = ppt.createSlide();

        XSLFTextBox shape = slide.createTextBox();
        XSLFTextParagraph p = shape.addNewTextParagraph();
        XSLFTextRun r = p.addNewTextRun();
        r.setText("Hello, Apache POI!");

        try (FileOutputStream outputStream = new FileOutputStream("example.pptx")) {
            ppt.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

6.2 读取 PowerPoint 文件

java
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;

import java.io.FileInputStream;
import java.io.IOException;

public class PowerPointReader {

    public static void main(String[] args) {
        try (FileInputStream inputStream = new FileInputStream("example.pptx")) {
            XMLSlideShow ppt = new XMLSlideShow(inputStream);

            for (XSLFSlide slide : ppt.getSlides()) {
                System.out.println(slide.getTitle());
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

7 高级功能

Apache POI 还支持许多高级功能,如:

  • 样式设置: 例如字体、颜色、边框等。
  • 图片插入: 在 Excel、Word、PowerPoint 文件中插入图片。
  • 表格操作: 在 Word 文件中创建和操作表格。
  • 合并单元格: 在 Excel 文件中合并单元格。

8 示例代码

8.1 设置 Excel 单元格样式

java
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelStyleExample {

    public static void main(String[] args) {
        Workbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("Sheet1");

        Row row = sheet.createRow(0);
        Cell cell = row.createCell(0);
        cell.setCellValue("Styled Cell");

        CellStyle style = workbook.createCellStyle();
        Font font = workbook.createFont();
        font.setBold(true);
        font.setFontHeightInPoints((short) 14);
        style.setFont(font);
        cell.setCellStyle(style);

        try (FileOutputStream outputStream = new FileOutputStream("styled_example.xlsx")) {
            workbook.write(outputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

9 常见问题

9.1 如何处理大文件?

处理大文件时,可以使用 SXSSFWorkbook 来减少内存消耗。SXSSFWorkbookXSSFWorkbook 的流式写法,适合处理大数据量的 Excel 文件。

9.2 如何设置自动换行?

可以通过 CellStyle 设置自动换行:

java
CellStyle style = workbook.createCellStyle();
style.setWrapText(true);
cell.setCellStyle(style);

9.3 如何合并单元格?

可以使用 sheet.addMergedRegion 方法来合并单元格:

java
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 1));