我不知道我做错了什么。我只是在阅读和编写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”。
答案 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();
}
}