POI - Не удается записать в файл, когда он открыт в Excel?

Я новичок на сайте. Я пытаюсь записать в файл Excel, пока он открыт (используя POI / JAVA).

Я получил java.io.FileNotFoundException ошибка при попытке создать поток вывода файла для записи в файл.

FileOutputStream не работал Я получаю следующее сообщение:

процесс не может получить доступ к файлу, потому что он используется другим процессом.

         try {
           FileOutputStream fileOut;
           XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("Classeur.xlsm")); 
           ...
           ...
           fileOut = new FileOutputStream("Classeur.xlsm");
           wb.write(fileOut);
           fileOut.close();
           }
        catch (FileNotFoundException e){
           e.printStackTrace();
           } 
        catch (IOException e) {
           e.printStackTrace();
           }

Кто-нибудь знает, как я могу это исправить? Я пишу (POI-Java-Swing) приложение для динамического чтения / записи в файлах Excel.

Спасибо за вашу помощь

5 ответов

Сама Windows не позволит вам сделать это. Боюсь, ничто в вашем коде не позволит вам сделать это. Вам нужно сначала закрыть файл в Excel.

Редактировать - я предполагаю из вашего описания, что вы открыли файл самостоятельно в Excel. Вы не могли бы быть. Однако что-то еще, безусловно, делает - это может быть, например, другой экземпляр вашего Java-приложения. Даже убедитесь, что такие вещи, как Windows Explorer, не обращаются к файлу и не используют его, например, для проверки атрибутов. И пока вы не исключите это, как уже упоминалось, Windows сама заблокирует вам доступ к нему.

Где-то запущен другой процесс, который обращается к файлу Excel, в который вы пытаетесь записать. Либо посмотрите, нет ли запущенных приложений Excel (например, Microsoft Excel), которые имеют блокировку для вашего файла, или процесс Java, который уже получил блокировку для того же файла.

Если файл открыт, вы получите java.io.FileNotFoundException, Вот почему, прежде чем писать файл, вы должны проверить его.

Пример:

File file = new File("workbook.xls");
if(file.canWrite()) {
    System.out.println("File is open");
} else {
    FileOutputStream fileOut = new FileOutputStream(file);
    wb.write(fileOut);
    fileOut.close();
}

Подобная проблема обсуждалась в разделе " Я не могу удалить файл в теме Java". Может быть, это поможет вам найти правильный способ решения вашей проблемы.

Ну, я не знаю, сработает ли это, но я думаю, вы должны попробовать.

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

='D:\excelfiles\[Book1.xlsx]Sheet1'!$A$1

Так почему бы вам не обновить другой файл, например Book1.xlsx (который закрыт, поэтому вы не получите исключение), и пусть ваш открытый файл ссылается на расположение ячеек в Book1.xlsx?

Ну, я ожидаю много отрицательных голосов здесь, но я думаю, что стоит попробовать:)

Другие вопросы по тегам