天天看點

(一)JAVA基于OPENXML的word文檔插入、合并、替換操作系列之基礎篇前言

(一)JAVA基于OPENXML的word文檔插入、合并、替換操作系列之基礎篇

  • 前言
    • 什麼是Open Xml?
    • Open XML SDK
    • 這系列筆記要做點什麼?
    • 系列筆記傳送門
    • 涉及技術點
    • 關于word、openxml基礎知識補充
      • 一個word文檔的真實面目
      • 關于word文檔WordprocessingML的表達方式
    • 特别說明

前言

Hello CSDN World!本人其實有記筆記的習慣,但卻沒有寫部落格的習慣,二者的差別是筆記是給自己看的, 部落格是給各個看官看的,筆記隻要自己看得懂就OK了, 不巧的是,這TND是我正兒八經第一篇部落格(部落格式筆記),是以開頭先來對個暗号 ,組織内如有兄弟看不懂可以拍醒我, 不,有姑娘看不懂可以拍醒我, 兄弟可以略過,此處需要一個表情,你懂得…

什麼是Open Xml?

以下是網上拷貝的一段話,我就不碼字了,需要更詳細了解的,請百度之:

     “Open XML标準的簡單介紹:Ecma Office Open XML(“Open XML”)是針對字處理文檔、示範文稿和電子表格的國際化開放标準,可免費供多個應用程式在多個平台上實作。Microsoft Office(2007、2003、XP、2000)、OpenOffice Novell Edition、開源項目 Gnumeric、Neo-Office 2.1 和 PalmOS (Dataviz) 已經支援 Open XML。Corel 已經宣布在 WordPerfect 2007 中提供 Open XML 支援,全球的開發人員正在使用 OpenXML 建構解決方案。

     Open XML 的标準化工作是由 Ecma International 通過其技術委員會 45 (TC45) 執行的,來自 Apple、Barclays Capital、BP、The British Library、Essilor、Intel、Microsoft、NextPage、Novell、Statoil、Toshiba 和 United States Library of Congress 的代表參與了該項工作。該标準旨在提供現有 ISO 标準所無法提供的獨特好處,其中包括能夠實作從現有二進制格式向基于 XML 的格式的高保真移植。”

Open XML SDK

Open XML SDK特指微軟Office的開放XML,且提供了一套操作的SDK元件, 我們可以利用它對Word、Excel、Powerpoint做很多的操作,但這東西是基于.NET的,我們可以通過它了解一些基于openxml對文檔的騷操作。

官方文檔: 點選傳送

這系列筆記要做點什麼?

在我們日常的做項目寫bug過程中,難免會遇上一些對于word文檔的操作,通過JAVA動态操作WORD中的内容,将一些富文本轉換成word文檔等,比如做一份合同,要動态的填入某些金額、合同雙方名稱等值然後列印出來、OA類系統中公文處理、文檔合成等、 我就是在如此惡劣需求環境下,縱覽某度、某歌、借鑒了組織各位大佬的奇思妙(yin)想,總結出了本系列内容,目标就是為了實作以上各種場景的應用。

系列筆記傳送門

本系列筆記包含以下幾篇,本篇主要是吹牛、理論、外加做個目錄,等不及的可以直接傳送門起飛:

(一)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之基礎篇(目前)

(二)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之基礎篇-圖檔在word結構中的存放、插入、替換圖檔

(三)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之html轉word

(四)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之word轉html(待更新…)

(五)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之word檔案合并(待更新…)

(六)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之動态模闆、占位符(待更新…)

(七)、JAVA基于OPENXML的word文檔插入、合并、替換操作系列之模闆綜合應用、文字、圖檔、富文本内容填充(待更新…)

涉及技術點

本系列筆記涉及技術知識點大概包括以下幾個,當然還有正規表達式、JAVA基礎知識之類的我就不提了

Apache POI

: 一組開源的Java API,用于對Microsoft Office(Excel、WORD、PowerPoint、Visio等)格式檔案讀和寫的功能,JAVA人沒有不知道的, 如果我沒記錯,這家夥底層應該就是基于OpenXml的。

Docx4j

: 這貨也是一個用于建立和操作Microsoft Open XML (Word docx, Powerpoint pptx, 和 Excel xlsx)檔案的Java類庫, 但它似乎隻能操作 WordprocessingML,也就是隻能處理word,有沒有excel4j,鄙人就不清楚了,暫時沒用到。

Jsoup

:jsoup是一款Java的HTML解析神器,主要用來對HTML解析和操作。

Dom4j

:Dom4j是一個易用的、開源的庫,用于XML,XPath和XSLT。它應用于Java平台,采用了Java集合架構并完全支援DOM,SAX和JAXP。

XPATH

