POI – Não é possível gravar no arquivo enquanto ele é aberto no Excel?

Eu sou novo no site. Eu tento escrever em um arquivo excel enquanto ele está aberto (usando POI / JAVA).

Eu tenho um erro java.io.FileNotFoundException quando tento criar um stream de saída de arquivo para gravar no arquivo.

FileOutputStream não funcionou. Eu recebo esta seguinte mensagem:

o processo não pode acessar o arquivo porque está sendo usado por outro processo.

  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(); } 

Alguém sabe como eu posso consertar isso? Eu estou escrevendo um aplicativo (POI-Java-Swing) para ler / gravar dinamicamente em arquivos do Excel.

Obrigado pela ajuda

O próprio Windows não permitirá que você faça isso. Nada no seu código permitirá que você faça isso, receio. Você precisa fechar o arquivo no Excel primeiro.

Edit – Estou assumindo a partir de sua descrição que você tem o arquivo aberto, no Excel. Você pode não ser. No entanto outra coisa certamente faz – poderia ser outra instância do seu aplicativo Java, por exemplo. Mesmo certifique-se de coisas como o Windows Explorer não está acessando / usando o arquivo, por exemplo, para verificar os atributos. E até que você descarte isso, como mencionado, o próprio Windows bloqueará o access a ele.

Há outro processo em execução em algum lugar que está acessando o arquivo exato do Excel que você está tentando gravar. Veja se não há aplicativos do Excel (como o Microsoft Excel) em execução que tenham um bloqueio no arquivo ou um processo Java que já tenha um bloqueio no mesmo arquivo.

Se o arquivo estiver aberto, você receberá java.io.FileNotFoundException . É por isso que, antes de escrever o arquivo, você precisa verificar.

Exemplo:

 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(); } 

Um problema semelhante discutido no tópico Não consigo excluir um arquivo no java . Talvez ajude você a encontrar um jeito certo de resolver seu problema.

Bem, eu não sei se isso vai funcionar, mas eu acho que você deveria tentar.

Quando eu estava fazendo uma coisa semelhante como você está fazendo, aprendi que as fórmulas do Excel podem se referir às células de outros arquivos do Excel, como por exemplo

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

Então, por que você não atualiza outro arquivo como Book1.xlsx (que é fechado para que você não receba Exception) e deixe seu arquivo aberto se referir ao local das células em Book1.xlsx

Bem, eu estou esperando um monte de downvotes aqui, mas acho que vale a pena tentar 🙂