POI解析Excel,XSSFCell.CELL_TYPE_STRING等无法引入问题


问题还原:


POI低版本中, 通过XSSFCell.CELL_TYPE_STRING等判断值类型时,提示无法引入。源代码如下:

public static String formatCell(Cell cell) {
      String value = null;
      switch (cell.getCellType()) {
      // 数值型,0
      case XSSFCell.CELL_TYPE_NUMERIC://老版
         if (HSSFDateUtil.isCellDateFormatted(cell)) {
            //如果是date类型则 ,获取该cell的date值 
            Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            value = format.format(date);
         } else {// 纯数字
            //value = (new BigDecimal(cell.getNumericCellValue())).toString();
            value = String.valueOf(cell.getNumericCellValue());
            //解决1234.0  去掉后面的.0
            if(null != value && !"".equals(value.trim())){
               String[] item = value.split("[.]");  
               if(1 < item.length && "0".equals(item[1])){
                  value = item[0];
               }
            }
         }
         break;
      // 字符串型,1
      case XSSFCell.CELL_TYPE_STRING://老版
         value = cell.getStringCellValue().toString();
         break;
      //公式类型,2
      case XSSFCell.CELL_TYPE_FORMULA:
         //读公式计算值  
//            value = String.valueOf(cell.getNumericCellValue());
//            if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
//                value = cell.getStringCellValue().toString();
//            }
         value = String.valueOf(cell.getCellFormula());
            break;
      // 空值,3
      case XSSFCell.CELL_TYPE_BLANK:
         value = "";
         break;
      // 布尔型,4
      case XSSFCell.CELL_TYPE_BOOLEAN:
         value = ""+cell.getBooleanCellValue();
         break;
      //错误,5
      case XSSFCell.CELL_TYPE_ERROR:
         value = "";
         break;
      default:
         value = cell.getStringCellValue();
      }
      return value;
   }

本人使用的是4.1.0版本,pom如下:

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.1.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.2</version>
</dependency>

解决方案:


原方式对应的更换为case STRING等,代码如下:

public static String formatCell(Cell cell) {
      String value = null;
      switch (cell.getCellType()) {
      // 数值型,0 
      case NUMERIC:
         if (HSSFDateUtil.isCellDateFormatted(cell)) {
            //如果是date类型则 ,获取该cell的date值 
            Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            value = format.format(date);
         } else {// 纯数字
            //value = (new BigDecimal(cell.getNumericCellValue())).toString();
            value = String.valueOf(cell.getNumericCellValue());
            //解决1234.0  去掉后面的.0
            if(null != value && !"".equals(value.trim())){
               String[] item = value.split("[.]");  
               if(1 < item.length && "0".equals(item[1])){
                  value = item[0];
               }
            }
         }
         break;
      // 字符串型,1 
      case STRING:
         value = cell.getStringCellValue().toString();
         break;
      //公式类型,2
      case FORMULA:
         //读公式计算值  
//            value = String.valueOf(cell.getNumericCellValue());
//            if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
//                value = cell.getStringCellValue().toString();
//            }
         value = String.valueOf(cell.getCellFormula());
            break;
      // 空值,3
      case BLANK:
         value = "";
         break;
      // 布尔型,4
      case BOOLEAN:
         value = ""+cell.getBooleanCellValue();
         break;
      //错误,5
      case ERROR:
         value = "";
         break;
      default:
         value = cell.getStringCellValue();
      }
      return value;
   }

PS:欢迎大家点赞、关注、支持。如有需要,欢迎添加博主QQ沟通交流!QQ:156587607

