2017-10-03 2 views
0

내가 만든 동일한 PPTX 템플릿의 다른 사용자에 대해/여러 보고서 (즉 N PPTX 파일)를 생성하려고합니다.Apache POI PPT (Java) - 텍스트 서식/모양 서식 지정을 유지하는 TextShape 업데이트

이미 서식이 지정된 XSLFTextParagraph (즉, 모양과 텍스트)가 모두 포함 된 PPTX 템플릿에 미리 서식이 지정된 여러 XSLFTextShape가 있습니다. 각 셰이프에는 특정 위치 표시자가 포함되어있어서이를 다이 니믹 값으로 대체해야합니다. Map (placeholder, newValue)에이 값이 있습니다.

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

을 그래서, 나는 PPTX 출력에 텍스트가 업데이트되지만 글꼴 색상, 글꼴 서식, 글꼴 크기 나는 정의에 비해 변경 생산할 때 나는 사용하여 새 값으로 자리를 갱신에 성공입니다 템플릿. 동일한 서식을 유지하려면 어떻게해야합니까?

원본 서식을 유지하면서 텍스트를 변경하는 모든 솔루션은 무엇입니까?

미리 감사드립니다.

+0

XWPFRun 사용 getStyle() 및 setStyle()을 Word 용 텍스트로 실행 –

+0

안녕하세요! 답변 해주셔서 감사합니다. 조금 더 자세히 설명해 주시겠습니까? 내 객체 인'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

앞으로이 주제에 관심이있는 모든 사람들을 위해 - 해결책을 게시합니다 (하나의 TextBox에 단락이 하나있는 경우 작업). 이 솔루션은 모든 텍스트 상자를 반복하며 Placeholder-> newValue 맵에 지정된 값 중 하나를 포함하는 경우 서식을 유지하면서 업데이트합니다.

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 + " #########################"); 
}