2017-10-03 4 views
0

Ich versuche mehrere Berichte (d. H. N PPTX-Dateien) basierend auf verschiedenen Eingaben/für verschiedene Benutzer auf derselben PPTX-Vorlage zu erstellen.Apache POI PPT (Java) - TextShape aktualisieren Textformatierung/Formformatierung beibehalten

Ich habe mehrere vorformatierte XSLFTextShape auf der PPTX-Vorlage, die ein einzelnes XSLFTextParagraph bereits formatiert enthält (d. H. Sowohl die Form und den Text). Jede Form enthält einen bestimmten Platzhalter, den ich mit einem dynamischen Wert ersetzen muss. Ich habe diesen Wert in einer Map (Platzhalter, newValue). Ich bin erfolgreich den Platzhalter mit dem neuen Wert bei der Aktualisierung mit:

textShape.clearText(); 
XSLFTextRun run = paragraph.addNewTextRun(); 
run.setText(newText); 

Also, wenn ich der PPTX in Ausgabe erzeugen der Text aktualisiert, aber Schriftfarbe, Schriftformatierung, wird Schriftgröße verändert im Vergleich zu denen, die ich definierte in Die Vorlage. Wie kann ich die gleiche Formatierung beibehalten?

Irgendwelche Lösungen, um einfach den Text zu ändern, während die ursprüngliche Formatierung beibehalten wird?

Vielen Dank im Voraus!

+0

Verwenden XWPFRun Es ist bietet Ihnen getStyle() und setStyle() für Wörter mit Text zu starten –

+0

Hallo! Danke für die Antwort. Kannst du ein wenig ausarbeiten? Wie stimme ich 'XWPFRun' ausgehend von meinem Objekt' XSLFTextShape'? Sobald ich den Stil von der Vorlage "bekomme", wie wende ich dann das 'set' an? Dank – IceSte86

+0

Ich habe versucht, etwas zu implementieren, aber es scheint, das Objekt, das Sie für Word-Dokument spezifisch erwähnt - nicht mit PPT funktioniert: 'XWPFDocument doc = new XWPFDocument (OPCPackage.open (pptxAbsolutePath));' 'Element Präsentation @ http: //schemas.openxmlformats.org/presentationml/2006/main ist kein gültiges Dokument @ http: //schemas.openxmlformats.org/wordprocessingml/2006/main Dokument oder eine gültige Substitution. – IceSte86

Antwort

0

Für alle, die an diesem Thema in der Zukunft interessiert sein könnten - ich poste die Lösung (funktioniert, wenn eine TextBox einen einzigen Absatz hat). Diese Lösung führt eine Schleife in allen Textfeldern aus, und wenn eines der in der Tabelle Platzhalter-> NeuerValue angegebenen Werte enthält, wird sie unter Beibehaltung der Formatierung aktualisiert.

public static void updateTextBoxesWithDesiredValues(XMLSlideShow ppt, Map<String, String> placeHolderDefinedValue) { 
    logger.info("ElapsedTime: " + tM.getTimeElapsedReadableFormat() + " ########## Updating single text box content..."); 
    List<XSLFSlide> allSlides = ppt.getSlides(); 
    int updatedElements = 0; 
    for (XSLFSlide currentSlide : allSlides) { 
     for (XSLFShape shape : currentSlide.getShapes()) { 
      if (shape instanceof XSLFTextShape) { 
       XSLFTextShape textBox = (XSLFTextShape) shape; 
       String elementTextContent = textBox.getText(); 
       for (Object key : placeHolderDefinedValue.keySet()) { 
        if (elementTextContent.equals(key)) { 
         List<XSLFTextParagraph> textBoxParagraphs = textBox.getTextParagraphs(); 
         List<XSLFTextRun> textBoxParagraphTextRuns = textBoxParagraphs.get(0).getTextRuns(); 
         //System.out.println("########################## check paragraph number in textbox: " + textBoxParagraphs.size() + " - TextRuns: " + textBoxParagraphs.get(0).getTextRuns().size()); 
         logger.info("ElapsedTime: " + tM.getTimeElapsedReadableFormat() + updatedElements + ") Updating: " + textBox.getText() + " --> " + placeHolderDefinedValue.get(key)); 
         for (XSLFTextRun r : textBoxParagraphTextRuns) { 
          r.setText(placeHolderDefinedValue.get(key)); 
         } 
         updatedElements++; 
         //break; 
        } 
       } 
      } 

     } 
    } 
    logger.info("ElapsedTime: " + tM.getTimeElapsedReadableFormat() + " Total Text Element Content Updated: " + updatedElements + " #########################"); 
}