2013-07-11 99 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

相关问题