Apache POI Word使用标题的自定义样式

时间:2017-07-28 15:02:36

标签: java ms-word apache-poi docx xwpf

我正在尝试使用apache-poi在单词(.docx)文档中创建标题标题。

我有一个模板,其中只包含自定义样式和使用自定义样式的标题标题示例。

XWPFDocument document=new XWPFDocument(new FileInputStream("template.docx"));

我的自定义样式称为" CUSTOM_YNP" (我直接在Word中创建它),但是当我使用下面的行时,它返回false

document.getStyles().styleExist("CUSTOM_YNP")

当然,当我尝试使用这种风格时,它不起作用,实际上它在" Normal"中打印我的字符串。式

XWPFParagraph paragraph=document.createParagraph();
paragraph.setStyle("CUSTOM_YNP");
XWPFRun run=paragraph.createRun();
run.setText("TEST");

仅供记录,我的"保存文件" line:

document.write(new FileOutputStream("myDoc.docx"));

我已阅读此问题,但实际上无法找到问题的解决方案...... How can I use predefined formats in DOCX with POI?

编辑:如果我使用Apache-POI创建自己的风格,它会起作用....我仍然非常喜欢使用word文档中的现有样式。

2 个答案:

答案 0 :(得分:3)

*.docxZIP存档。您可以解压缩并查看/word/styles.xml。在那里你会看到没有下划线的w:styleId="CUSTOMYNP"。这个名字是&#34; CUSTOM_YNP&#34; <w:name w:val="CUSTOM_YNP"/>。所以:

  XWPFDocument document = new XWPFDocument(new FileInputStream("template.docx"));

  System.out.println(document.getStyles().styleExist("CUSTOMYNP"));
  System.out.println(document.getStyles().getStyle("CUSTOMYNP").getName());

  XWPFParagraph paragraph=document.createParagraph();
  paragraph.setStyle("CUSTOMYNP");
  XWPFRun run=paragraph.createRun();
  run.setText("TEST");

  document.write(new FileOutputStream("myDoc.docx"));
  document.close();

答案 1 :(得分:1)

确保首先创建样式并将其添加到文档中:

XWPFDocument document = new XWPFDocument();
XWPFStyles styles = document.createStyles();

String heading1 = "My Heading 1";
addCustomHeadingStyle(document, styles, heading1, 1, 36, "4288BC");

XWPFParagraph paragraph = document.createParagraph();
paragraph.setStyle(heading1);

addCustomHeadingStyle为:

private static void addCustomHeadingStyle(XWPFDocument docxDocument, XWPFStyles styles, String strStyleId, int headingLevel, int pointSize, String hexColor) {

    CTStyle ctStyle = CTStyle.Factory.newInstance();
    ...
    //create your style
    ...
    XWPFStyle style = new XWPFStyle(ctStyle);

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