Java 使用ApachePOI追加Excel文件

Java 使用ApachePOI追加Excel文件,java,excel,apache-poi,Java,Excel,Apache Poi,我有一个java程序,每次运行它时都会打印1000个整数值。每次运行程序时,我都要将输出复制到excel文件中。我想在excel文件的第一列中输出第一次运行,然后在同一excel文件的后续列中复制下一次运行。例如: 跑步:1 价值1 价值2 . . 价值1000 跑步:2 价值1 价值2 . . 价值1000 我希望excel文件的第一列中有第一个输出,第二列中有第二个输出 这是我的密码: int rownum=1; int cellnum=1; File file; HSSF

我有一个java程序,每次运行它时都会打印1000个整数值。每次运行程序时,我都要将输出复制到excel文件中。我想在excel文件的第一列中输出第一次运行,然后在同一excel文件的后续列中复制下一次运行。例如:

跑步:1 价值1 价值2 . . 价值1000 跑步:2 价值1 价值2 . . 价值1000 我希望excel文件的第一列中有第一个输出,第二列中有第二个输出

这是我的密码:

  int rownum=1;
  int cellnum=1;
  File file; 
  HSSFWorkbook workbook;
  HSSFSheet sheet;
  HSSFRow row;
  HSSFCell cell;

  HSSFWorkbook workbook = new HSSFWorkbook();
  HSSFSheet sheet = workbook.createSheet("Sample sheet");

  public void writeOutput(double meandispersion) {    

      String dispersion = Double.toString(meandispersion);

      HSSFRow row = sheet.createRow(rownum++);
      HSSFCell cell = row.createCell(cellnum);    
      cell.setCellValue("dispersion");

      try {
          FileOutputStream out = new FileOutputStream("newFile.xls");
          workbook.write(out);
          out.close();
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
       }   

  }

主代码中总共有1000个时间步,在每个时间步中调用此方法,并将meandispersion的值传递给它。它在第一列的1000行中打印1000个值。问题是,当我第二次运行程序时,我想复制第二列中的1000个值,第三次运行第三列,依此类推。当前它没有附加值,而是覆盖整个文件。有人能指出问题吗?

您必须读取现有文件,自己将新输出附加到现有数据中(在正确的列中),然后将其写入文件

现在您根本不读取该文件,这将覆盖现有内容


希望这有帮助。

您必须读取现有文件,将新输出附加到现有数据(在正确的列中),然后将其写入文件

现在您根本不读取该文件,这将覆盖现有内容

希望这能有所帮助。

POI的又名“忙碌的开发人员HSSF和XSSF功能指南”包含大量代码片段,包括一段关于打开现有工作簿、阅读、编写和保存修改后的工作簿的代码片段(从该页面逐字复制的示例,添加了一些注释):

这一点,以及该页面上的其他示例应该能让您快速了解情况。

POI的又名“忙碌的开发人员HSSF和XSSF功能指南”包含大量代码片段,其中包括一段关于打开现有工作簿以及读写和保存修改后的工作簿的代码片段(示例逐字复制自该页面,添加了一些注释):


这一点,以及该页面上的其他示例应该能让您快速了解情况。

嘿,谢谢您的帮助,但问题是每当我输入行InputStream inp=new FileInputStream(“workbook.xls”)时;我得到一个错误,即资源泄漏,输入从未关闭。不知道您使用的是什么工具导致了该错误,但事实上,上面的示例代码没有明确地关闭输入流。但是,这应该不难修复,请添加
inp.close();
并且根据文档也
wb.dispose();
(要
fileOut.close()之后处置磁盘上支持此工作簿的临时文件,
。我在Mac中使用eclipse。它总是给我相同的错误,即资源泄漏,输入从未关闭。此后,它不允许我在任何其他地方使用inp。我不能使用工作簿wb=WorkbookFactory.create(inp);您添加了
inp.close()吗
line我建议的?我仍在使用Eclipse Indigo,它没有泄漏检测功能,但根据文档,它的默认配置是一个警告,而不是致命错误…我尝试了所有方法,但无法修复。我不知道问题出在哪里?你能将上面的代码和所有导入库功能一起发送给我吗ns.我正在使用的库可能存在一些问题。谢谢您的帮助,但问题是每当我输入行InputStream inp=new FileInputStream(“workbook.xls”)时;我得到一个错误,即资源泄漏,输入从未关闭。不知道您使用的是什么工具导致了该错误,但事实上,上面的示例代码没有明确地关闭输入流。但是,这应该不难修复,请添加
inp.close();
并且根据文档也
wb.dispose();
(要
fileOut.close()之后处置磁盘上支持此工作簿的临时文件,
。我在Mac中使用eclipse。它总是给我相同的错误,即资源泄漏,输入从未关闭。此后,它不允许我在任何其他地方使用inp。我不能使用工作簿wb=WorkbookFactory.create(inp);您添加了
inp.close()吗
line我建议的?我仍在使用Eclipse Indigo,它没有泄漏检测功能,但根据文档,它的默认配置是一个警告,而不是致命错误…我尝试了所有方法,但无法修复。我不知道问题出在哪里?你能将上面的代码和所有导入库功能一起发送给我吗可能我正在使用的库中有一些问题
InputStream inp = new FileInputStream("workbook.xls");
// notice how the Workbook must be constructed from the existing file
Workbook wb = WorkbookFactory.create(inp);
// Navigating in POI always follows the same logic:
// 1. grab a sheet
// 2. grab a row from that sheet
// 3. grab a cell from that row
Sheet sheet = wb.getSheetAt(0);
Row row = sheet.getRow(2);
Cell cell = row.getCell(3);
// a condition like the one that follows will be needed to know in what column
// you have to write your data:   
if (cell == null)
    cell = row.createCell(3);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("a test");

// Write the output to a file
FileOutputStream fileOut = new FileOutputStream("workbook.xls");
wb.write(fileOut);
fileOut.close();