:XPath 是一門在 XML 文檔中查找資訊的語言,可用來在 XML 文檔中對元素和屬性進行快速查找和周遊,這貨從某種角度可以了解為 xml 中的 正則,個人了解。

關于word、openxml基礎知識補充

一個word文檔的真實面目

     一個word文檔其實就是一個有着特定格式的壓縮包, 找一個docx的word文檔,将字尾名改成zip,然後用解壓軟體打開,你将得到一個如下的一批子檔案,以此也驗證了word文檔主要内容就是 zip + xml(openxml) 的集合體。

     截圖中的結構,本筆記不做詳細介紹,有興趣自己去撩度娘,我隻能提醒你,

doeument.xml、 media、 document.xml.rels

這三個東西是本系列筆記中的重點,後續内容我們将會用到它。

(一)JAVA基于OPENXML的word文檔插入、合并、替換操作系列之基礎篇前言

關于word文檔WordprocessingML的表達方式

word文檔最終以xml文檔表示時(上圖中的document.xml),将會以以下結構呈現,對于本系列筆記,了解一下常見的标簽即可,如果你有更高的要求,我也僅能送你兩個關鍵詞

openxml标簽

WordprocessingML

了。

<w:p> <!--表示一個段落-->
<w:val > <!--表示一個值-->
<w:r> <!--表示一個樣式串,指明它包括的文本的顯示樣式,表示一個特定的文本格式-->
<w:t> <!--表示真正的文本内容-->
<w:rPr> <!--是<w:r>标簽内的标簽,對Run文本屬性進行修飾-->
<w:pPr> <!--是<w:p>标簽内的标簽,對Paragraph文本屬性進行修飾-->
<w:rFronts> <!--字型-->
<w:hdr> <!--頁眉-->
<w:ftr> <!--頁腳-->
<w:drawing > <!--圖檔-->
<wp:extent> <!--繪圖對象大小-->
<wp:effectExtent > <!--嵌入圖形的效果-->
<wp:inline  > <!--内嵌繪圖對象,dist(T,B,L,R)距離文本上下左右的距離-->
<w:noProof  > <!--不檢查拼寫和文法錯誤-->
<w:docPr> <!--表示文檔屬性-->
<w:rsidR> <!--指定唯一一個辨別符,用來跟蹤編輯在修訂時表行辨別,所有段落和段落中的内容都應該擁有相同的屬性值,如果出現差異,那麼表示這個段落在後面的編輯中被修改。-->
<w:r> <!--表示關系,段落中以相連續的中文或英文字元字元串,作為開始和結束。目的就是要把一個段落中的中英文字元區分開來。 -->
<w:ind> <!--w:pPr元素的子元素,跟w:pStyle并列,ind代表縮進情況:有幾個屬性值:①firstLine(首行縮進)②left(左縮進)③當left和firstLine同時出現時代表下面的元素有兩種屬性首行和下面其他行都是有屬性的④hanging(懸挂)-->
<w:hint> <!--字型的類型,w:rFonts的子元素,屬性值eastAsia表面上的意思是“東亞”,指代“中日韓CJK”類型。-->
<w:bCs> <!--複合字型的加粗-->
<w:bookmarkStart> <!--書簽開始-->
<w:bookmarkEnd> <!--書簽結束-->
<w:lastRenderedPageBreak > <!--頁面進行分頁的标記,是w:r的一個屬性,表示此段字元串是一頁中的最後一個字元串。-->
<w:smartTag > <!--智能标記-->
<w:attr  > <!--自定義XML屬性-->

<w:b w:val=”on”> <!--表示該格式串種的文本為粗體-->
<w:jc w:val="right"/> <!--表示對齊方式-->
<w:sz w:val="40"/> <!--表示字号大小-->
<w:szCs w:val="40"/> <!---->
<w:t xml:space="preserve"> <!--保持空格,如果沒有這内容的話,文本的前後空格将會被Word忽略--> 
<w:spacing  w:line="600" w:lineRule="auto"/> <!--設定行距,要進行運算,要用數字除以240,如此處為600/240=2.5倍行距-->  
<w:jc w:val="center"/>  <!-- 這句話表示段落對齊方式 --> 

<!-- 設定了頁的寬,高,和頁的各邊距。各項的值均是英寸乘1440得出 --> 
<w:body>
    <w:sectPr>  
        <w:pgSz w:w="12240" w:h="15840"/>
        <w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="720" w:footer="720" w:gutter="0"/>
    </w:sectPr>  
</w:body> 

<!--頁眉和頁腳-->
<w:sectPr wsp:rsidR="002C452C">
    <w:hdr w:type="odd" >
        <w:p>
            <w:pPr>
                <w:pStyle w:val="Header"/>
            </w:pPr>
            <w:r>
                <w:t>這是頁眉</w:t>
            </w:r>
        </w:p>
    </w:hdr>
    <w:ftr w:type="odd">
        <w:p>
            <w:pPr>
                <w:pStyle w:val="Footer"/>
            </w:pPr>
            <w:r>
                <w:t>這是頁腳</w:t>
            </w:r>
        </w:p>
    </w:ftr>
