2010-04-15 3 views
12

POI가있는 docx 생성기를 생성 중이며 미리 정의 된 형식을 사용하고 싶습니다.DOCX에서 미리 정의 된 형식을 POI와 함께 사용하려면 어떻게해야합니까?

Word에는 제목, 제목 1.10 등 여러 가지 형식이 포함되어 있습니다. 이러한 형식은 Word로 만드는 모든 DOCX에 미리 정의되어 있습니다.

내 docx 생성기에서 사용하고 싶습니다. 나는 다음을 시도했지만 형식이 적용되지 않았습니다 :

paragraph = document.createParagraph(); 
lastParagraph.setStyle("Heading1"); 

나는 또한 스타일로 "제목 1", "머리글 1"과 "머리글 1"을했지만, 그들 중 누구도 일했다.
API documentation에는 세부 정보가 표시되지 않습니다.

Word 2007로 만든 docx 파일을 분석하여 "Heading1"이 정확하다는 것을 알았습니다. 불행히도, 스타일은 docx에 정의되어 있지 않습니다. 이 스타일을 수동으로 만들어야합니까?

누구나 올바른 해결책을 가르쳐 줄 수 있습니까?

답변

16

매우 간단합니다 : "템플릿"docx 파일을 사용하십시오.

  1. 는 스타일과의 XWPFDocument
  2. 추가하여 문단에 대한 말씀 2007 년
  3. 를 사용하여 템플릿으로이 파일을 빈 DOCX 파일을 만듭니다.

    XWPFDocument document = new XWPFDocument(new FileInputStream("template.docx"); 
    paragraph = document.createParagraph(); 
    paragraph.setStyle("Heading1"); 
    

    템플릿은 모든 스타일을 포함하기 때문에 그들이 setStyle("Heading1");를 통해 참조 할 수 있습니다 :

여기에 코드입니다.

+1

위대한 작품! 그러나주의 할 점이 있습니다 ... 그것은 템플릿 문서에서 사용되지 않는 스타일을 버리는 것으로 보입니다. 스타일을 사용하여 문서에 기존 텍스트가 있거나 템플릿을 어떻게 든 사용해야합니다 ... –

+0

감사합니다. @ guerda – MaheshVarma

+0

@exabrial 스타일을 얻지 않고 템플릿에 스타일을 추가하지 않는 한 당신 말이 맞습니다. 감사. 그것은 내가 시간을 많이 할당하고 많이 구할 수 있도록 도왔다 – MaheshVarma

2

네, 수동으로해야합니다. Docx 스펙은 스타일에 관한 정보를 담고있는 styles.xml은 선택 사항이라고 말한다. 그래서, 당신이 명시 적으로하지 않으면 POI가 그것을 전혀 만들지 않을 것이라고 거의 확신합니다. 그것을 확인하실 수 있습니다 : 단지 docx 파일의 압축을 풀고이 파일의 존재 여부를 확인하십시오 (yourfile.docx/word/styles.xml). 관계를 만들)

1) styles.xml을 만들고 거기에 필요한 스타일

2를 추가

그래서, 당신이 무엇을해야하는지 (DOCX 측면에서, 나는 그 POI에서 구현 어떻게 모른다) (필자는 POI가 자동으로 처리해야한다고 생각한다.)

3) 구체적인 텍스트 부분 (docx 용어로 실행)을 구체적인 스타일로 연결하기 위해 document.xml 안에 스타일 ids를 사용한다.

+0

감사 :

는 (이 귀하의 질문에 직접 대답은 아니지만, 나는 가능한 형태로 인터넷에이 정보를 찾을 수 없습니다로, 나는 여기에 게시합니다 나는 알고있다)! 당신의 솔루션은 스타일을 수동으로 재현하는 데 엄청난 노력이 필요합니다. – guerda

7

단어 템플릿을 만들 수 있습니다 (Word의 다른 이름으로 저장 ... 기능 사용).

템플릿 지금 \ 단어 폴더 추가 XML 파일의 수를 포함

