如何定位一段文字在word文档的哪个章节下面,首先需要知道如何找到word文档的章节,poi中没有提供获取章节的api,只能通过段落来找到样式名字,如果样式名字包含heading,则说明这是一个标题,该标题下方的文字就属于这个章节
获取样式名
private String getStyleName(XWPFDocument document, XWPFParagraph paragraph) {
String styleId = paragraph.getStyleID();
if (StringUtils.isNotEmpty(styleId)) {
XWPFStyle style = document.getStyles().getStyle(styleId);
return style.getName();
}
return "";
}
判断该段落是否标题
private boolean isHeadTitle(XWPFDocument document, XWPFParagraph paragraph) {
String styleName = getStyleName(document, paragraph);
return styleName.toLowerCase().startsWith("heading");
}
接下来就简单了,我们通过遍历文档段落,查找该段落中是否包含指定文字,如果包含则说明该段文字属于该章节,很多人可能会去使用document.getParagraphs来遍历文档,但是这种方式只能获取段落内容,如果文档中包含表格则获取不到,所以为了完整的遍历文档可以使用XWPFWordExtractor这个类来提取文字
private String searchChapter(XWPFDocument document, String text) {
XWPFWordExtractor extractor = new XWPFWordExtractor(document);
StringBuilder sb = new StringBuilder();
List<IBodyElement> bodyElements = document.getBodyElements();
String latestTitle = "";
for (IBodyElement element : bodyElements) {
if (element instanceof XWPFParagraph) {
XWPFParagraph paragraph = (XWPFParagraph) element;
if (isHeadTitle(document, paragraph)) {
latestTitle = paragraph.getText();
sb.setLength(0);
}
}
extractor.appendBodyElementText(sb, element);
sb.append('\n');
if (sb.toString().contains(text)) {
return latestTitle;
}
}
return "";
}