POI从Word文档中读取句子

时间:2017-02-08 18:21:54

标签: java apache-poi

我编写了java程序来从excel读取数据,并用Apache POI替换word文档中的相同文件。问题是poi只读取单词而不是句子:

XWPFDocument doc = new XWPFDocument(OPCPackage.open("input.docx"));
for (XWPFParagraph p : doc.getParagraphs()) {
    List<XWPFRun> runs = p.getRuns();
    if (runs != null) {
        for (XWPFRun r : runs) {
            String text = r.getText(0);
            if (text != null && text.contains("needle")) {
                text = text.replace("needle", "haystack");
                r.setText(text, 0);
            }
        }
    }
}
for (XWPFTable tbl : doc.getTables()) {
   for (XWPFTableRow row : tbl.getRows()) {
      for (XWPFTableCell cell : row.getTableCells()) {
         for (XWPFParagraph p : cell.getParagraphs()) {
            for (XWPFRun r : p.getRuns()) {
              String text = r.getText(0);
              if (text.contains("needle")) {
                text = text.replace("needle", "haystack");
                r.setText(text);
              }
            }
         }
      }
   }
}
doc.write(new FileOutputStream("output.docx"));

1 个答案:

答案 0 :(得分:3)

Word和Excel都没有句子的概念。因此,POI也不是。但是在Excel中,你必须在单元格中设置单个单词的样式。用Word不正确。每次加粗单词,插入内容,或更改字母或更改字体时,Word都会将其分成单独的运行。事实上,你可能会在个别运行中得到一堆字母。要做你想要的,你需要将段落中的所有运行连接在一起,并为句子分隔符的任何内容解析它,然后省略错误的分隔符,例如缩写末尾的句点。一旦你开始思考它就不容易,事实上,它是非常依赖于语言的。例如,英语句子通常以句点.,感叹号!或问题?结尾,但句点也用于终止缩写,有时句子终止符后跟一个引用"。英语句子没有开头字符,但西班牙语中的一些句子有¡¿