web-dev-qa-db-fra.com

Fermer le descripteur de classeur (Apache poi)

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)

14
ted

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

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()
    }
17
Mark T.

Comment fermer une instance d'un classeur de points d'intérêt en Java:

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");
}
1
Eric Leschinski

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();
0
Yaniv