Apache-POI: Es ist nicht möglich, in eine vorhandene Arbeitsmappe zu schreiben

8

Ich arbeite an einem Projekt, das eine Excel-Arbeitsmappe lesen, die erforderlichen Webdienste aufrufen, die Antwort von den Webdiensten übernehmen und diese Informationen in dieselbe Excel-Arbeitsmappe eingeben muss, die gelesen wurde.

Hier ist der Fehler, den ich sehe, wenn ich versuche, in die Excel-Arbeitsmappe zu schreiben:

%Vor%

Hier ist mein Code für das Öffnen der Datei / Lesen:

%Vor%

Danach lese ich jede Zeile und extrahiere jeden Zellenwert.

Sobald dies erledigt ist, erstelle ich die Zellen unter den Kopfzeilen für Success und Result Message und mache dann folgendes:

%Vor%

Hat jemand zu einem ähnlichen Problem gerannt?

    
Matthew Lancaster 02.01.2013, 06:11
quelle

5 Antworten

1

Das aktuelle Problem ist ein Fehler, der seit 2010 existiert und gefunden werden kann Ссылка

In der Stackoverflow-Liste unten wurde eine Problemumgehung gefunden. Wenn Sie das Buch schließen und erneut öffnen, bevor Sie ein weiteres Schreiben in die Datei ausführen, funktioniert es ohne Probleme. Dies ist auf keinen Fall effizient, aber es behebt das Problem, bis das Apache-POI-Entwicklerteam das Problem herausgefunden hat.

Ссылка

    
Matthew Lancaster 03.01.2013, 20:12
quelle
10

Ich habe dieselbe Fehlermeldung erhalten, aber verschiedene Klassen verwendet. Aktuelle Poi-Version, die ich verwende, ist Poi-ooxml 3.9, aber es hat immer noch das Problem. Jetzt habe ich mein Problem behoben und ich denke, dieses Problem tritt auf, wenn Sie zuerst die Arbeitsmappen-Instanz erhalten.

Wenn ich Daten in die Datei schreibe, gefällt mir das (mit Übungsregeln für Ausnahmen und Schließen):

%Vor%

Ich habe die Fehlermeldung "Kann den Eingangsstrom von /docProps/app.xml nicht erhalten, wenn ich eine Arbeitsmappeinstanz wie folgt erhalten habe:

%Vor%

Als ich das Problem behoben habe, war der modifizierte Code

%Vor%

In meinem Fall ist es egal, ob Sie die gleiche Datei öffnen, lesen und in dieselbe Datei schreiben oder aus einer Datei lesen und dann in eine andere schreiben. Wenn Sie die Poi-Quellcodes lesen, könnten Sie sehen, dass die Factory-Methoden, die ich verwendet habe, open () -Methoden in der OPCPackage-Klasse aufrufen. Versuchen Sie es mit der Methode InputStream als Argument zu erhalten.

    
Bankie 06.02.2014 16:22
quelle
1

Ich denke, das Problem hier ist, dass Sie denselben filePath xslFile für verwenden Öffnen und Speichern der Datei.

Öffnen der Datei,

%Vor%

Speichern der Datei,

%Vor%

Sie benötigen einen InputStream zum Lesen und Arbeiten mit Ihrer Datei, aber dies Der Stream wird unzugänglich, wenn Sie einen erstellen OutputStream unter dem gleichen Pfad und Dateinamen.

    
Jayamohan 02.01.2013 06:15
quelle
1

Die Lösung, die ich dafür gefunden habe und nach der ich schon eine Weile gesucht habe, ist, dass du deine Workbook nicht mit der File öffnest, mit der du FileOutputStream öffnest Speichere die Workbook . Verwenden Sie stattdessen FileInputStream , um Workbook zu öffnen.

So etwas funktioniert einwandfrei

%Vor%

Vergessen Sie nicht, jeden geöffneten Stream und das OPCPackage zu schließen.

    
Jonathan Drapeau 26.06.2013 19:29
quelle
1

Hier ist, wie dies durchgeführt werden kann, wenn OPCPackage zum Lesen verwendet wird (try / catch / abschließend zur Lesbarkeit ausgelassen):

%Vor%
  

mach deine Modifikationen ...      XSSFSheet sheet = wb.getSheetAt (0);      ...

%Vor%

Der obige Kommentar von Jayamohan hat mir geholfen, dieses Problem heute zu lösen (mit verschiedenen Dateipfaden für Input und Output). Danke!

    
Robert 22.02.2017 17:58
quelle

Tags und Links