1. 概述

Excel 单元格可以包含多种数据类型,比如字符串、数字、布尔值,甚至公式。

本文将介绍如何使用 Apache POI,无论单元格是什么类型,都将其值以字符串形式读取出来。这是处理 Excel 数据时非常常见的需求,尤其是在导出、展示或日志记录场景中。

2. Apache POI 基础

首先,在 pom.xml 中引入 Apache POI 核心依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>

Apache POI 使用以下核心接口来建模 Excel 文件结构:

  • Workbook:代表整个 Excel 文件
  • Sheet:代表一个工作表
  • Row:代表一行
  • Cell:代表一个单元格

通过 Cell.getCellType() 方法可以获取单元格的类型。POI 支持的类型包括:

  • BLANK(空)
  • BOOLEAN(布尔)
  • ERROR(错误)
  • FORMULA(公式)
  • NUMERIC(数值)
  • STRING(字符串)

⚠️ 踩坑提示:直接调用 cell.getStringCellValue() 只对 STRING 类型有效,其他类型会抛异常。所以不能无脑调用。

我们的目标是:无论什么类型,都能拿到一个“人眼看得到”的字符串值,也就是 Excel 表格里显示的内容。

3. 使用 DataFormatter 获取字符串值

✅ 推荐做法:使用 DataFormatter 类来获取单元格的格式化字符串表示。

DataFormatter.formatCellValue(cell) 会返回 Excel 中实际显示的文本,自动应用单元格的格式规则,比如数字保留几位小数、日期格式化等。

示例:一个数值为 1.234,格式设置为 "0.00" 的单元格:

Cell cell = // 数值单元格,值为 1.234,格式为 "0.00"

DataFormatter formatter = new DataFormatter();
String strValue = formatter.formatCellValue(cell);

assertEquals("1.23", strValue);

📌 关键点:

  • 返回的是“显示值”,不是原始值
  • STRINGNUMERICBOOLEAN 等非公式类型,直接返回格式化后的字符串
  • 简单粗暴,一行代码搞定大部分场景

4. 处理公式单元格(FORMULA 类型)

❌ 问题:如果单元格是公式类型,DataFormatter.formatCellValue(cell) 默认返回的是公式本身(如 "SUM(A1:A2)"),而不是计算结果。

✅ 解决方案:配合 FormulaEvaluator 使用,先计算公式,再格式化结果。

Workbook workbook = // 已加载的 Workbook 实例
FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator();

Cell cell = // 公式单元格,例如 =SUM(1,2)

DataFormatter formatter = new DataFormatter();
String strValue = formatter.formatCellValue(cell, evaluator);

assertEquals("3", strValue);

📌 核心逻辑:

  • FormulaEvaluator 负责计算公式得出结果
  • DataFormatter 再将结果按单元格格式转为字符串
  • 这个组合方法对所有类型都适用 —— 公式类走计算,非公式类直接格式化

⚠️ 注意:FormulaEvaluator 需要从 WorkbookCreationHelper 创建,不要手动 new。

5. 总结

方法 适用场景 是否推荐
cell.getStringCellValue() STRING 类型 ❌ 不推荐
DataFormatter.formatCellValue(cell) 非公式单元格 ✅ 推荐
DataFormatter.formatCellValue(cell, evaluator) 所有类型(含公式) ✅✅ 强烈推荐

📌 最佳实践:只要涉及单元格转字符串,统一使用 DataFormatter + FormulaEvaluator 组合,一劳永逸,避免类型判断和异常。

示例代码已上传至 GitHub:https://github.com/baeldung/tutorials/tree/master/apache-poi


原始标题:Get String Value of Excel Cell with Apache POI