DOCX で事前定義された形式を POI で使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/2643822

  •  27-09-2019
  •  | 
  •  

質問

POI を使用して docx ジェネレーターを作成しており、事前定義された形式を使用したいと考えています。

Word には、タイトル、見出し 1..10 などのいくつかの形式が含まれています。これらの形式は、Word で作成するすべての DOCX で事前定義されています。

それらを docx ジェネレーターで使用したいと考えています。次のことを試しましたが、フォーマットは適用されませんでした。

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

スタイルとして「見出し1」、「見出し1」、「見出し1」も試しましたが、どれも機能しませんでした。
APIドキュメント 詳細は示されていません。

Word 2007で作成したdocxファイルを解析したところ、「Heading1」が正しいことが分かりました。残念ながら、スタイルは docx で定義されていません。このスタイルは手動で作成する必要がありますか?

誰かが正しい解決策を教えてくれませんか?

役に立ちましたか?

解決

とても簡単です:「テンプレート」docx ファイルを使用します。

  1. Word 2007 で空の docx ファイルを作成します。
  2. このファイルをテンプレートとして使用してください。 XWPFDocument
  3. スタイルを使用して段落を追加します。

コードは次のとおりです。

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

テンプレートにはすべてのスタイルが含まれているため、次の方法で参照できます。 setStyle("Heading1");.

他のヒント

Word テンプレートを作成できます (名前を付けて保存... を使用するだけです)。Word の機能)。

最初のオプション

テンプレートには、多数の追加の XML ファイルが含まれています。 \言葉 フォルダ:-styles.xml -styleswithefcects.xml -websettings.xml -fonttable.xmlおよびa- テーマフォルダー

これらのファイルを元の POI 生成ファイルにコピーすると、次のファイルで指定されたスタイルを参照できます。 スタイル.xml ファイル。

元のファイルは ZIP ファイルと同様に操作できます。それほど手間はかかりません。

2番目のオプション

コード内のスタイルをテンプレートからドキュメントにコピーします。

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;

利点としては、Word を使用してスタイルを個別に直接操作し、テンプレート ファイルに保存し直すことができます。

あなたは、一般的に(MS Wordの-生成TOCで使用するために、例えば)レベル1の見出しとして認識され、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に表示されます。

(私が知っている:これは、あなたの質問に直接答えではないが、私は使用可能な形でインターネット上でこの情報を見つけることができませんでしたとして、私はそれをここに投稿します)。

はい、あなたはそれを手動で行う必要があります。 DOCX仕様はスタイルに関する情報が含まれているのstyles.xmlはオプションであると言います。あなたが明示的にそれをしないのであれば、私はほとんどわからPOIはすべてでそれを作成しないこと。あなたはそれを確認することができます。このファイルは(yourfile.docx /ワード/のstyles.xml)があるかどうかのdocxファイルや表情だけで解凍します。

ですから、あなたは何をすべきか(DOCX用語で、私はそれがPOIで実装されますかわからない):

1)のstyles.xmlを作成し、そこに

必要なスタイルを追加

2)はdocument.xmlとのstyles.xmlを結ぶ関係(私はPOIが自動的にそれをやるべきだと思います)。

を作成します

3)具体的なスタイルと接続する具体的なテキスト部分(ファイル名を指定して実行のdocx用語で)に使用スタイルIDS内部document.xml。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top