最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java使用poi獲取不到docx表格中書簽的問題及解決

 更新時(shí)間:2024年06月17日 10:37:27   作者:編程經(jīng)驗(yàn)分享  
這篇文章主要介紹了Java使用poi獲取不到docx表格中書簽的問題及解決,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

問題

實(shí)際項(xiàng)目中遇到個(gè)需求,需要替換 docx 中書簽的內(nèi)容。

使用 poi 讀取 docx 的書簽,直接獲取文檔中的段落(paragraph)的書簽然后進(jìn)行替換內(nèi)容,處理完后發(fā)現(xiàn)文檔中表格里的書簽并沒有被替換

如何解決

文檔中每個(gè)單元格里的內(nèi)容也是段落(paragraph),將表格中的書簽做單獨(dú)處理,先獲取所有表格(table)所有單元格(cell),再獲取段落進(jìn)行書簽替換即可

代碼

替換書簽方法

public class WordUtil {

    /**
     * 處理表格中的書簽 每個(gè)單元格里的內(nèi)容都可以看作一個(gè)段落
     * 
     * @param xwpfDocument 文檔對象
     * @param dataMap 書簽內(nèi)容
     */
    public static void dealBookmarkOfDocx(XWPFDocument xwpfDocument, Map<String, String> dataMap) throws IOException {
        //處理表格中的書簽
        List<XWPFTable> tableList = xwpfDocument.getTables();
        for (XWPFTable table : tableList) {
            int rowCount = table.getNumberOfRows();//獲取table的行數(shù)
            for (int i = 0; i < rowCount; i++) {
                XWPFTableRow row = table.getRow(i);
                List<XWPFTableCell> cells = row.getTableCells();
                for (XWPFTableCell cell : cells) {
                    dealParagraphBookmark(cell.getParagraphs(), dataMap);
                }
            }
        }
        //處理段落里的書簽
        List<XWPFParagraph> paragraphs = xwpfDocument.getParagraphs();
        dealParagraphBookmark(paragraphs, dataMap);
    }

    /**
     * 替換每個(gè)段落中的書簽
     *
     * @param paragraphList 段落list
     * @param dataMap 書簽內(nèi)容
     */
    private static void dealParagraphBookmark(List<XWPFParagraph> paragraphList, Map<String, String> dataMap) {
        for (XWPFParagraph paragraph : paragraphList) {
            CTP ctp = paragraph.getCTP();
            for (int i = 0; i < ctp.sizeOfBookmarkEndArray(); i++) {
                CTBookmark bookmark = ctp.getBookmarkStartArray(i);
                String bookmarkName = bookmark.getName();
                if (dataMap.containsKey(bookmarkName)) {
                    XWPFRun xwpfRun = paragraph.createRun();
                    xwpfRun.setText(dataMap.get(bookmarkName));

                    Node firstNode = bookmark.getDomNode();
                    Node nextNode = firstNode.getNextSibling();
                    while (nextNode != null) {
                        String nodeName = nextNode.getNodeName();
                        if (nodeName.equalsIgnoreCase("w:bookmarkEnd")) {
                            break;
                        }
                        Node delNode = nextNode;
                        nextNode = nextNode.getNextSibling();
                        ctp.getDomNode().removeChild(delNode);
                    }
                    if (nextNode == null) {
                        //找不到結(jié)束標(biāo)識(shí),在書簽前面加
                        ctp.getDomNode().insertBefore(xwpfRun.getCTR().getDomNode(), firstNode);
                    } else {
                        //找到結(jié)束符,將新內(nèi)容添加到結(jié)束符之前,即內(nèi)容寫入bookmark中間
                        ctp.getDomNode().insertBefore(xwpfRun.getCTR().getDomNode(), nextNode);
                    }
                }
            }
        }
    }
}

測試

class WordUtilTest {

