2017-10-03 26 views
0

作成した同じPPTXテンプレート上のさまざまなユーザの異なる入力/レポートに基づいて複数のレポート(N PPTXファイル)を生成しようとしています。Apache POI PPT(Java) - テキストフォーマット/形状の書式設定を維持するTextShapeの更新

PPTXテンプレートには、既にフォーマットされた単一のXSLFTextParagraph(つまり、図形とテキストの両方)を含むいくつかの書式設定済みのXSLFTextShapeがあります。各シェイプには、特定のプレースホルダが含まれており、これをダイナミック値で置き換える必要があります。私はこの値をMap(プレースホルダ、newValue)に持っています。私が使用して新しい値でプレースホルダを更新することに成功しています:私は出力にPPTXを生成するときテキストが更新されますが、フォント、色、フォントの書式、フォントサイズが、私はで定義されたものと比較して変化している、

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

をので、テンプレート。どうすれば同じ書式を保持できますか?

オリジナルの書式設定のままテキストを変更するだけのソリューションはありますか?

ありがとうございます!

+0

使用XWPFRunそれの言葉 –

+0

こんにちは用のテキストを使用して実行するようにあなたのでgetStyle()およびsetStyle()を提供しています!答えをありがとう。少し詳しく説明できますか?私のオブジェクト 'XSLFTextShape'から' XWPFRun'をどのように設定するのですか?テンプレートからスタイルを取得すると、 'set'をどのように適用できますか? おかげ – IceSte86

+0

私は何かを実装しようとしたが、あなたが言及したオブジェクトが、Word文書に特異的であると思われる - PPTでは動作しません: 'XWPFDocumentドキュメント=新XWPFDocument(OPCPackage.open(pptxAbsolutePath));' '要素presentation @ http://schemas.openxmlformats.org/presentationml/2006/mainは有効なドキュメントではありません@ http://schemas.openxmlformats.org/wordprocessingml/2006/mainドキュメントまたは有効な置換。 – IceSte86

答えて

0

今後このトピックに興味があるかもしれない皆さん - 私は解決策を投稿します(1つのTextBoxに1つの段落がある場合は動作します)。このソリューションは、すべてのテキストボックスをループします。その場合、Placeholder-> newValueマップで指定された値の1つが含まれている場合は、書式設定を更新して更新します。

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 + " #########################"); 
} 
関連する問題