有没有办法用Apache POI xwpf文件识别字符样式?

时间:2016-02-07 11:45:07

标签: java apache-poi xwpf textstyle

Here我们看到“HWPF”(MS Word 2000 .doc)文件的Apache POI有一个方法CharacterRun.getStyleIndex()...您可以通过它来识别字符适用于此次运行的样式(非段落样式)......

但是使用XWPF内容(MS Word 2003+ .docx)文件,我找不到任何方法来识别XWPFRun对象中的字符样式。

1 个答案:

答案 0 :(得分:1)

以下代码应该从XWPFDocument中的所有运行[1]中获取所有样式,并在它们作为字符样式应用时打印它们的XML:

import java.io.FileInputStream;

import org.apache.poi.xwpf.usermodel.*;

import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTRPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STStyleType;

import java.util.List;

public class WordGetRunStyles {

 public static void main(String[] args) throws Exception {

  FileInputStream fis = new FileInputStream("This is a Test.docx");
  XWPFDocument xdoc = new XWPFDocument(fis);

  List<XWPFParagraph> paragraphs = xdoc.getParagraphs();
  for (XWPFParagraph paragraph : paragraphs) {
   List<XWPFRun> runs = paragraph.getRuns();
   for (XWPFRun run : runs) {
    CTRPr cTRPr = run.getCTR().getRPr();
    if (cTRPr != null) {
     if (cTRPr.getRStyle() != null) {
      String styleID = cTRPr.getRStyle().getVal();
      System.out.println("Style ID=====================================================");
      System.out.println(styleID);
      System.out.println("=============================================================");
      XWPFStyle xStyle = xdoc.getStyles().getStyle(styleID);
      if (xStyle.getType() == STStyleType.CHARACTER) {
       System.out.println(xStyle.getCTStyle());
      }
     }
    }
   }
  }
 }
}

[1]请不要使用含有大量内容的文档进行尝试; - )。

如@mike rodent的评论所述,如果你得到java.lang.NoClassDefFoundError: org/openxmlformats/schemas/*something*,那么你必须使用https://poi.apache.org/faq.html#faq-N10025中提到的完整的ooxml-schemas-1.3.jar。

对我来说,这段代码没有这个,因为我没有使用Phonetic Guide Propertieshttps://msdn.microsoft.com/en-us/library/office/documentformat.openxml.wordprocessing.rubyproperties.aspx)。我使用Office 2007。