    @Test
    void dealBookmarkOfDocx() {
        String docxPath = "C:\\Users\\XXX\\Desktop\\myDoc.docx";

        Map<String, String> dataMap = new HashMap<>();
        dataMap.put("bookmark1", "1234567");

        try (InputStream inputStream = Files.newInputStream(Paths.get(docxPath));
             XWPFDocument xDoc = new XWPFDocument(inputStream)) {

            WordUtil.dealBookmarkOfDocx(xDoc, dataMap);

            xDoc.write(Files.newOutputStream(Paths.get(docxPath)));

        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }
}

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • SpringBoot 接口開發(fā)教程(httpclient客戶端)

    SpringBoot 接口開發(fā)教程(httpclient客戶端)

    這篇文章主要介紹了SpringBoot 接口開發(fā)教程(httpclient客戶端),具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringCloud微服務(wù)之Config知識(shí)總結(jié)

    SpringCloud微服務(wù)之Config知識(shí)總結(jié)

    今天帶大家學(xué)習(xí)SpringCloud微服務(wù)中的Config的相關(guān)知識(shí),文中有非常詳細(xì)的介紹,對正在學(xué)習(xí)SpringCloud微服務(wù)的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05
  • Java之操作Redis案例講解

    Java之操作Redis案例講解

    這篇文章主要介紹了Java之操作Redis案例講解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java 漢字獲取拼音或首字母工具類代碼分析

    Java 漢字獲取拼音或首字母工具類代碼分析

    在本篇內(nèi)容里小編給大家分享的是一篇關(guān)于Java 漢字獲取拼音或首字母工具類知識(shí)點(diǎn)內(nèi)容,有需要的朋友們可以學(xué)習(xí)參考下。
    2021-06-06
  • 淺談Java向下轉(zhuǎn)型的意義

    淺談Java向下轉(zhuǎn)型的意義

    這篇文章主要介紹了淺談Java向下轉(zhuǎn)型的意義,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-02-02
  • Mybatis?在?insert?插入操作后返回主鍵?id的操作方法

    Mybatis?在?insert?插入操作后返回主鍵?id的操作方法

    這篇文章主要介紹了Mybatis?在?insert?插入操作后返回主鍵?id的操作方法,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • SpringBoot+thymeleaf+Echarts+Mysql 實(shí)現(xiàn)數(shù)據(jù)可視化讀取的示例

    SpringBoot+thymeleaf+Echarts+Mysql 實(shí)現(xiàn)數(shù)據(jù)可視化讀取的示例

    本文主要介紹了SpringBoot+thymeleaf+Echarts+Mysql 實(shí)現(xiàn)數(shù)據(jù)可視化讀取的示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • Java Class 解析器實(shí)現(xiàn)方法示例

    Java Class 解析器實(shí)現(xiàn)方法示例

    這篇文章主要通過對class文件的分析,介紹了Java Class 解析器實(shí)現(xiàn)方法示例,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • Java字符串分解技術(shù)substring、tokenizing和trimming方法的使用

    Java字符串分解技術(shù)substring、tokenizing和trimming方法的使用

    這篇文章主要介紹了Java字符串分解技術(shù)substring、tokenizing和trimming方法的使用,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-05-05
  • 解決Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題

    解決Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題

    這篇文章主要介紹了關(guān)于Java執(zhí)行Cmd命令出現(xiàn)的死鎖問題解決,解決方法就是在waitfor()方法之前讀出窗口的標(biāo)準(zhǔn)輸出、輸出、錯(cuò)誤緩沖區(qū)中的內(nèi)容,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2022-07-07

最新評論

黔南| 团风县| 青海省| 申扎县| 太白县| 定结县| 綦江县| 凭祥市| 吉隆县| 宝鸡市| 方山县| 禄丰县| 宁陵县| 丰原市| 独山县| 武清区| 广州市| 辽阳县| 将乐县| 石柱| 浦县| 固原市| 上饶县| 个旧市| 安庆市| 夹江县| 库伦旗| 沁源县| 阜南县| 甘肃省| 三明市| 渝中区| 通山县| 青岛市| 北票市| 深泽县| 丰台区| 镇坪县| 呼和浩特市| 安吉县| 太康县|