判斷段落是否為標題需要獲取段落的樣式,樣式可能基於某個樣式,所以需要進行深度遍歷,對深度遍歷到的每個樣式進行進行下面的判斷邏輯。判斷是否為標題,若是則停止遍歷即可
一:判斷是否有outlineLvl屬性若有則為標題
二:判斷樣式名稱是否是“heading 1”、“heading 2”、“heading 3”、“heading 4”、“heading 5”、“heading 6”、“heading 7”、“heading 8”、“heading 9”,若是則為標題
/** * 判斷段落是否為標題段落 * @param paragraph 段落 * @param styles 文檔中定義的樣式 * @return */ public static boolean isTitle(XWPFParagraph paragraph, XWPFStyles styles) { String styleId = paragraph.getStyleID(); while(styleId != null) { final XWPFStyle style = styles.getStyle(styleId); if(style == null){ break; } boolean isTitle = XwpfStyleUtils.isTitleStyle(style); if(isTitle){ return true; } styleId = style.getBasisStyleID(); } return false; }
/** * @author joy * @date 2022/1/14 11:08 * docx樣式 工具類 */ public class XwpfStyleUtils { /** * 獲取大綱級別 * @param xwpfStyle 樣式 * @return */ public static BigInteger getOutlineLvl(XWPFStyle xwpfStyle) { final CTStyle ctStyle = xwpfStyle.getCTStyle(); if(ctStyle != null) { final CTPPr pPr = ctStyle.getPPr(); if (pPr != null) { final CTDecimalNumber outlineLvl = pPr.getOutlineLvl(); if (outlineLvl != null) { return outlineLvl.getVal(); } } } return null; } /** * 判斷是否是標題樣式 * @param xwpfStyle 樣式 * @return */ public static boolean isTitleStyle(XWPFStyle xwpfStyle){ final BigInteger outlineLvl = getOutlineLvl(xwpfStyle); if(outlineLvl != null && BigInteger.ZERO.compareTo(outlineLvl) <= 0){ return true; } return Arrays.stream(WordDocTitleEnum.values()).anyMatch(item -> item.getName().equals(xwpfStyle.getName())); } }
其中枚舉類定義:
/** * @author joy * @date 2022/1/13 16:41 * WORD文檔標題類型 */ public enum WordDocTitleEnum { ONE_LEVEL_TITLE("heading 1", "一級標題"), TWO_LEVEL_TITLE("heading 2", "二級標題"), THREE_LEVEL_TITLE("heading 3", "三級標題"), FOUR_LEVEL_TITLE("heading 4", "四級標題"), FIVE_LEVEL_TITLE("heading 5", "五級標題"), SIX_LEVEL_TITLE("heading 6", "六級標題"), SEVEN_LEVEL_TITLE("heading 7", "七級標題"), EIGHT_LEVEL_TITLE("heading 8", "八級標題"), NINE_LEVEL_TITLE("heading 9", "九級標題"); private final String name; private final String desc; WordDocTitleEnum(String name, String desc) { this.name = name; this.desc = desc; } public String getName() { return name; } public String getDesc() { return desc; } }