</w:sectPr> 

<!--表示文檔的視圖是“print”,視圖比例100%-->
<w:docPr>
    <w:view w:val="print"/><w:zoom w:percent="100"/>
</w:docPr>
           

以下是一個完整的文檔結構示例,該文檔中還包含了圖檔,相信點選進來這篇筆記的你,一定掃一眼,一切皆在你的掌握之中了吧。

<xml-fragment xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main" xmlns:m="http://schemas.openxmlformats.org/officeDocument/2006/math" xmlns:w14="http://schemas.microsoft.com/office/word/2010/wordml" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:wp="http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:wp14="http://schemas.microsoft.com/office/word/2010/wordprocessingDrawing" xmlns:w15="http://schemas.microsoft.com/office/word/2012/wordml" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:sl="http://schemas.openxmlformats.org/schemaLibrary/2006/main" xmlns:wne="http://schemas.microsoft.com/office/word/2006/wordml" xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart" xmlns:cdr="http://schemas.openxmlformats.org/drawingml/2006/chartDrawing" xmlns:c14="http://schemas.microsoft.com/office/drawing/2007/8/2/chart" xmlns:dgm="http://schemas.openxmlformats.org/drawingml/2006/diagram" xmlns:pic="http://schemas.openxmlformats.org/drawingml/2006/picture" xmlns:xdr="http://schemas.openxmlformats.org/drawingml/2006/spreadsheetDrawing" xmlns:dsp="http://schemas.microsoft.com/office/drawing/2008/diagram" xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:xvml="urn:schemas-microsoft-com:office:excel" xmlns:w10="urn:schemas-microsoft-com:office:word" xmlns:pvml="urn:schemas-microsoft-com:office:powerpoint" xmlns:cppr="http://schemas.microsoft.com/office/2006/coverPageProps" xmlns:odx="http://opendope.org/xpaths" xmlns:odc="http://opendope.org/conditions" xmlns:odq="http://opendope.org/questions" xmlns:oda="http://opendope.org/answers" xmlns:odi="http://opendope.org/components" xmlns:odgm="http://opendope.org/SmartArt/DataHierarchy" xmlns:b="http://schemas.openxmlformats.org/officeDocument/2006/bibliography" xmlns:wps="http://schemas.microsoft.com/office/word/2010/wordprocessingShape" xmlns:w16se="http://schemas.microsoft.com/office/word/2015/wordml/symex" xmlns:w16cid="http://schemas.microsoft.com/office/word/2016/wordml/cid" xmlns:wetp="http://schemas.microsoft.com/office/webextensions/taskpanes/2010/11" xmlns:we="http://schemas.microsoft.com/office/webextensions/webextension/2010/11" xmlns:comp="http://schemas.openxmlformats.org/drawingml/2006/compatibility" xmlns:lc="http://schemas.openxmlformats.org/drawingml/2006/lockedCanvas"><!-- Created by docx4j 8.0.0 (Apache licensed) using ORACLE_JRE JAXB in Oracle Java 1.8.0_221 on Mac OS X -->
        <w:p>
            <w:pPr>
                <w:spacing w:after="450"/>
                <w:ind w:left="120"/>
                <w:jc w:val="left"/>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                    <w:b w:val="false"/>
                    <w:i w:val="false"/>
                    <w:color w:val="333333"/>
                    <w:sz w:val="27"/>
                </w:rPr>
                <w:t>  江西餘幹縣信瑞聯圩發現3處泡泉,最大泡泉直徑已有兩米左右,時刻威脅着大堤的安全。險情就是指令,73集團軍某旅立即派出了200名官兵緊急處置。由于泡泉點在水下,官兵們成立了一支黨員突擊隊,隊長袁魏魏帶領25位“95後”黨員跳入齊肩的水中封堵管湧。</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:spacing w:after="450"/>
                <w:ind w:left="120"/>
                <w:jc w:val="center"/>
            </w:pPr>
            <w:r>
                <w:drawing>
                    <wp:inline distT="0" distB="0" distL="0" distR="0">
                        <wp:extent cx="8466666" cy="5872268"/>
                        <wp:effectExtent l="0" t="0" r="0" b="0"/>
                        <wp:docPr id="0" name="" descr=""/>
                        <wp:cNvGraphicFramePr>
                            <a:graphicFrameLocks noChangeAspect="true"/>
                        </wp:cNvGraphicFramePr>
                        <a:graphic>
                            <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic>
    <pic:nvPicPr>
        <pic:cNvPr id="1" name=""/>
        <pic:cNvPicPr/>
    </pic:nvPicPr>
    <pic:blipFill>
        <a:blip r:embed="rId4"/>
        <a:stretch>
            <a:fillRect/>
        </a:stretch>
    </pic:blipFill>
    <pic:spPr>
        <a:xfrm>
            <a:off x="0" y="0"/>
            <a:ext cx="8466666" cy="5872268"/>
        </a:xfrm>
        <a:prstGeom prst="rect">
            <a:avLst/>
        </a:prstGeom>
    </pic:spPr>
