如何使用Apache POI更新单元格引用值(How to update cell referenc

2019-10-18 08:48发布

我使用Apache POI从现有的创建新的XSSFWorkbook,更新一些值后。 假设我有两个工作表(比方说:工作表A&B)在我现有的工作簿。 工作表B具有工作表A.某些单元格引用如果我修改工作表中的这些单元格的值,并将其保存为一个新的工作簿,工作表对应B的单元格的值应该也进行更新。 但事实并非如此。 我如何以编程方式对其进行更新? 。 谢谢。

我的代码:

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);
        }

Answer 1:

Excel文件格式缓存公式估计的结果,使打开文件速度更快。 这意味着,当你完成对文件的更改,你需要所有的公式的单元格的评估,以更新他们的缓存值。 (否则,当您加载在Excel文件中,几乎所有的情况下,它仍然会显示旧的值,直到你进入该单元格)

幸运的是,Apache的POI提供的代码来做到这一点,看看公式评估文档的详细信息。 (你可以选择只重新计算公式一定的,如果你只知道这些细胞发生了变化,或者做的一切)



Answer 2:

For any cell, say "B5", at runtime,

cell.getReference(); 

will give you cell reference (like in example... it will return you "B5")

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

will give you the Column Reference (will give you "B" if the current cell is B5). Now

cell.getRowIndex(); 

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

will give you Row Index. Now you have the reference of the target cell. just replace these character with the references you have already created. This will update the cell references.



文章来源: How to update cell reference values using Apache POI