使用 Apache POI 从 Java 应用程序删除行时 Excel 公式未更新

Posted

技术标签:

【中文标题】使用 Apache POI 从 Java 应用程序删除行时 Excel 公式未更新【英文标题】:Excel formula not updating on row delete from java application using Apache POI 【发布时间】:2014-01-24 04:32:22 【问题描述】:

我在我的应用程序中使用 Apache POI 将数据写入 Excel 文件。我有一个 excel 文件模板,里面还有一些公式。在我的应用程序中,我使用excel模板,写入它,然后删除未使用的行并最后计算公式。我在文件中使用 SUM 公式。问题是当行被删除时,SUM 公式没有更新,因为 excel 中出现了错误值。

示例:使用的公式是:对于单元格 B215:SUM(B15:B214)。在应用程序中,写入文件后,我删除未使用的行。现在我的数据直到文件中的第 70 行。所有其他行都已删除。所以我的公式应该更新为:单元格 B70 的 SUM(B15:B69)。但在文件中,它仍将公式显示为 SUM(B15:B214)。因此该单元格的值为“VALUE#

代码sn-p:

File file = new File(path)
InputStream is = new FileInputStream(file)
POIFSFileSystem fs = new POIFSFileSystem(is)
HSSFWorkbook wb = new HSSFWorkbook(fs)
HSSFSheet excelSheet
int[] indexArray = populateSheet(excelSheet)

//indexArray是3个值的数组,分别是startrow、lastrow和第一个空行。

removeBlankRows(excelSheet,indexArray)



//evaluate formula

FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator()
for(HSSFRow r : excelSheet) 
 for(HSSFCell c : r) 
  if(c.getCellType() == Cell.CELL_TYPE_FORMULA) 
    String formula = c.getCellFormula();
    evaluator.evaluateFormulaCell(c)
    
 


private void removeBlankRows(HSSFSheet sheet, int[] shiftInfo)
        for(int i = shiftInfo[2]; i <= shiftInfo[1]; ++i) 
            sheet.removeRow(sheet.getRow(i))
        
        //Shift up the rows
        def startRow = shiftInfo[1]+1
        def endRow = sheet.getLastRowNum()
        def rowCount = -1* (shiftInfo[1] - shiftInfo[2] + 1)
        sheet.shiftRows(startRow, endRow, rowCount)
    

【问题讨论】:

您为什么不按原样重新输入公式?我怀疑 excel UI 正在触发自动公式更改,但 POI 只是在操作直接单元格,而不是解决对公式的更改。 如果您使用编码尝试更新您的帖子会有所帮助! +1 提示更新相关代码 可惜代码无法编译 【参考方案1】:

这是一个 Excel 错误。我过去通过以下方式处理过这个问题:

    标记总和单元 BSUM 我们需要一个不受插入/删除影响的稳定范围。 将公式添加到安全(不会被删除的)单元格,对于本例 D15:="B15:B"&ROW(BSUM)-1 这将产生一个稳定的范围。 在 BSUM 单元格中使用 INDIRECT,如下所示: =SUM(间接(D15))

【讨论】:

以上是关于使用 Apache POI 从 Java 应用程序删除行时 Excel 公式未更新的主要内容,如果未能解决你的问题,请参考以下文章

Apache POI的简单使用记录

Java从Apache poi获取excel单元格背景颜色

无法从Excel读取'java.lang.ClassCastException:org.apache.poi.hssf.usermodel.HSSFCell无法强制转换为java.lang.S

Apache POI - Java Excel APIs

求解!JAVA 使用Apache POI将PPTX转图片出错。见下图

将数据从 oracle DB 转储到 excel 时出错 - java.lang.NoSuchMethodError: org.apache.poi.hssf.record.BOFRecord.set