如何用Apache POI读取Excel中含JSON数组的列的原始字符串?
问题:Apache POI无法读取Excel中存储JSON数组的列内容
我尝试读取一个仅包含一列的Excel文件,该列存储的是JSON数组,但使用Apache POI无法以字符串形式读取它。以下是我的代码:
XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet worksheet = workbook.getSheetAt(0); int index = 0; for (index = 0; index < worksheet.getPhysicalNumberOfRows(); index++) { if (index > 0) { XSSFRow row = worksheet.getRow(index); String b = row.getCell(0).getStringCellValue(); System.out.println(b); } }
这段代码无法返回列的字符串形式值,请问如何才能原样读取列的字符串内容?
(注:Excel单元格内容示例为类似[{"id":1,"name":"test"},{"id":2,"name":"demo"}]的JSON数组)
解决方法
问题出在getStringCellValue()仅能读取字符串类型的单元格,如果Excel单元格的类型不是字符串(比如被识别为公式、数值或其他类型),就会抛出异常或无法获取正确内容。可以通过以下两种方式解决:
方法1:使用DataFormatter获取单元格显示文本
DataFormatter可以将任何类型的单元格内容转换为Excel界面上显示的文本格式,完美适配JSON数组这类内容:
import org.apache.poi.ss.usermodel.DataFormatter; XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet worksheet = workbook.getSheetAt(0); DataFormatter formatter = new DataFormatter(); int index = 0; for (index = 0; index < worksheet.getPhysicalNumberOfRows(); index++) { if (index > 0) { XSSFRow row = worksheet.getRow(index); if (row != null) { XSSFCell cell = row.getCell(0); // 使用DataFormatter获取单元格的显示文本 String jsonContent = formatter.formatCellValue(cell); System.out.println(jsonContent); } } }
方法2:判断单元格类型并针对性处理
如果需要更精细的控制,可以先判断单元格的类型,再根据类型读取内容:
XSSFWorkbook workbook = new XSSFWorkbook(file); XSSFSheet worksheet = workbook.getSheetAt(0); int index = 0; for (index = 0; index < worksheet.getPhysicalNumberOfRows(); index++) { if (index > 0) { XSSFRow row = worksheet.getRow(index); if (row != null) { XSSFCell cell = row.getCell(0); String jsonContent = ""; if (cell != null) { switch (cell.getCellType()) { case STRING: jsonContent = cell.getStringCellValue(); break; case NUMERIC: // 如果JSON被误识别为数值,转为字符串 jsonContent = String.valueOf(cell.getNumericCellValue()); break; case FORMULA: // 处理公式计算后的结果 jsonContent = cell.getCellFormula(); // 或者获取公式计算结果: // FormulaEvaluator evaluator = workbook.getCreationHelper().createFormulaEvaluator(); // jsonContent = evaluator.evaluate(cell).getStringValue(); break; default: jsonContent = ""; } } System.out.println(jsonContent); } } }
内容的提问来源于stack exchange,提问作者Kushagra Srivastva
相关产品推荐
相关产品推荐

