Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Apache POI读取Word(.doc)文件并获取使用的命名样式_Java_Ms Word_Apache Poi - Fatal编程技术网

Java Apache POI读取Word(.doc)文件并获取使用的命名样式

Java Apache POI读取Word(.doc)文件并获取使用的命名样式,java,ms-word,apache-poi,Java,Ms Word,Apache Poi,我正在尝试使用poi-scratchpad-3.8(HWPF)阅读Microsoft Word 2003文档(.doc)。我需要逐字或逐字读取文件。无论哪种方式都可以满足我的需要。一旦我读过一个字符或单词,我需要获得应用于该单词/字符的样式名称。所以,问题是,在读取.doc文件时,如何获取用于单词或字符的样式名称 编辑 我正在添加用于尝试此操作的代码。如果有人想尝试,祝你好运 private void processDoc(String path) throws Exception {

我正在尝试使用poi-scratchpad-3.8(HWPF)阅读Microsoft Word 2003文档(.doc)。我需要逐字或逐字读取文件。无论哪种方式都可以满足我的需要。一旦我读过一个字符或单词,我需要获得应用于该单词/字符的样式名称。所以,问题是,在读取.doc文件时,如何获取用于单词或字符的样式名称

编辑

我正在添加用于尝试此操作的代码。如果有人想尝试,祝你好运

private void processDoc(String path) throws Exception {
    System.out.println(path);
    POIFSFileSystem fis = new POIFSFileSystem(new FileInputStream(path));
    HWPFDocument wdDoc = new HWPFDocument(fis);

    // list all style names and indexes in stylesheet
    for (int j = 0; j < wdDoc.getStyleSheet().numStyles(); j++) {
        if (wdDoc.getStyleSheet().getStyleDescription(j) != null) {
            System.out.println(j + ": " + wdDoc.getStyleSheet().getStyleDescription(j).getName());
        } else {
            // getStyleDescription returned null
            System.out.println(j + ": " + null);
        }
    }

    // set range for entire document
    Range range = wdDoc.getRange();

    // loop through all paragraphs in range
    for (int i = 0; i < range.numParagraphs(); i++) {
        Paragraph p = range.getParagraph(i);

        // check if style index is greater than total number of styles
        if (wdDoc.getStyleSheet().numStyles() > p.getStyleIndex()) {
            System.out.println(wdDoc.getStyleSheet().numStyles() + " -> " + p.getStyleIndex());
            StyleDescription style = wdDoc.getStyleSheet().getStyleDescription(p.getStyleIndex());
            String styleName = style.getName();
            // write style name and associated text
            System.out.println(styleName + " -> " + p.text());
        } else {
            System.out.println("\n" + wdDoc.getStyleSheet().numStyles() + " ----> " + p.getStyleIndex());
        }
    }
private void processDoc(字符串路径)引发异常{
System.out.println(路径);
POIFSFISTEM fis=新的POIFSFISTEM(新文件输入流(路径));
HWPF文件wdDoc=新的HWPF文件(fis);
//列出样式表中的所有样式名和索引
对于(int j=0;jp.getStyleIndex()){
System.out.println(wdDoc.getStyleSheet().numStyles()+“->”+p.getStyleIndex());
StyleDescription style=wdDoc.getStyleSheet().getStyleDescription(p.getStyleIndex());
String styleName=style.getName();
//写入样式名称和关联的文本
System.out.println(styleName+“->”+p.text());
}否则{
System.out.println(“\n”+wdDoc.getStyleSheet().numStyles()+”--->“+p.getStyleIndex());
}
}

我建议您看看源代码,因为它是使用ApachePOI从Word文档中获取文本和样式的一个很好的示例

根据你在问题中所做的和没有说的,我怀疑你在寻找类似的东西:

    Range r = document.getRange();
    for(int i=0; i<r.numParagraphs(); i++) {
       Paragraph p = r.getParagraph(i);
       String text = p.getText();
       if( ! text.contains("What I'm Looking For")) {
          // Try the next paragraph
          continue;
       }

       if (document.getStyleSheet().numStyles()>p.getStyleIndex()) {
          StyleDescription style =
               document.getStyleSheet().getStyleDescription(p.getStyleIndex());
          String styleName = style.getName();
          System.out.println(styleName + " -> " + text);
       }
       else {
          // Text has an unknown or invalid style
       }
    }
Range r=document.getRange();
for(int i=0;ip.getStyleIndex()){
样式描述样式=
document.getStyleSheet().getStyleDescription(p.getStyleIndex());
String styleName=style.getName();
System.out.println(样式名+“->”+文本);
}
否则{
//文本的样式未知或无效
}
}

对于任何更高级的内容,请查看WordExtractor源代码,看看您还可以用这种东西做些什么

谢谢你的回复。在我等待答复时,我发现了一个类似的例子。此代码仅为每个段落提供样式,而不是每个单词或每个字符。这似乎也有一个问题(可能是一个bug?)。如果我使用Word 2007创建一个新的Word文档并另存为Word 97-2003,将“test”作为文档中的唯一文本,并将样式更改为Strong,则代码会告诉我该样式是正常的。如果我将样式更改为Quote,它将返回Quote,但如果我将其更改回Strong,它将返回Quote。有几种样式会出现这种情况,我不知道为什么。我还没有看过WordExtractor源代码,但我正在修复。你可以尝试查看段落的字符运行,并从中获取样式,看看这是否更适合您?
CharacterRun
似乎没有提供检索样式名称的方法。它不会-您会希望获取样式索引,就像一个段落一样,然后从中查找。您好,您编辑的代码适用于我的文档。但我想检测突出显示的文本。你知道怎么做吗?我在谷歌上搜索了很多,但找不到任何线索。提前谢谢@Seynoth刚刚开始探索这些东西所以这可能没有帮助。。。但是有一种叫做“getHighlightedColor”的CharacterRun方法。。。试过了吗?