</pic:pic>
                            </a:graphicData>
                        </a:graphic>
                    </wp:inline>
                </w:drawing>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:spacing w:after="450"/>
                <w:ind w:left="120"/>
                <w:jc w:val="left"/>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                    <w:b w:val="false"/>
                    <w:i w:val="false"/>
                    <w:color w:val="333333"/>
                    <w:sz w:val="27"/>
                </w:rPr>
                <w:t>  黨員突擊隊中還有一位來自九江都昌的“95後”黨員劉浪,水塘的另一面就是他的家鄉。在此次洪災中,他的家裡也受了災,家人已被當地黨員幹部轉移到安全地帶。</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:spacing w:after="450"/>
                <w:ind w:left="120"/>
                <w:jc w:val="left"/>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                    <w:b w:val="false"/>
                    <w:i w:val="false"/>
                    <w:color w:val="333333"/>
                    <w:sz w:val="27"/>
                </w:rPr>
                <w:t>  經過6個小時的連續奮戰,信瑞聯圩的險情被控制住,目前當地從業人員繼續巡查。</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:spacing w:after="450"/>
                <w:ind w:left="120"/>
                <w:jc w:val="left"/>
            </w:pPr>
            <w:r>
                <w:rPr>
                    <w:rFonts w:ascii="Times New Roman" w:hAnsi="Times New Roman"/>
                    <w:b w:val="false"/>
                    <w:i w:val="false"/>
                    <w:color w:val="333333"/>
                    <w:sz w:val="27"/>
                </w:rPr>
                <w:t>  在湖南嶽陽1068公裡的環洞庭湖堤壩和163公裡的長江幹堤上,1300多個防汛連,超過11萬名黨員日夜堅守,守護家園。大事難事見擔當,危難時刻顯本色。無數共産黨員向險而行,全力守護人民群衆生命财産安全。</w:t>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:spacing w:after="450"/>
                <w:ind w:left="120"/>
                <w:jc w:val="center"/>
            </w:pPr>
            <w:r>
                <w:drawing>
                    <wp:inline distT="0" distB="0" distL="0" distR="0">
                        <wp:extent cx="8466666" cy="4496254"/>
                        <wp:effectExtent l="0" t="0" r="0" b="0"/>
                        <wp:docPr id="0" name="" descr=""/>
                        <wp:cNvGraphicFramePr>
                            <a:graphicFrameLocks noChangeAspect="true"/>
                        </wp:cNvGraphicFramePr>
                        <a:graphic>
                            <a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/picture">
<pic:pic>
    <pic:nvPicPr>
        <pic:cNvPr id="1" name=""/>
        <pic:cNvPicPr/>
    </pic:nvPicPr>
    <pic:blipFill>
        <a:blip r:embed="rId5"/>
        <a:stretch>
            <a:fillRect/>
        </a:stretch>
    </pic:blipFill>
    <pic:spPr>
        <a:xfrm>
            <a:off x="0" y="0"/>
            <a:ext cx="8466666" cy="4496254"/>
        </a:xfrm>
        <a:prstGeom prst="rect">
            <a:avLst/>
        </a:prstGeom>
    </pic:spPr>
</pic:pic>
                            </a:graphicData>
                        </a:graphic>
                    </wp:inline>
                </w:drawing>
            </w:r>
        </w:p>
        <w:p>
            <w:pPr>
                <w:spacing w:after="269"/>
                <w:ind w:left="120"/>
                <w:jc w:val="left"/>
            </w:pPr>
            <w:r>
                <w:br/>
            </w:r>
        </w:p>
        <w:sectPr>
            <w:pgSz w:w="11907" w:h="16839" w:code="9"/>
            <w:pgMar w:top="1440" w:right="1440" w:bottom="1440" w:left="1440"/>
        </w:sectPr>
    </xml-fragment>

           

特别說明

  • 本系列筆記存在間接或直接的借鑒或者引用了一些網上大神的經驗乃至部分成果,因當時研究與寫本筆記時隔較久,并不記得具體具體原來源,如有大神路過看到,請與我聯系,定當補上您的大名以示感謝
  • 如無特殊說明,本筆記講述均以Office 2013以上版本為基礎,即以

    docx

    格式為準,

    doc

    格式與本内容還是有較大的出入,後續不再重複說明。