J'ai construit un nouveau classeur à l'aide de WorkbookFactory.create(new File("path/to/xlsx"))
. Cependant, lorsque j'essaie de modifier le fichier dans Excel après le démarrage de l'application, un message d'erreur me signalant que le fichier est en cours d'utilisation. Dois-je libérer le fichier et si oui, comment? (Je n'ai rien trouvé de semblable à Workbook.close()
dans les documents api) Ou dois-je chercher ailleurs?
Je ne sais pas où chercher ailleurs; l'application ne cause pas ces problèmes avec csv et pour les fichiers Excel, j'appelle simplement le convertisseur (xls => csv), qui est la seule différence.
(J'utilise POI 3.8)
Si vous avez besoin d'un contrôle total sur la fermeture des ressources, vous devez créer vous-même le package OPCPackage et le transférer dans WorkbookFactory. OPCPackage fournit la méthode de fermeture que vous recherchez. Un classeur restera ouvert jusqu'à la récupération de place
Votre code ressemblerait à quelque chose comme:
File f = new File("/path/to/Excel/file");
Workbook wb = null;
NPOIFSFileSystem npoifs = null;
OPCPackage pkg = null;
try {
npoifs = new NPOIFSFileSystem(f);
wb = WorkbookFactory.create(npoifs);
} catch(OfficeXmlFileException ofe) {
pkg = OPCPackage.open(f);
wb = WorkbookFactory.create(pkg);
}
// Use it
if (npoifs != null) { npoifs.close(); }
if (pkg != null) { pkg.close(); }
Cela semble très bien fonctionner pour conserver une poignée sur le InputStream passé à WorkbookFactory.create()
et pour simplement fermer le InputStream lorsque vous avez terminé avec le classeur. Par exemple:
InputStream is = // initialize
try {
Workbook wb = WorkbookFactory.create(is);
// use the workbook
} finally {
if (is != null) is.close()
}
import org.Apache.poi.ss.usermodel.*;
import org.Apache.poi.xssf.usermodel.*;
try{
File workbookFile = new File("C:\\repo\\yourfile.xslx");
FileInputStream file = new FileInputStream(workbookFile);
Workbook wb = WorkbookFactory.create(file);
Sheet sheet = wb.getSheetAt(0);
//use the instance of wb.
file.close();
}
catch(Exception e){
System.out.println("Fail");
}
Tout d’abord, vous devez fermer le flux qui est écrit sur le classeur:
workBook.write(outputStream);
outputStream.close();
Après cela, vous devriez fermer le classeur (sans autre opération) et disposer des fichiers temporaires:
//Close the workBook
workBook.close();
//deleting the temporary files
workBook.dispose();