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);
📌 关键点:
- 返回的是“显示值”,不是原始值
- 对
STRING
、NUMERIC
、BOOLEAN
等非公式类型,直接返回格式化后的字符串 - 简单粗暴,一行代码搞定大部分场景
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
需要从 Workbook
的 CreationHelper
创建,不要手动 new。
5. 总结
方法 | 适用场景 | 是否推荐 |
---|---|---|
cell.getStringCellValue() |
仅 STRING 类型 |
❌ 不推荐 |
DataFormatter.formatCellValue(cell) |
非公式单元格 | ✅ 推荐 |
DataFormatter.formatCellValue(cell, evaluator) |
所有类型(含公式) | ✅✅ 强烈推荐 |
📌 最佳实践:只要涉及单元格转字符串,统一使用 DataFormatter + FormulaEvaluator
组合,一劳永逸,避免类型判断和异常。
示例代码已上传至 GitHub:https://github.com/baeldung/tutorials/tree/master/apache-poi