2017-01-24 5 views
1

Error after hitting "repair"Error while opening ppt fileFehler beim PPT-Datei zu öffnen, die von Apache POI

Ich erzeuge eine Powerpoint-Präsentation Apache POI mit - XSLF, on the fly, wenn der Benutzer einen bestimmten Link auf meiner Website klickt. Ich habe ein paar Tabellen mit Daten zu meiner Präsentationsdatei und auch ein Bild (Liniendiagramm), das mit jfreechart erstellt wurde. Wenn ich den PPTX auf meinem Computer öffne, scheint es gut zu funktionieren. Wenn ich die Datei auf einem anderen Computer mit Powerpoint 2013 öffne, erhalte ich den folgenden Fehler.

"Powerpoint hat ein Problem mit dem Inhalt gefunden Powerpoint kann versuchen, die Präsentation zu reparieren".

Ich möchte diesen Fehler loswerden. Ich habe im Internet gelesen, dass die Lösung darin besteht, den Powerpoint zu "entblocken", was über den Eigenschaftsbereich der Datei geschehen kann. Ich frage mich, ob ich programmgesteuert etwas tun kann, um diese Fehler für meine Benutzer zu unterdrücken. Diese Fehlermeldung ist zumindest ärgerlich.

Mein letzter Thread auf diesem gelöscht - https://stackoverflow.com/questions/41163148/how-to-unblock-pptx-using-apache-poi

daher neu zu erstellen, diesen Thread hier wieder. Ein Fehler wird auch in Bugzilla für Apache POI eingegeben. Fehler-ID - 60633 (https://bz.apache.org/bugzilla/show_bug.cgi?id=60633).

XSLFTableCell cell 
    XSLFTextParagraph p 
    XSLFTextRun line 

    XSLFTable tbl = slide.createTable(); 
    tbl.setAnchor(new Rectangle(X, Y, WIDTH, HEIGHT)); 

    XSLFTableRow headerRow = tbl.addRow(); 
    headerRow.setHeight(45); 
    //Loop through the data collection and populate rows and columns. 
    for(int i = 0; i < numberOfCols; i++) { 
    XSLFTableCell th = headerRow.addCell(); 
    p = th.addNewTextParagraph(); 
    p.setTextAlign(TextAlign.CENTER); 
    line = p.addNewTextRun();.....} 
    for (int item=0; item < 8; item++) 
    { 
    XSLFTableRow itemRow = tbl.addRow();.....} 

    //finally write the file 
    File pptFile = File.createTempFile("fileName", ".ppt") 
    FileOutputStream out = new FileOutputStream(pptFile) 
    ppt.write(out) 
    out.close() 
+0

Was seit Ihrer letzten Frage wurde gelöscht hat sich geändert? Die Lösung für eine gelöschte Frage besteht nicht darin, sie blindlings neu zu veröffentlichen ... – Gagravarr

+1

Ich glaube nicht, dass Sie auf dem richtigen Weg sind. Der Fehler sagt klar, dass der Code, den Sie verwenden, etwas falsch macht. Und es wird es sogar weiter erklären, wenn Sie sich die Reparaturschritte ansehen. Also zuerst genau das, was repariert werden muss, während Sie den Reparaturprozess beobachten und dann Ihren Code anschauen, was zu diesen Problemen führen könnte. –

+0

@Gagravarr Ich konnte dieses Problem nicht lösen, und ich habe einen Fehler mit Apache-Poi geöffnet und Fehlerdetails mit diesem Thread hinzugefügt. Ich verstehe völlig, dass "blindes" Umladen nicht hilft. Bitte seien Sie versichert, dass dies nicht der Fall ist. Ich habe diesen Thread neu gestartet, so dass 1. Jemand, der identifizieren kann, was ich falsch mache, könnte helfen 2. Jeder, der die Lösung nicht kennt, kann davon profitieren. – JavaProgrammer

Antwort

1

Wenn Code zusammen mit einem Fehlerbericht bereitgestellt wird, muss dieser Code vollständig und überprüfbar sein. Ihr Code ist nicht vollständig und überprüfbar. Und wenn ich es vervollständige, dann funktioniert es ohne Probleme.

import java.io.FileOutputStream; 

import org.apache.poi.xslf.usermodel.*; 
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; 
import org.apache.poi.sl.usermodel.TableCell.BorderEdge; 
import org.apache.poi.sl.usermodel.TextParagraph.TextAlign; 

import java.awt.Rectangle; 
import java.awt.Point; 
import java.awt.Color; 

public class CreatePPTX { 

public static void main(String[] args) throws Exception { 

    XMLSlideShow ppt = new XMLSlideShow(); 

    XSLFSlide slide = ppt.createSlide(); 

    XSLFTableCell cell; 
    XSLFTextParagraph p; 
    XSLFTextRun line; 

    XSLFTable tbl = slide.createTable(); 
    tbl.setAnchor(new Rectangle(new Point(100, 100))); 

    XSLFTableRow headerRow = tbl.addRow(); 
    headerRow.setHeight(45); 

    for(int i = 0; i < 5; i++) { 
    XSLFTableCell th = headerRow.addCell(); 
    p = th.addNewTextParagraph(); 
    p.setTextAlign(TextAlign.CENTER); 
    line = p.addNewTextRun(); 
    line.setText("Header " + i); 
    th.setBorderWidth(BorderEdge.bottom, 2.0); 
    th.setBorderColor(BorderEdge.bottom, Color.black); 
    } 

    for (int item=0; item < 8; item++) { 
    XSLFTableRow itemRow = tbl.addRow(); 
    for (int i = 0; i < 5; i++) { 
    XSLFTableCell td = itemRow.addCell(); 
    p = td.addNewTextParagraph(); 
    p.setTextAlign(TextAlign.CENTER); 
    line = p.addNewTextRun(); 
    line.setText("Cell " + item + ":" +i);  
    } 
    } 

    FileOutputStream out = new FileOutputStream("fileName.pptx"); 
    ppt.write(out); 
    out.close(); 
} 
} 

Ihr Problem ist nicht reproduzierbar mit dem Code, den Sie bereitgestellt haben.

Aber eine Sache kann zu Ihrem Problem führen. Wenn Zellen in der Tabelle leer sein sollen, erstellen Sie keine leeren Läufe, sondern lassen Sie die Zelle vollständig leer.

Beispiel mit dem obigen Code, wenn die Zelle 1: 1 leer sein soll, dann nicht:

... 
    for (int item=0; item < 8; item++) { 
    XSLFTableRow itemRow = tbl.addRow(); 
    for (int i = 0; i < 5; i++) { 
    XSLFTableCell td = itemRow.addCell(); 
    p = td.addNewTextParagraph(); 
    p.setTextAlign(TextAlign.CENTER); 
    line = p.addNewTextRun(); 
    if (!(item==1 && i==1)) { 
    line.setText("Cell " + item + ":" +i); 
    }  
    } 
    } 
... 

Dies führt zu dem Fehler.

Stattdessen tun:

... 
    for (int item=0; item < 8; item++) { 
    XSLFTableRow itemRow = tbl.addRow(); 
    for (int i = 0; i < 5; i++) { 
    XSLFTableCell td = itemRow.addCell(); 
    p = td.addNewTextParagraph(); 
    p.setTextAlign(TextAlign.CENTER); 
    if (!(item==1 && i==1)) { 
    line = p.addNewTextRun(); 
    line.setText("Cell " + item + ":" +i); 
    }  
    } 
    } 
... 
+0

@ Axel Ritcher, Vielen Dank!Dies ist in der Tat die Ursache des Problems - Leere Textrune. Mein Code funktioniert einwandfrei, ohne dass der leere Text ausgeführt wird. Ich sehe den Fehler beim Öffnen von Excel nicht mehr. Danke noch einmal! – JavaProgrammer