Java apache POI java.lang.IllegalArgumentException:位置超过文件末尾的21504

时间:2015-01-22 19:50:06

标签: java excel apache-poi

我不知道我做错了什么。我只是在阅读和编写Excel文件,但总是遇到这个例外:

java.lang.IllegalArgumentException: Position 21504 past the end of the file

public class example {
  public static void main(String[] args) throws Exception {
    File destFile = new File("book.xls");
    Workbook destBook = WorkbookFactory.create(destFile);
    try {
        FileOutputStream out = new FileOutputStream(destFile);
        destBook.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }
}

book.xls存在,并且从A1到L50的每个单元格中都有数字“1”。

2 个答案:

答案 0 :(得分:2)

您正在尝试将Workbook写回到从中读取它的同一文件路径名。似乎WorkbookFactory.create没有释放资源"直到Workbook关闭。

  

请注意,为了正确释放资源,应在使用后关闭工作簿。

创建FileOutputStream时,您已经有效地删除了现有文件,以便您可以将文件数据写出来。但是,Workbook仍必须依赖原始文件完好无损。然后,要写入的数据不再存在。

您需要先写入不同的临时文件名。使用Apache POI 3.11或更高版本,因此您可以调用close() on the Workbook,释放资源。

  

关闭从中读取工作簿的基础输入资源(文件或流)。关闭后,不应再使用工作簿。

这意味着原始文件必须存在,直到我们完成写入,因此写入必须是另一个(临时)文件。

File srcFile = new File("book.xls");
File destFile = new File("booktemp.xls");
try {
   Workbook destBook = WorkbookFactory.create(srcFile);
   FileOutputStream out = new FileOutputStream(destFile);
   destBook.write(out);
   out.close();
   destbook.close();  // Available in Apache POI 3.11!
} catch (Exception e) {
   e.printStackTrace();
}

然后您可以删除原始文件并将新创建的临时文件重命名为原始名称。

boolean deleteSuccess = srcFile.delete();
boolean renameSuccess = destFile.renameTo(srcFile);

答案 1 :(得分:0)

在 create 方法中传递 FileInputStream 对象而不是 File 对象。它会起作用。

    public static void main(String[] args) throws Exception 
    FileInputStream destFile = new FileInputStream("book.xls");
    Workbook destBook = WorkbookFactory.create(destFile);
    try {
        FileOutputStream out = new FileOutputStream(destFile);
        destBook.write(out);
        out.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
  }