<think> 我们注意到用户提供的代码中使用了XSSFCell.CELL_TYPE_*常量,这些常量在POI 4.0及以上版本中已被弃用,改为使用CellType枚举。 因此,我们需要将代码迁移到新的CellType枚举方式。 修改点: 1. 将switch的条件改为cell.getCellType(),返回的是CellType枚举值。 2. 将每个case后的常量改为对应的枚举常量(如:XSSFCell.CELL_TYPE_FORMULA -> CellType.FORMULA)。 3. 注意:在旧版本中,BLANK类型错误地使用了getBooleanCellValue(),这会导致异常,应该直接返回空字符串。 4. 另外,对于公式单元格,有时候可能需要获取公式计算后的值,但根据原代码,这里获取的是公式字符串。如果需要计算结果,则需要使用evaluate方法(但原需求是获取公式字符串,所以保持原逻辑)。 修正后的代码: 注意:需要导入org.apache.poi.ss.usermodel.CellType; 代码示例: ```java import org.apache.poi.ss.usermodel.CellType; // ... 其他代码 switch (cell.getCellType()) { case FORMULA: value = cell.getCellFormula(); break; case NUMERIC: value = String.valueOf(cell.getNumericCellValue()); break; case STRING: value = cell.getStringCellValue(); break; case BLANK: value = ""; // 空白单元格,原代码错误地使用了getBooleanCellValue,这里修正为空字符串 break; case BOOLEAN: value = String.valueOf(cell.getBooleanCellValue()); break; case ERROR: value = String.valueOf(cell.getErrorCellValue()); break; default: value = ""; // 其他未知类型,返回空字符串 } ``` 注意:原代码中缺少对BOOLEAN类型的处理,并且将BLANK类型错误地当作布尔值获取。修正后,我们为BOOLEAN类型单独处理,BLANK类型直接返回空字符串。 另外,如果单元格是公式类型,并且需要获取公式计算后的值,可以使用: if (cell.getCellType() == CellType.FORMULA) { switch (cell.getCachedFormulaResultType()) { case NUMERIC: ... break; case STRING: ... break; ... // 其他类型 } } 但根据原代码逻辑,这里只获取公式字符串,所以不需要改变。 同时,我们使用String.valueOf()来转换数值、布尔值和错误值,这样更规范。 最后,建议检查POI版本,确保使用的是新版本(至少3.17以上,推荐4.x)。 根据要求,我们提供修正后的代码,并按照规则在最后提出3-5个相关问题。 </think> 以下是针对Apache POI升级后XSSFCell类型常量变更的解决方案。新版POI(4.0+)已弃用`XSSFCell.CELL_TYPE_*`常量,改用`CellType`枚举类: ### 修正后的代码: ```java import org.apache.poi.ss.usermodel.CellType; // 类型别内容读取 switch (cell.getCellType()) { // 直接获取枚举类型 case FORMULA: value = cell.getCellFormula(); // 获取公式表达式 break; case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { value = cell.getDateCellValue().toString(); // 日期特殊处理 } else { value = String.valueOf(cell.getNumericCellValue()); // 数值转字符串 } break; case STRING: value = cell.getStringCellValue(); // 直接获取字符串 break; case BLANK: value = ""; // 空白单元格返回空字符串 break; case BOOLEAN: // 新增布尔类型处理 value = String.valueOf(cell.getBooleanCellValue()); break; case ERROR: value = String.valueOf(cell.getErrorCellValue()); // 错误代码转字符串 break; default: value = ""; // 未知类型兜底 } ``` ### 关键修改说明: 1. **枚举类型迁移**: - 导入`org.apache.poi.ss.usermodel.CellType` - 移除`XSSFCell.CELL_TYPE_*`常量引用 - 使用`CellType.FORMULA`等枚举值 2. **新增日期处理**: - 使用`DateUtil.isCellDateFormatted()`检测日期格式 - 日期类型调用`getDateCellValue()`获取日期对象 3. **补充布尔类型**: - 新增`BOOLEAN`分支处理布尔值单元格 - 原代码中布尔值被错误归类到`BLANK`分支 4. **空白单元格修复**: - 修正`BLANK`分支错误调用`getBooleanCellValue()` - 改为直接返回空字符串 > ⚠️ 注意:POI 4.x需统一使用`ss.usermodel`包下的通用接口,避免直接使用XSSF特定类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值