【问题标题】:Update excel using Java使用 Java 更新 excel
【发布时间】:2019-10-28 06:22:37
【问题描述】:

我正在尝试更新 Excel 工作表中的一列,但只有第一行正在更新。第二次迭代不起作用。有人可以帮我吗?下面是我正在尝试的代码。

    String excelPath = "path";

    String YES = "Updated YES";
    String NO = "Updated NO";
    try {

        FileInputStream fis= new FileInputStream(excelPath);


        HSSFWorkbook  workSheet = new HSSFWorkbook(fis);
        Cell cell = null;
        FileOutputStream output_file =new FileOutputStream(excelPath);

        for (int i = 0; i < TCID.size(); i++) {
            HSSFSheet sheet1 = workSheet.getSheetAt(0);
            String data = sheet1.getRow(i+1).getCell(i).toString();

            if(data.equals(TCID.get(i))){

                cell = sheet1.getRow(i+1).getCell(i+2);
                cell.setCellValue(YES);                 
                workSheet.write(output_file);
            }else {
                cell.setCellValue(NO);
                workSheet.write(output_file);
            }               

        }

        fis.close();
        output_file.close();
        workSheet.close();

    }catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

}

我的最新代码如下。现在它正在更新列,但最后一行没有更新。我错过了什么。

FileInputStream fis= new FileInputStream(excelPath);

        HSSFWorkbook  workSheet = new HSSFWorkbook(fis);
        HSSFSheet sheet1 = workSheet.getSheetAt(0);
        //FileOutputStream output_file =new FileOutputStream(excelPath);
        for (int i = 0; i < TCID.size(); i++) {

            String data = sheet1.getRow(i+1).getCell(0).toString();
            Cell cell = sheet1.getRow(i+1).getCell(2);
            if(data.equals(TCID.get(i))){
                cell.setCellValue(YES);                 
            }else {
                cell.setCellValue(NO);
            }               

        }

        fis.close();
        //output_file.close();
        //workSheet.close();
        FileOutputStream output_file =new FileOutputStream(excelPath);
        workSheet.write(output_file);
        output_file.close(); 

【问题讨论】:

  • 在您的 else 块中,您没有填充 cell 变量
  • 我试过了,还是一样。
  • 还将HSSFSheet sheet1 = workSheet.getSheetAt(0); 移动到您的 for 循环之前 - 添加一些调试以确保您循环不止一次,如果这不能解决您的问题,请使用您的最新代码编辑您的问题,
  • 我已经更新了代码,它正在更新列,但不是完整的列。我的方法签名有列表。我正在传递这个列表,我正在比较 Excel 的第一列。预期结果应该是,如果两个值都匹配,它应该将第三列更新为是,其余值应该更新为否。我不确定,如果我正确地迭代循环。现在我正在迭代列表,我想我应该迭代整个第一列。让我知道这是否有意义。还有如何迭代整个列?

标签: java


【解决方案1】:

行和列都以“i”为键,因此您将沿对角线遍历工作表。

但当然也做其他人推荐的事情,他们都是很好的建议。

通常在处理二维信息块时,我发现有一个循环用于行,然后嵌套在该循环中用于列(反之亦然)

例如

for (y = startRow; y <= maxRow; y++) {

  ....

  for (x = startCol; x <= maxCol; x++) {


     .... // do something to each column in the current row

     cell = sheet1.getRow(y).getCell(x);

     .....

【讨论】:

  • 你说的是对的。它正在对角线更新。我只想使用一个 for 循环。
【解决方案2】:

好的,有几件事。

  1. 在循环外声明HSSFSheet sheet1 = workSheet.getSheetAt(0);。您在 for 循环的每次迭代中都使用同一张表,因此只需调用一次。
  2. 获取单元格数据 (String data = sheet1.getRow(i+1).getCell(i).toString();) 的逻辑不会返回相同的列。在您的第一次迭代中,您将获得 (R)ow 1 : (C)olumn 0。下一次迭代将返回 R2 : C1,然后是 R2:C2,然后是 R3:C3,等等。注意您正在对角线的模式在列下,而不是垂直。
  3. 从 0 开始。
  4. 完成所有处理后,您只需workSheet.write(output_file);
  5. 如果 Row 不存在,您将获得 NullPointerException
  6. 由于每次迭代都使用一个唯一的 Cell,您只需在循环中声明它(因此无需在循环之外使用 Cell cell = null;)。李>

这是一个例子:

try {
  FileInputStream fis = new FileInputStream(excelPath);
  Workbook workbook = new HSSFWorkbook(fis);
  Sheet sheet = workbook.getSheetAt(0);
  for (int i = 0; i < 5; i++) {
    Row row = sheet.getRow(i);
    if (row != null) {
      Cell cell = row.getCell(0);
      cell.setCellValue("Updated cell.");
    }
  }
  FileOutputStream output_file =  new FileOutputStream(excelPath);
  workbook.write(output_file);
  output_file.close();
  fis.close();
} catch (Exception e) {
  e.printStackTrace();
}

【讨论】:

  • @Sayeed,你的问题得到解答了吗?如果是这样,请通过勾选勾选将其标记为已解决。发送。
【解决方案3】:

我认为在 for 循环中移动 Cell 引用应该会为您解决问题。

单元格 = null;

此外,如果您在 else-block 中遇到 NullPointerException,您可能还需要移出 if-block

cell = sheet1.getRow(i+1).getCell(i+2)

这样的……

HSSFSheet sheet1 = workSheet.getSheetAt(0);
for (int i = 0; i < TCID.size(); i++) {
            String data = sheet1.getRow(i+1).getCell(0).toString();
            Cell cell = sheet1.getRow(i+1).getCell(2);
            if(data.equals(TCID.get(i))){
                cell.setCellValue(YES);                 
            }else {
                cell.setCellValue(NO);
            }
            workSheet.write(output_file)
       }

【讨论】:

  • 实际上我正在传递一个 id 列表并将该列表与第一列值逐一进行比较。如果第一列中不存在该值,则将第三列更新为否。下面是方法签名。 private static void updateExecutionStatus(List TCID, String columnName, String excelSheetName, String sheetName)
  • 然后只需在程序中的 else-block 中添加行或将其移到 if-else 之外应该对您有帮助...... cell = sheet1.getRow(i+1).getCell( i+2);让我知道它是否适合您的需要。
  • 感谢您的建议。它正在对角线更新,最后一行没有更新。
  • 它正在对角线更新,因为您正在执行 getCell(i+2),并且如果您看到 i 的值在 for 循环中增加。话虽如此,您需要使用固定值而不是使用 i 来获取单元格引用。检查更新的答案
  • 感谢您的帮助。它现在正在正确更新。只有最后一行没有更新。我已经在问题中发布了我的最新代码。
猜你喜欢
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多