2015-10-29 7 views
0

Мой код должен печатать число (в данном случае номер 5) в указанной ячейке в указанной книге Excel. Код работает, если Excel-Workbook закрыт. Однако, если Excel-книга открыта, я получаю следующее сообщение об ошибке при выполнении кода:Файл Excel недоступен для Java-программы, если открыт файл Excel

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 в Excel через COM-порт Excel. – IceArdor

ответ

2

Microsoft Excel помещает эксклюзивную блокировку файлов, которые она открыла.

Так что если вы попытаетесь записать файл в любом другом приложении, пока файл открыт в Excel, он не будет работать в Windows.

Возможно, нет другого решения для закрытия Excel, когда вам нужно записать в файл.