2015-10-29 18 views
0

我的代码应该在指定的Excel工作簿中打印一个数字(在本例中为数字5)。如果Excel-Workbook关闭,代码将起作用。但是,如果Excel工作簿是打开的,我运行代码时收到以下错误信息:如果Excel文件打开,Excel文件不能被Java程序访问

Exception in thread "main" java.io.FileNotFoundException: C:\Users\Username\Desktop\java-Programs\test.xlsm (The process can't access the file because it is used by another process) 

的代码如下:

XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream(new File("C:\\Users\\Username\\Desktop\\java-Programs\\test.xlsm"))); 
XSSFSheet ExcelSheet = wb.getSheet("Output"); 
XSSFRow row = ExcelSheet.getRow(3); 
XSSFCell cell = row.getCell(0); 

cell.setCellValue(5); 

FileOutputStream fileOut = new FileOutputStream("C:\\Users\\Username\\Desktop\\java-Programs\\test.xlsm"); 
wb.write(fileOut); 
fileOut.close(); 

我想保持文件打开运行时java代码。有人知道我必须改变什么才能在运行代码时保持Excel文件打开吗?

+1

你希望不要指望在这里。我认为你应该关闭文件。 POI库预计它将被关闭。除非你重写它或选择另一个,否则你会卡住。另外,同步更新呢? Java程序应该如何知道文件打开时所做的任何更改?馊主意。 – duffymo

+2

这是一个Windows限制,与Java或Apache POI无关 – Gagravarr

+0

如果您希望在代码执行时查看Excel中单元格的更新,请使用VBA路径或使用通过Excel的COM端口与Excel交谈的程序。 – IceArdor

回答

2

Microsoft Excel对其已打开的文件进行独占锁定。

因此,如果您尝试在Excel中打开文件时在任何其他应用程序中写入文件,它将在Windows上失败。

当您需要写入文件时,可能没有其他解决方案然后关闭Excel。