首页 > 解决方案 > 如何使用 POI 更新特定单元格而不修改同一行的任何其他数据?

问题描述

嗨,我对如何使用带有SXSSFWorkbook类的 Apache poi 更新特定单元格感到非常困惑。让我描述一下我的尝试:

加载已经存在的文件:

final String FILE_NAME = "./sxssf_example.xlsx";
        FileInputStream excelInputStream = new FileInputStream(new File(FILE_NAME));
        XSSFWorkbook wb = new XSSFWorkbook(excelInputStream);
      

我对其余代码的第一次尝试

 SXSSFWorkbook wbss = new SXSSFWorkbook(wb,100);
    Sheet swbss = wb.getSheetAt(0);
    Row row0 = swbss.createRow(0);       
    Cell cell = row0.createCell(0);
    cell.setCellValue("jkkjh");
     
            final String FILE_NAME2 = "./new.xlsx";
            FileOutputStream outputStream = new FileOutputStream(FILE_NAME2);
            wbss.write(outputStream);
            outputStream.close();
            wbss.dispose();
            wbss.close();

这生成了 new.xls,单元格被更新,但是它删除了同一行的任何其他列的数据

我对其余代码的第二次尝试

SXSSFWorkbook wbss = new SXSSFWorkbook(wb,100);
        Sheet swbss = wbss.getSheetAt(0);

       Row row0 = swbss.createRow(0);       
        Cell cell = row0.createCell(0);
 cell.setCellValue("jkkjh");    

   final String FILE_NAME2 = "./new.xlsx";
        FileOutputStream outputStream = new FileOutputStream(FILE_NAME2);
        wbss.write(outputStream);
        outputStream.close();
        wbss.dispose();
        wbss.close();

这个把我扔了

Exception in thread "main" java.lang.IllegalArgumentException: Attempting to write a row[0] in the range [0,499] that is already written to disk.
    at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:145)
    at org.apache.poi.xssf.streaming.SXSSFSheet.createRow(SXSSFSheet.java:65)
    at testPOI.SXSSFExample.main(SXSSFExample.java:61)

然后我尝试了一些修改并在实例上进行了尝试,但这让我越来越困惑。我真的需要一些帮助。谢谢你。

标签: javaexcelapache-poi

解决方案


如果电子表格中已经存在任何信息,那么您可能不应该创建行和单元格,而是先获取您需要的内容,然后修改单元格。这意味着:

  • 获取工作簿
  • 获取工作表
  • 获取行
  • 获取单元格
  • 更新单元格
  • 写到工作簿

这应该为您提供您可能需要的指针:https ://poi.apache.org/components/spreadsheet/quick-guide.html 。


推荐阅读