How to update cell reference values using Apache POI

a 夏天 提交于 2020-01-15 23:37:14

问题


I am using Apache POI to create new XSSFWorkbook from an existing one, after updating some values. Suppose I have two worksheets (Lets say: worksheet A & B) in my existing workbook. Worksheet B has some cell reference from Worksheet A. IF i modify those cell values of worksheet A and save them as a new workbook, corresponding cell values of worksheet B should be updated too. But it doesn't. How can i update them programmatically? . Thank you.

My code:

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

回答1:


The Excel file format caches the result of formula evaluation, to make opening the file quicker. This means that when you're done making changes to your file, you'll need to evaluate all of the formula cells to updated their cached value. (Otherwise, when you load the file in Excel, for almost all cases it'll still show the old value until you go into that cell)

Luckily, Apache POI provides code to do that, see the Formula Evaluation documentation for details. (You can choose to only recalculate certain formulas, if you know just those cells have changed, or do everything)




回答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.



来源:https://stackoverflow.com/questions/17587116/how-to-update-cell-reference-values-using-apache-poi

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!