(一)JAVA基于OPENXML的word文档插入、合并、替换操作系列之基础篇

前言

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基础知识之类的我就不提了

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这三个东西是本系列笔记中的重点,后续内容我们将会用到它。
docx文件内部图

关于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格式与本内容还是有较大的出入,后续不再重复说明。
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
OpenXML 是一种基于 XML 的文件格式,可以用于创建和编辑 Microsoft Office 文档。在 Microsoft Word 中,可以将 OpenXML 格式的文档转换为流文档(FlowDocument),从而实现文档内容的显示和编辑等功能。 以下是将 OpenXML 格式的 Word 文档转换为流文档的示例代码: ```csharp using System; using System.IO; using System.Windows.Documents; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; // 打开 OpenXML 格式的 Word 文档 using (WordprocessingDocument wordDoc = WordprocessingDocument.Open("docxFile.docx", false)) { // 获取 Word 文档的 MainDocumentPart MainDocumentPart mainPart = wordDoc.MainDocumentPart; // 创建流文档 FlowDocument flowDoc = new FlowDocument(); // 遍历 Word 文档中的段落 foreach (Paragraph paragraph in mainPart.Document.Body.Elements<Paragraph>()) { // 创建流文档中的段落 Paragraph flowParagraph = new Paragraph(); // 遍历 Word 文档中的 Run foreach (Run run in paragraph.Elements<Run>()) { // 创建流文档中的 Run Run flowRun = new Run(run.InnerText); // 复制 Run 的属性到流文档中的 Run flowRun.FontStyle = run.RunProperties.Italic ? FontStyles.Italic : FontStyles.Normal; flowRun.FontWeight = run.RunProperties.Bold ? FontWeights.Bold : FontWeights.Normal; flowRun.FontSize = run.RunProperties.FontSize.Value; flowRun.Foreground = new System.Windows.Media.SolidColorBrush(run.RunProperties.Color.Value); // 将流文档中的 Run 添加到流文档中的段落中 flowParagraph.Inlines.Add(flowRun); } // 将流文档中的段落添加到流文档中 flowDoc.Blocks.Add(flowParagraph); } // 将流文档保存到文件中 using (FileStream fs = new FileStream("flowDoc.xaml", FileMode.Create)) { XamlWriter.Save(flowDoc, fs); } } ``` 在上述示例代码中,我们首先打开一个 OpenXML 格式的 Word 文档。然后,我们创建一个流文档,并获取 Word 文档的 MainDocumentPart。接下来,我们遍历 Word 文档中的段落和 Run,并创建对应的流文档中的段落和 Run。我们还复制了 Run 的属性到流文档中的 Run 中。最后,我们将流文档保存到文件中。 需要注意的是,在运行上述代码之前,需要先添加以下引用: - WindowsBase.dll - PresentationFramework.dll - DocumentFormat.OpenXml.dll 另外,需要使用 .NET Framework 3.0 或更高版本。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值