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 操作需求。

相关推荐
羑悻的小杀马特几秒前
当OT遇见IT:Apache IoTDB如何用“时序空间一体化“技术破解工业物联网数据孤岛困局?
apache·时序数据库·iotdb
wei_shuo2 小时前
时序数据库 Apache IoTDB 实战:基于 Kubernetes 的部署运维全指南
apache·时序数据库·iotdb
阿眠17 小时前
vue3实现web端和小程序端个人签名
前端·小程序·apache
愿你天黑有灯下雨有伞18 小时前
Java使用FastExcel实现Excel文件导入
java·excel
爆爆凯18 小时前
Excel 导入导出工具类文档
java·excel
凌康ACG1 天前
springboot打包二次压缩Excel导致损坏
spring boot·后端·excel
熊文豪1 天前
时序数据库选型指南 —— 为什么选择 Apache IoTDB?
apache·时序数据库·iotdb
lang201509281 天前
Apache Ignite 的 Pages Writes Throttling(页面写入节流)
apache
诸葛大钢铁2 天前
Excel转PDF的三种方法
笔记·职场和发展·pdf·excel
小小薛定谔2 天前
java操作Excel两种方式EasyExcel 和POI
java·python·excel