Apache POI—读写Office格式文件

Apache POI 是一个开源的 Java 库,用于读写 Microsoft Office 格式的文件,主要包括 Excel、Word 和 PowerPoint 等文档。POI 对 Excel 文件的支持最为完善,通过 POI 可以方便地进行 Excel 文件的创建、编辑、读取等操作。

1. Apache POI 简介

Apache POI(Poor Obfuscation Implementation)是专为 Java 提供的 Office 文档处理工具。它包含多个子组件:

  • HSSF (Horrible Spreadsheet Format):用于处理 Excel 97-2003(.xls)格式的文件。
  • XSSF (XML Spreadsheet Format):用于处理 Excel 2007+(.xlsx)格式的文件。
  • HWPF (Horrible Word Processor Format):用于处理 Word 97-2003(.doc)格式的文件。
  • XWPF :用于处理 Word 2007+(.docx)格式的文件。
  • HSLFXSLF:用于处理 PowerPoint 文件。
  • SXSSF(Streaming XSSF):基于 XSSF 的流式 API,适合处理超大数据量的 Excel 文件。

2. 引入 Apache POI 依赖

在 Maven 项目中添加 POI 的依赖,通常只需要引入 Excel 相关的 poi-ooxml 包。

复制代码
<dependencies>
    <!-- POI 基础包 -->
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.16</version>
    </dependency>
</dependencies>

3. 基本使用方法

3.1 创建 Excel 文件

java 复制代码
import org.apache.poi.ss.usermodel.*;           // 引入通用的 POI Excel 操作类
import org.apache.poi.xssf.usermodel.XSSFWorkbook; // 引入 XSSFWorkbook 类用于创建 .xlsx 格式的工作簿

import java.io.FileOutputStream;

public class ExcelWriter {

    public static void main(String[] args) {
        // 创建一个新的 Excel 工作簿,使用 XSSFWorkbook 创建 .xlsx 格式文件
        Workbook workbook = new XSSFWorkbook();

        // 创建一个名为 "Sheet1" 的工作表
        Sheet sheet = workbook.createSheet("Sheet1");

        // 在工作表中创建第一行 (索引为 0) 并在该行中创建一个单元格 (索引为 0)
        Row row = sheet.createRow(0);         // 创建第一行
        Cell cell = row.createCell(0);        // 在第一行创建第一个单元格

        // 向单元格中写入数据 "Hello, POI!"
        cell.setCellValue("Hello, POI!");     // 设置单元格的值

        // 将工作簿内容输出到指定文件 "example.xlsx" 中
        try (FileOutputStream fos = new FileOutputStream("example.xlsx")) {
            workbook.write(fos);              // 将工作簿写入文件输出流
        } catch (Exception e) {
            e.printStackTrace();              // 捕获并打印异常,避免写入失败时程序崩溃
        }

        // 关闭工作簿以释放资源
        try {
            workbook.close();                 // 关闭工作簿
        } catch (Exception e) {
            e.printStackTrace();              // 捕获并打印异常,避免资源未释放时程序崩溃
        }
    }
}

3.2 读取 Excel 文件

java 复制代码
import org.apache.poi.ss.usermodel.*;          // 导入 POI 通用 Excel 操作类
import java.io.FileInputStream;

public class ExcelReader {

    public static void main(String[] args) {
        // 尝试打开文件输入流读取指定的 Excel 文件
        try (FileInputStream fis = new FileInputStream("example.xlsx");
             Workbook workbook = new XSSFWorkbook(fis)) {   // 使用 XSSFWorkbook 读取 .xlsx 文件格式的工作簿

            // 获取 Excel 文件中的第一个工作表,索引从 0 开始
            Sheet sheet = workbook.getSheetAt(0);

            // 遍历工作表中的每一行
            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("未知数据类型\t"); // 输出未知类型提示
                            break;
                    }
                }
                System.out.println();                       // 每读取一行的数据后换行输出
            }
        } catch (Exception e) {
            e.printStackTrace();                            // 捕获并打印异常信息
        }
    }
}

