如何用Apache POI在Java中读取Excel单元格内的JSON对象数组
解决Apache POI读取Excel JSON单元格内容不全的问题
问题描述
将Excel表格导入MySQL数据库时,某单元格存储的是JSON数组格式内容,但使用Apache POI的getStringCellValue()方法读取时,仅返回“20 Gb”,无法获取完整的JSON数组字符串,需要实现读取原始JSON并原样存入数据库的需求。现有代码片段:
Integer price = row.getCell(0).getNumericCellValue(); String name = row.getCell(1).getStringCellValue(); String value = row.getCell(2).getStringCellValue();
(注:Excel单元格实际内容应为类似[{"name":"RAM","value":"20 Gb"},{"name":"Storage","value":"512 Gb"}]的JSON数组,但读取结果仅为其中某一项值)
解决方案
1. 强制将单元格转为字符串类型读取
通过手动设置单元格类型为字符串,绕过POI的自动类型识别,直接读取原始文本:
Cell jsonCell = row.getCell(2); // 先判断单元格是否为空 if (jsonCell != null) { jsonCell.setCellType(CellType.STRING); String fullJson = jsonCell.getStringCellValue(); // 后续将fullJson存入数据库 }
注意:Apache POI 4.x及以上版本中,
setCellType(CellType.STRING)会触发警告,若介意可使用下方方法。
2. 使用DataFormatter读取原始内容
DataFormatter可以适配各种单元格类型(包括公式、文本),配合FormulaEvaluator能准确获取单元格的原始输入内容:
DataFormatter formatter = new DataFormatter(); FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); Cell jsonCell = row.getCell(2); String fullJson = ""; if (jsonCell != null) { fullJson = formatter.formatCellValue(jsonCell, evaluator); } // 后续存入数据库
3. 检查Excel文件本身
若上述方法仍无法读取完整JSON,需确认Excel单元格的编辑栏内容:
- 若编辑栏显示的就是“20 Gb”,说明单元格实际存储的并非完整JSON,需检查Excel数据的来源(比如是否通过公式提取了JSON的某一部分);
- 若编辑栏显示完整JSON,说明单元格格式设置为仅显示部分内容,调整单元格格式为“文本”后再重新读取。
内容的提问来源于stack exchange,提问作者Kushagra Srivastva
相关产品推荐
相关产品推荐

