簡體   English   中英

Excel公式未使用Apache POI從Java應用程序中刪除行刪除

[英]Excel formula not updating on row delete from java application using Apache POI

我在我的應用程序中使用Apache POI將數據寫入excel文件。 我有一個excel文件模板,其中還有一些公式。 在我的應用程序中,我使用excel模板,寫入,然后刪除未使用的行並最終計算公式。 我在文件中使用SUM公式。 問題是當刪除行時,SUM公式不會更新,因為excel中會出現錯誤值。

示例:使用的公式為:對於單元格B215:SUM(B15:B214)。 在應用程序中,寫入文件后我刪除了未使用的行。 現在我的數據直到文件中的第70行。所有其他行都被刪除了。 所以我的公式應該更新為:單元格B70的SUM(B15:B69)。 但是在文件中它仍然顯示公式為SUM(B15:B214)。 因此,該單元格的值為“VALUE#”

代碼段:

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錯誤。 我過去通過以下方式解決了這個問題:

  1. 標記和細胞BSUM
  2. 我們需要一個不受插入/刪除影響的穩定范圍。 將公式添加到安全(一個不會被刪除的)單元格,對於此示例D15:=“B15:B”&ROW(BSUM)-1這將產生一個穩定的范圍。
  3. 在BSUM單元格中使用INDIRECT,如下所示:
    = SUM(INDIRECT(D15))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM