当前位置: 首页 > 知识库问答 >
问题:

如何使用Apache POI更新单元格引用值

严亮
2023-03-14

在更新一些值后,我使用Apache POI从现有的XSSFWorkbook创建新的XSSFWorkbook。假设我现有的工作簿中有两个工作表(比方说:工作表A和B)。工作表B有一些来自工作表A的单元格引用。如果我修改工作表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);
        }

共有1个答案

颛孙俊
2023-03-14

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

幸运的是,Apache POI提供了这样做的代码,有关详细信息,请参阅公式计算文档。(您可以选择只重新计算某些公式,如果您知道这些单元格已经更改,或者执行所有操作)

 类似资料:
  • 我正在使用Apache POI读取零件编号电子表格中的数据。我在我们的数据库中查找零件编号,如果我们有零件的计算机辅助设计图纸,我将零件编号单元格涂成绿色,如果没有,我将其涂成红色。处理完成后,将保存电子表格。我遇到的问题是那列中的每个细胞都是绿色的。我已经完成了代码,查找零件号的逻辑工作正常,确定单元格应该是什么颜色以及设置颜色和填充的逻辑似乎也工作正常。知道我做错了什么吗? 谢谢

  • 我正在使用Poi.jar从excel表输入,想知道如何检查单元格是否为空。 现在我使用下面的代码。

  • 我一直在用POI编写一个代码来将数据输入到Excel表中。首先,我需要遍历一组行,我不确定其中有多少行,可能是10或100行。但我发现末尾有一个空白单元格。在那个空白之后,又有一组行。我不担心第二盘。我需要找到第一盘是否已经结束。 这很让人困惑。现在我有5个用户在我的工作表如下所示。在第5个用户之后有一个空白单元格。我试图打印所有的用户,如果有一个空白停止它。

  • 我有一个巨大的excel文件,其中包含大量列,如下所示:- 当我打印excel中的所有值时,我的代码生成的输出是:- 所以,如果我们看看上面的输出,我们可以注意到我留下空白值的单元格没有被POI库拾取。有没有一种方法可以让这些值为空?还是一种识别所呈现的值跳过空白单元格的方法? 请注意:我使用的不是usermodel(org.apache.poi.ss.usermodel),而是一个事件API来处

  • 我正在使用google电子表格API v4 for java。 我的电子表格看起来像这样- 我想查找带有用户“User2”和时间银行(空值)的行索引。之后,我想使用此行索引在该行中添加时间值。是否可以在不知道范围或索引的情况下逐行搜索单元格值? 在上面的示例中,当它与条件(User='User2'和Time='')匹配时,它应该只返回最后一行索引。甚至更好的是,是否存在查找和替换API,它将查找行

  • 我有一个预定义的excel文件,这是一种形式,其中大部分的信息已经提到,但我必须只输入姓名,地址等细节从我的应用程序用Java。 我可以存储单元格(如A12、B20等),并使用Apache POI库和方法轻松地更新这些单元格。但我希望它是动态的。例如,如果用户将名称单元格从A12更改为B12,Java代码不应该被修改。