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

在Java Apache POI中更新现有Excel文件

邓德惠
2023-03-14

我正在尝试编写一个Java程序,该程序将每天运行(使用任务调度器),并在每次运行时向Excel电子表格中添加一列。我遇到的问题是,它只是重新写入文件,而不是附加到文件中。我正在使用Apache POI,以下是相关代码:

 public static void toExcel(List<String> results, List<Integer> notActive)throws IOException{
    try {
        FileInputStream fIPS= new FileInputStream("test.xls"); //Read the spreadsheet that needs to be updated
        HSSFWorkbook wb;
        HSSFSheet worksheet;
        if(fIPS.available()>=512) {
            wb = new HSSFWorkbook(fIPS); //If there is already data in a workbook
            worksheet = wb.getSheetAt(0);
        }else{
            wb = new HSSFWorkbook();    //if the workbook was just created
            worksheet = wb.createSheet("Data");
        }
         //Access the worksheet, so that we can update / modify it
        HSSFRow row1 = worksheet.createRow(0);  //0 = row number
        int i=0;
        Cell c = row1.getCell(i);
        while (!(c == null || c.getCellType() == Cell.CELL_TYPE_BLANK)) {   //cell is empty
            i++;
            c=row1.getCell(i);
        }
        HSSFRow rowx;
        int x=0;
        for(String s : results) {
            rowx = worksheet.createRow(x);
            HSSFCell cellx = rowx.createCell(i);   //0 = column number
            cellx.setCellValue(s);
            x++;
        }
        fIPS.close(); //Close the InputStream
        FileOutputStream output_file =new FileOutputStream("test.xls");//Open FileOutputStream to write updates
        wb.write(output_file); //write changes
        output_file.close();  //close the stream

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

共有1个答案

华良才
2023-03-14

我认为您一次又一次地创建新的行和单元格,并导致重新编写excel。

实际上,您需要获取行和单元格,而不是在程序中创建它们。

HSSFRow row1 = worksheet.createRow(0);

您可能需要获取行,而不是创建行。

HSSFRow row1 = worksheet.getRow(0);

https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Sheet.html#getRow(int)

这个小示例更新第二行的第二个单元格:

//Read the spreadsheet that needs to be updated
FileInputStream fsIP= new FileInputStream(new File("C:\\Excel.xls"));  
//Access the workbook                  
HSSFWorkbook wb = new HSSFWorkbook(fsIP);
//Access the worksheet, so that we can update / modify it. 
HSSFSheet worksheet = wb.getSheetAt(0); 
// declare a Cell object
Cell cell = null; 
// Access the second cell in second row to update the value
cell = worksheet.getRow(1).getCell(1);   
// Get current cell value value and overwrite the value
cell.setCellValue("OverRide existing value");
//Close the InputStream  
fsIP.close(); 
//Open FileOutputStream to write updates
FileOutputStream output_file =new FileOutputStream(new File("C:\\Excel.xls"));  
 //write changes
wb.write(output_file);
//close the stream
output_file.close();
 类似资料:
  • 我创建了一个excel文件,并在(0,0)[行,单元格]中插入了一个新值作为Hello。第二次打开同一个excel文件,同一张表,用另一个字符串值更新了同一个(0,0)单元格。 代码正在成功运行,没有任何错误,但文件已损坏,无法打开。 代码 在调试模式下,在设置第二个值之后。SetCellValue(第二个值);我可以通过Debug查看该值。打印(cell. ToString());并且该值在控制

  • 问题内容: 这是我的杰森样品 我想更新SName,ZipCode,taxAmount,Quantity和text [1]值,可以通过任何方式进行。我正在文件中使用JSON,而更新标签正在纳入HashMap中 问题答案: 将用新值替换当前值。同样,您可以更新其他值。完成后,您可以使用以下方法将其转换回: 并将其写回到文件中。

  • 我有包含多个工作表的大型excel文件。 我只想处理文件中的一个工作表...从两列读取值并更新两列。 使用此代码,我可以从Sheet读取数据。但无法确定如何将输出保存回来。 文件很大,我只想使用事件API。 我已成功地使用此代码进行了测试。 但这会在内存中加载整个文件(导致应用程序崩溃)...而我只需要编辑一个工作表。

  • 我尝试了各种方式添加Excel电子表格。但问题总是相同的。 我尝试了这里提出的代码, 将工作表添加到现有excel文件 使用Apache POI for Java在现有Excel工作簿中创建新工作表 问题是:

  • 问题内容: 我正在尝试使用Apache POI更新现有的Excel文件。每次我运行代码时,都会收到如下所示的错误。我也试过FileInputStreamNewFile的东西。 请在下面找到代码。感谢你的帮助。 问题答案: 如果您更换 用 会工作的!

  • Mongo创建一个新文档,如果它不存在(必须具有1的)。如果它已经存在,它应该将所有值增加1。但这里的问题是,它每次都会添加另一个文档,而不是更新已经存在的文档。 如果文档已经存在,我如何增加值1,而不是每次添加另一个文档?在任何给定的时间,我只想要一个文档。