Wie fülle ich eine Excel-Datei mit Java aus

8

Ich habe den folgenden Code, um die Excel-Datei auszufüllen, mit Informationen, die ich mit Jsoup aus dem Internet bekomme.

%Vor%

Mit diesem obigen Code kann ich nur eine Zeile füllen, dann bekomme ich diesen Fehler

%Vor%

Kann mir jemand sagen, was ich vier mache? Vielen Dank.

    
Muratcan 14.01.2014, 14:35
quelle

8 Antworten

4

Das Problem liegt darin, dass Ihre FileOutputStream Variable out mehr als einmal für dieselbe Workbook verwendet wird. Durch das Öffnen und Schließen von FileOutputStream out in der Schleife wird die Ausnahme behoben. POI und / oder die XML / ZIP-Bibliothek möchten nicht denselben Stream mehrmals verwenden.

Wenn Sie den gleichen Code verwenden, den Sie mit 1 Schleife hatten, funktioniert er, mit 2, stürzt er mit der Ausnahme ab, die Sie haben.

Hier ist eine kurze Beschreibung mit einem einfachen Code, um zu ersetzen, was der JSoup-Code getan hat:

%Vor%     
Jonathan Drapeau 14.05.2014 18:56
quelle
3

Im aktuellen Code versuchen Sie, ClubInformation.xlsx in ein Blatt von Voetbalclubs.xlsx zu schreiben. Daher gibt es einen Fehler. (xslx ist ein XML-Format, daher erhalten Sie einen Fehler beim Schreiben von /docProps/app.xml ).

Ich habe Ihren Code wie folgt geändert. Ändern Sie die Zeile List<String> urlList = Arrays.asList("http://google.com"); nach Ihrem Bedarf. Lass es mich wissen, wenn das funktioniert

%Vor%     
Hirak 13.05.2014 07:28
quelle
2

Erstellen Sie ein Testprogramm der letzten 13 Zeilen mit festen Normalwerten. Wenn dies ebenfalls fehlschlägt, ist das Problem wahrscheinlich die Eingabevorlage. Wenn das funktioniert, sind die Werte, die du von Soup erhältst, das Problem. Drucken Sie sie, um zu sehen, ob es seltsame Werte gibt.

Wenn Sie nur das kleinere Programm mit 13 Zeilen eingeben, erhöht sich auch die Wahrscheinlichkeit, Antworten zu erhalten. Und natürlich können Sie versuchen, eine andere Voetbalclubs.xlsx-Datei zum Spaß zu verwenden.

    
eckes 07.05.2014 23:51
quelle
2

Erstens: Es ist besser, mit einem Arbeitsbeispiel zu beginnen und sich von dort aus zu arbeiten. Beginnen Sie also mit dem Beispielcode, der eine einfache Zeichenfolge in eine einzelne Zelle schreibt, ein neues Blatt, schreiben Sie dann in ein vorhandenes Blatt in einem lokalen Dateisystem und schreiben Sie erst dann Daten, die Sie aus dem Web analysiert haben. Auf diese Weise haben Sie, wenn Sie auf Probleme stoßen, eine bessere Idee, wo Sie nach einer Lösung suchen sollten.

Die Ausnahme, die Sie auflisten, ist die generische Ausnahme, die von ZipPackage beim Speichern schlägt fehl:

%Vor%

Die Methode marshall für defaultPartMarshaller gibt false zurück und die interne Ausnahme, die die Ursache des Fehlers ist, ist verloren. Der DefaultMarshaller tut nicht viel, er fordert den Teil einfach auf, sich in OutputStream zu speichern.

Von dort wird es weniger sicher, welche Art von PackagePart gespeichert wird. Aber zum Beispiel die ZipPartMarshaller fängt alle auftretenden Ausnahmen ab und protokolliert sie, bevor sie false zurückgibt:

%Vor%

Könnten Sie sich also den Rest der Ausgabe ansehen, um zu sehen, ob vor dieser Ausnahme noch relevante Informationen protokolliert werden?

Wenn Sie keine relevantere Protokollierung finden können, ist das ganz normal, weil der Logger ein NullLogger ist, der nichts protokolliert. Könntest du die Laufzeiteigenschaft org.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger setzen (zum Beispiel, indem du Java mit dem Kommandozeilenargument -Dorg.apache.poi.util.POILogger=org.apache.poi.util.SystemOutLogger startest) und siehst, ob dies mehr Protokollierung erzeugt?

    
flup 14.05.2014 16:36
quelle
1

Bei mir scheint dies auf eine Zeitüberschreitung in AWS zurückzuführen zu sein, die den Ausgabestrom geschlossen hat. Die Fehlermeldung ist nicht hilfreich und irreführend. Das ist das Beste, was ich bisher aus verfügbaren Informationen herausholen konnte.

    
David Williams 13.05.2014 16:43
quelle
0

Ich bekam einen ähnlichen Fehler, wenn die Datei, die zum Erstellen des Ausgabestroms verwendet wurde, bereits Daten enthielt. Wenn Sie Daten an die Datei anhängen möchten, müssen Sie dies im Datei-Ausgabestream-Objekt angeben:

%Vor%

Wenn Sie dies tun, sollte wb.write(out) wie erwartet funktionieren.

    
hfontanez 18.05.2015 18:31
quelle
0
%Vor%

Sie müssen nach dem Erstellen aller Zellen einen Ausgabestream erstellen und diese dann in die Datei schreiben. Siehe die Codes in Details.

    
user5443819 14.10.2015 06:32
quelle
-1

Schreiben Sie den folgenden Satz außerhalb für die Schleife

wb.write (out);

    
sagar 30.12.2015 11:50
quelle

Tags und Links