POI:setCellType(Cell.CELL_TYPE_FORMULA)因Cell.CELL_TYPE_ERROR而失败

时间:2014-11-09 22:01:36

标签: java excel apache-poi

我的Java应用程序读取xls文件并将其呈现在JTable上。到目前为止一切都很好。

当我尝试保存我的工作表时,我在我的JTable中迭代行,col和:

String str = (String) Table.getValueAt(row, col);

HSSFRow thisrow = sheet.getRow(row);
HSSFCell thiscell = thisrow.getCell(col);
if(thiscell==null) thiscell = thisrow.createCell(col);

switch(inferType(str)) {
    case "formula":
        thiscell.setCellType(Cell.CELL_TYPE_FORMULA);
        thiscell.setCellFormula(str.substring(1));
        break;
    case "numeric":
        thiscell.setCellType(Cell.CELL_TYPE_NUMERIC);
        thiscell.setCellValue(Double.parseDouble(str));
        break;
    case "text":
        thiscell.setCellType(Cell.CELL_TYPE_STRING);
        thiscell.setCellValue(str);
        break;
    }

但是,当我在一个最初是公式的单元格上运行时,说A1/B1,此时#DIV/0!setCellTypesetCellType失败。

通过大量调查,我发现当调用setCellType(Cell.CELL_TYPE_FORMULA)时,它会尝试将旧内容转换为新类型。但是,这对我来说似乎不是问题,因为每个表格公式单元格都已经是xls中的公式。 因此,我实际上从未改变类型。

即便如此,当我在已经是公式的单元格上调用#DIV/0!但是它被评估为Exception in thread "AWT-EventQueue-0" java.lang.IllegalStateException: Cannot get a numeric value from a error formula cell at org.apache.poi.hssf.usermodel.HSSFCell.typeMismatch(HSSFCell.java:648) at org.apache.poi.hssf.usermodel.HSSFCell.checkFormulaCachedValueType(HSSFCell.java:653) at org.apache.poi.hssf.usermodel.HSSFCell.getNumericCellValue(HSSFCell.java:678) at org.apache.poi.hssf.usermodel.HSSFCell.setCellType(HSSFCell.java:317) at org.apache.poi.hssf.usermodel.HSSFCell.setCellType(HSSFCell.java:283) 时,我会收到转换异常。

setCellType

实际上我唯一的解决方法是在if(thiscell.getCachedFormulaResultType()==Cell.CELL_TYPE_ERROR) thiscell = thisrow.createCell(col);

之前
setCellType

这是有效的,但我丢失了单元格的原始布局,例如它的颜色。

如果Cell是具有评估错误的公式,我该如何正确{{1}}

1 个答案:

答案 0 :(得分:0)

我在poi-apache的邮件列表中找到了这个:

  

为公式设置值时,有两种可能的情况   细胞;

     
      
  1. 更新公式的预先计算值。如果单元格包含公式,则cell.setCellValue只更新预先计算的公式   (缓存)公式值,公式本身保留和单元格类型   没有改变

  2.   
  3. 删除公式并将单元格类型更改为String或Number:

  4.         

    cell.setCellFormula(空); //删除公式

         

    然后是cell.setCellValue(“我改了!我的类型现在是CELL_TYPE_STRING”“);   或cell.setCellValue(200); // NA()消失,实际值为200

         

    我认为我们可以为case(1)改进cell.setCellValue。如果是新的   值与公式类型冲突然后IllegalArgumentException应该   被抛出

         

    问候,叶戈尔

仍然,确实对我来说是一种解决方法。但现在一切正常。

任何 cell.setCellFormula(null)之前

setCellType应该阻止转换失败,因为第一个会丢弃缓存的内容。