첫 번째 옵션 : - styles.xml - stylesWithEffects.xml - webSettings.xml - fontTable합니다.XML 과 - \ 테마 폴더

당신이 원래의 POI로 해당 파일을 복사하는 경우는 당신이 styles.xml 파일에 주어진 스타일을 참조 할 수 있습니다 파일 생성.

원본 파일을 ZIP 파일처럼 조작 할 수 있습니다. 많은 노력을 기울여서는 안됩니다. 템플릿에서 문서에 코드

초 옵션

복사 스타일 : 직접 말씀을 사용하여 다시 템플릿 파일에 저장이 별도로 스타일을 조작 할 수 있습니다 더하기 측면에서

XWPFDocument template = new XWPFDocument(new FileInputStream(new File("Template.dotx")));  

XWPFDocument doc = new XWPFDocument();  
// let's copy styles from template to new doc 
XWPFStyles newStyles = doc.createStyles(); 
newStyles.setStyles(template.getStyle()); 


XWPFParagraph para = doc.createParagraph(); 
para.setStyle("Heading1"); 

XWPFRun run = para.createRun(); 
run.setText("Heading 1"); 

return doc; 

.

8

레벨 1 표제 (예 : MS Word 생성 TOC에서 사용하기 위해)로 인식되고 Word 형식 막대에서 액세스 할 수있는 스타일을 만드는 데 일반적으로 관심이있는 경우 다음과 같이 수행 할 수 있습니다 :

private static File writeSimpleDocxFile(String content) throws IOException { 
    XWPFDocument docxDocument = new XWPFDocument(); 

    String strStyleId = "ownstyle1"; 

    addCustomHeadingStyle(docxDocument, strStyleId, 1); 

    XWPFParagraph paragraph = docxDocument.createParagraph(); 
    XWPFRun run = paragraph.createRun(); 
    run.setText(content); 

    paragraph.setStyle(strStyleId); 
} 

private static void addCustomHeadingStyle(XWPFDocument docxDocument, String strStyleId, int headingLevel) { 

    CTStyle ctStyle = CTStyle.Factory.newInstance(); 
    ctStyle.setStyleId(strStyleId); 

    CTString styleName = CTString.Factory.newInstance(); 
    styleName.setVal(strStyleId); 
    ctStyle.setName(styleName); 

    CTDecimalNumber indentNumber = CTDecimalNumber.Factory.newInstance(); 
    indentNumber.setVal(BigInteger.valueOf(headingLevel)); 

    // lower number > style is more prominent in the formats bar 
    ctStyle.setUiPriority(indentNumber); 

    CTOnOff onoffnull = CTOnOff.Factory.newInstance(); 
    ctStyle.setUnhideWhenUsed(onoffnull); 

    // style shows up in the formats bar 
    ctStyle.setQFormat(onoffnull); 

    // style defines a heading of the given level 
    CTPPr ppr = CTPPr.Factory.newInstance(); 
    ppr.setOutlineLvl(indentNumber); 
    ctStyle.setPPr(ppr); 

    XWPFStyle style = new XWPFStyle(ctStyle); 

    // is a null op if already defined 
    XWPFStyles styles = docxDocument.createStyles(); 

    style.setType(STStyleType.PARAGRAPH); 
    styles.addStyle(style); 

} 

예,이 스타일은 styles.xml에 표시됩니다. 답변에 대한

+0

이 사용자 정의 스타일로 글꼴을 설정하는 방법은 무엇입니까? – RobAu

+0

현재 소프트웨어에서이 부분을 볼 수는 없지만 빠른 검색을 수행했습니다. POI javadocs에는 CT 스타일 (alas (https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFDocument.html))에 대한 참조가 없지만 사무실 오픈 웹 사이트에는 몇 가지 지침이 있습니다. https : //wiki.openoffice.org/wiki/Cell_Style_in_Xls_module – RobertG

+0

XWPF 스타일에서 글꼴을 설정할 수있는 것 같습니다 : https://poi.apache.org/apidocs/org/apache/poi/xwpf/usermodel/XWPFStyles.html#setDefaultFonts (org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts) – RobertG

관련 문제