2013-07-11 178 views
1

我使用Apache POI從現有的XSSFWorkbook創建新的XSSFWorkbook後,更新了一些值。假設我在現有的工作簿中有兩個工作表(可以說:工作表A & B)。工作表B有工作表A中的某些單元格引用。如果我修改工作表A的這些單元格值並將它們另存爲新的工作簿,則工作表B的相應單元格值也應更新。但事實並非如此。我如何以編程方式更新它們? 。謝謝。如何使用Apache POI更新單元格參考值

我的代碼:

public void createExcel(ClientData cd) throws FileNotFoundException, IOException, InvalidFormatException{ 
      // create a new file 
     double[] dataHolder1= cd.getFinalData1(), param1 = cd.getRecord1Param(); 
     double[] dataHolder2 = cd.getFinalData2(), param2 = cd.getRecord2Param(); 
     double[] ncv = cd.getNcv(); 
     String[] pname = cd.getName(); 
      Workbook workbook = new XSSFWorkbook(OPCPackage.open(new FileInputStream("template/mncv.xlsx"))); // or sample.xls 
      //CreationHelper createHelper = workbook.getCreationHelper(); 
      Sheet s=workbook.getSheetAt(0); 

      int counter = dataHolder1.length + param1.length +param2.length+dataHolder2.length;//+ param1.length + param2.length; 
//   r = s.getRow(0); 
//   r.getCell(0).setCellValue("Param1"); 
//   r.getCell(1).setCellValue("Record1"); 
//   r.getCell(2).setCellValue("Param2"); 
//   r.getCell(3).setCellValue("Record2"); 

      int i; 
      for(i=0;i<counter;i++){ 
       if(i<param1.length){ 
        for(int j=0;j<param1.length;j++){ 
         r = s.getRow(i); 
         r.getCell(0).setCellValue(param1[j]); 
         i++; 
        } 
       }else if(i<dataHolder1.length+param1.length && i>=param1.length){ 

        for(int j=0;j<dataHolder1.length;j++){ 
         r = s.getRow(i); 
         r.getCell(0).setCellValue(dataHolder1[j]); 
         i++; 
        } 

       }else if(i<dataHolder1.length+param1.length+param2.length && i>=dataHolder1.length+param1.length){ 
        for(int j=0;j<param2.length;j++){ 
         r = s.getRow(i); 
         r.getCell(0).setCellValue(param2[j]); 
         i++; 
        } 
       }else{ 
        for(int j=0;j<dataHolder2.length;j++){ 
         r = s.getRow(i); 
         r.getCell(0).setCellValue(dataHolder2[j]); 
         i++; 
        } 
       } 

//    if(i<=param1.length){ 
//     r.getCell(0).setCellValue(param1[i-1]); 
//     r.getCell(2).setCellValue(param2[i-1]); 
// 
//    } 
       // r.getCell(0).setCellValue(param1[i]); 
       //r.getCell(3).setCellValue(dataHolder2[i-1]); 
       i--; 
      } 
      for(int k=0;k<ncv.length;k++){ 
       r = s.getRow(i); 
       r.getCell(0).setCellValue(ncv[k]); 
       i++; 
      } 

      s = workbook.getSheetAt(1); 

      s.getRow(2).getCell(5).setCellValue(pname[0]+" "+pname[1]+" "+pname[2]); 
      s.getRow(3).getCell(5).setCellValue(cd.getAge()); 
      s.getRow(4).getCell(5).setCellValue(cd.getGender()); 


try (FileOutputStream out = new FileOutputStream("workbook.xlsx")) { 
    //WorkbookEvaluator we = new WorkbookEvaluator(workbook); 

      workbook.write(out);  
      out.close(); 
      XSSFFormulaEvaluator.evaluateAllFormulaCells((XSSFWorkbook) workbook); 

     }catch(Exception e){ 
      System.out.println(e); 
     } 

回答

2

Excel文件格式緩存公式評估結果,使打開文件更快。這意味着,當您完成對文件的更改時,您需要評估所有公式單元格以更新其緩存值。 (否則,當您在Excel中加載文件時,幾乎所有情況下都會顯示舊值,直到進入該單元格爲止)

幸運的是,Apache POI提供了代碼來執行此操作,詳細信息請參見Formula Evaluation documentation。 (你可以選擇只重新計算某些公式,如果你知道那些細胞已經改變,或者做任何事情)

+0

謝謝!它的工作。我使用下面提到的函數來更新整個工作簿,因爲它有許多函數和單元格引用。 'XSSFFormulaEvaluator.evaluateAllFormulaCells((XSSFWorkbook)workbook);' – xihad

0

對於任何細胞,稱 「B5」,在運行時,

cell.getReference(); 

會給你的單元格引用(如例子......這將返回「 B5「)

cell.getReference().toString().charAt(0); 

會給你列參考(如果當前單元格是B5,會給你」B「)。現在

cell.getRowIndex(); 

OR cell.getReference()的toString()的charAt(1)。。;

會給你行指數。現在你有了目標單元格的參考。只需將這些字符替換爲您已經創建的引用即可。這將更新單元格引用。

+0

我認爲我不清楚解釋我的問題。讓我再試一次: 假設worksheet2的B5是工作表1的A5的單元格引用。 如果A5的當前值是10,那麼B5的值也是10。如果我使用apache POI將A5的值更改爲15,則B5值應該更新爲15.但B5值仍然爲10.這是我目前遇到的問題。我希望它可以幫助 – xihad

相關問題