Apache POI用户自定义特殊格式索引重复问题咨询
解决Apache POI中格式索引无法区分数字与日期的问题
核心思路
别单纯依赖格式索引判断类型——Excel自定义格式可能出现不同类型(数字/日期)复用同一索引的情况,必须结合单元格格式的实际内容或POI提供的工具方法来区分。
具体解决方法
- 用POI内置工具类直接判断
POI的DateUtil.isCellDateFormatted(Cell cell)方法能准确识别单元格是否为日期格式,内部会检查单元格样式的格式字符串是否包含日期/时间相关掩码(如yyyy、MM、dd等),不受格式索引重复的影响。
示例代码:
Cell targetCell = sheet.getRow(rowNum).getCell(cellNum); if (DateUtil.isCellDateFormatted(targetCell)) { // 处理日期类型 Date cellDate = targetCell.getDateCellValue(); } else { // 处理数字类型 double cellNum = targetCell.getNumericCellValue(); }
- 手动解析格式字符串判断
如果需要更灵活的控制,可以直接获取单元格样式的格式字符串,通过匹配日期时间关键字区分:
CellStyle cellStyle = targetCell.getCellStyle(); String formatString = cellStyle.getDataFormatString(); // 匹配常见的日期时间格式标识 boolean isDateFormat = formatString.matches(".*(yyyy|MM|dd|HH|mm|ss|年|月|日).*"); if (isDateFormat) { // 日期格式逻辑 } else { // 数字格式逻辑 }
为什么会出现索引重复?
Excel的自定义格式索引按工作簿内格式的创建顺序分配,存在不同类型格式复用同一索引的可能;POI读取时只会返回索引对应的格式字符串(比如你遇到的"$"#,##0_);[Red]\("$"#,##0\)),无法直接从索引判断原始类型,因此必须通过上述方法额外校验。
内容的提问来源于stack exchange,提问作者Ron
相关产品推荐
相关产品推荐