4. 常用操作

4.1 设置单元格样式

java 复制代码
// 创建单元格样式对象,用于设置单元格的样式
CellStyle style = workbook.createCellStyle();

// 创建字体对象,用于设置单元格字体的样式
Font font = workbook.createFont();
font.setBold(true);                     // 设置字体加粗
font.setFontHeightInPoints((short) 14); // 设置字体大小为 14 磅

// 将字体样式应用到单元格样式中
style.setFont(font);

// 将样式应用到指定的单元格
cell.setCellStyle(style);               // 设置单元格样式

4.2 合并单元格

java 复制代码
import org.apache.poi.ss.util.CellRangeAddress;

sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 2)); // 合并第 0-1 行,第 0-2 列

4.3 写入日期数据

java 复制代码
// 创建一个新的单元格用于存储日期数据,位于当前行的第 2 列(索引 1)
Cell dateCell = row.createCell(1);
dateCell.setCellValue(new Date()); // 设置当前日期作为单元格的值

// 创建单元格样式对象,用于设置日期格式
CellStyle dateStyle = workbook.createCellStyle();

// 设置日期格式为 "yyyy-MM-dd"
// 使用 workbook 的 CreationHelper 创建 DataFormat 对象,并应用自定义格式
dateStyle.setDataFormat(workbook.getCreationHelper().createDataFormat().getFormat("yyyy-MM-dd"));

// 将样式应用到日期单元格,使其显示为指定的日期格式
dateCell.setCellStyle(dateStyle);

4.4 公式计算

java 复制代码
Cell formulaCell = row.createCell(2);
formulaCell.setCellFormula("SUM(A1:A10)"); // 设置单元格为求和公式

5. 处理大数据量 Excel 文件

当数据量较大时,SXSSF(Streaming Usermodel API) 是处理大文件的更佳选择。SXSSF 是基于 XSSF 的流式写入方式,适合数据量大的情况下避免内存溢出。

java 复制代码
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

public class LargeExcelWriter {

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

        for (int i = 0; i < 100000; i++) {
            Row row = sheet.createRow(i);
            for (int j = 0; j < 10; j++) {
                Cell cell = row.createCell(j);
                cell.setCellValue("Data " + i + "," + j);
            }
        }

        try (FileOutputStream fos = new FileOutputStream("large_data.xlsx")) {
            workbook.write(fos);
        } catch (Exception e) {
            e.printStackTrace();
        }

        ((SXSSFWorkbook) workbook).dispose(); // 清除临时文件,释放内存
    }
}

6. 总结

Apache POI 是处理 Excel 文件的强大工具,通过 POI 可以实现 Excel 的创建、读取、编辑、写入等操作。小数据量使用 XSSFWorkbook,大数据量使用 SXSSFWorkbook。掌握基本的单元格操作、样式设置、数据格式和公式应用,可以满足绝大多数的 Excel 操作需求。

相关推荐
LAM LAB2 天前
【VBA】Excel指定单元格范围内字体设置样式,处理导出课表单元格
excel·vba
在这habit之下2 天前
Keepalived学习总结
excel
james的分享2 天前
大数据领域核心 SQL 优化框架Apache Calcite介绍
大数据·sql·apache·calcite
莫寒清2 天前
Apache Tika
java·人工智能·spring·apache·知识图谱
Youngchatgpt2 天前
如何在 Excel 中使用 ChatGPT:自动化任务和编写公式
人工智能·chatgpt·自动化·excel
开开心心就好2 天前
安卓开源应用,超时提醒紧急人护独居安全
windows·决策树·计算机视觉·pdf·计算机外设·excel·动态规划
D_C_tyu2 天前
Vue3 + Element Plus | el-table 多级表头表格导出 Excel(含合并单元格、单元格居中)第二版
vue.js·elementui·excel
归叶再无青2 天前
web服务安装部署、性能升级等(Apache、Nginx)
运维·前端·nginx·云原生·apache·bash
骆驼爱记录2 天前
WPS页码设置:第X页共Y-1页
自动化·word·excel·wps·新人首发