POI-判斷word文檔(docx)中段落是否為標題段落


判斷段落是否為標題需要獲取段落的樣式,樣式可能基於某個樣式,所以需要進行深度遍歷,對深度遍歷到的每個樣式進行進行下面的判斷邏輯。判斷是否為標題,若是則停止遍歷即可

一:判斷是否有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;
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM