2016-08-02 35 views
1

ich habe eine Excel-Datei, die als Vorlage dienen und wird von mehreren BenutzernApache poi Schreiben auf temporäre Datei statt echte Datei

Ich verwende Apache Poi, dies zu tun
Das Problem writted und heruntergeladen werden, wenn eine Benutzer füllen die Excel (mit einem GUI-Client) wird es direkt in die Vorlage geschrieben werden, aber als Vorlage sollte es unverändert bleiben, sonst wird der nächste Benutzer vorherige Benutzeränderungen haben ....

Die beste Lösung, die ich denke, ist zu schreiben zu einer Temp-Dateien, die bei Aktion Aktion des Benutzers

gelöscht werden Vielen Dank

 File excelFile = openTemplate(); 
     OPCPackage pkg = OPCPackage.open(excelFile ,PackageAccess.READ_WRITE); 
     XSSFWorkbook book = new XSSFWorkbook(pkg); 
     book.setWorkbookType(XSSFWorkbookType.XLSX); 
     book.setForceFormulaRecalculation(true); 

     // excel treatments (sheet , styles etc..) 

     FileOutputStream out = 
       new FileOutputStream(TempFile.createTempFile("Export" , ".xlsx")); 
     book.write(out); 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     bos.writeTo(out); 
     bytes = bos.toByteArray(); 
     out.close(); 
     bos.close(); 
     book.close(); 
     return bytes; 
+0

wollte sollten Sie rufen 'bos.close()' 'vor bos.toByteArray()'. –

+0

Sie scheinen in den 'ByteArrayOutputStream' zu schreiben anstatt in' Datei', die Sie als temporäre Datei erstellt haben - was passiert, wenn Sie den Code so ändern, dass er tatsächlich in Ihre temporäre Datei schreibt? – Gagravarr

+0

@beckyang danke, Code aktualisiert – ulquiorra

Antwort

2

ich endlich eine Lösung finden verwaltet, das mein Problem löst

Es scheint, dass wenn ich close Methode auf eine Arbeitsmappe aufrufen, wird automatisch die Datei auf der Festplatte speichern als codierte in sehen Sie die Bibliothek

public void close() throws IOException { 
     if (this.packageAccess == PackageAccess.READ) { 
      logger.log(POILogger.WARN, 
        "The close() method is intended to SAVE a package. This package is open in READ ONLY mode, use the revert() method instead !"); 
      revert(); 
      return; 
     } 
     if (this.contentTypeManager == null) { 
      logger.log(POILogger.WARN, 
        "Unable to call close() on a package that hasn't been fully opened yet"); 
      return; 
     } 

     // Save the content 
     ReentrantReadWriteLock l = new ReentrantReadWriteLock(); 
     try { 
      l.writeLock().lock(); 
      if (this.originalPackagePath != null 
        && !"".equals(this.originalPackagePath.trim())) { 
       File targetFile = new File(this.originalPackagePath); 
       if (!targetFile.exists() 
         || !(this.originalPackagePath 
           .equalsIgnoreCase(targetFile.getAbsolutePath()))) { 
        // Case of a package created from scratch 
        save(targetFile); 
       } else { 
        closeImpl(); 
       } 
      } else if (this.output != null) { 
       save(this.output); 
       output.close(); 
      } 
     } finally { 
      l.writeLock().unlock(); 
     } 

     // Clear 
     this.contentTypeManager.clearAll(); 
    } 

http://apache-poi.1045710.n5.nabble.com/Validating-office-files-without-saving-them-td5722653.html und https://bz.apache.org/bugzilla/show_bug.cgi?id=59287

Es geschieht nur, wenn ein File oder OPCPackage wird der Arbeitsmappe bereitgestellt.
Die Lösung ist mit InputStream zu arbeiten: XSSFWorkbook book = new XSSFWorkbook(new FileInputStream(file));, welche nicht die Vorlage überschreiben, wie ich

+0

Face gleichen Prob, einfache Lösung, danke! – Dmitry