前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了3个星期,终于完成了,但是在项目上线之后却发现导出的文档有问题,此时,这个同事已经离职,我自然成为接班者,要把导出功能实现,但是我看了他写的那个ftl文档好久,就是没看懂,上面好多<w:pPr>、<w:rPr>、<w:szCs>、<w:t>等看不懂的标签,我也是无奈,在网上搜索“freemarker导出word文档”无果,后来才知道应该搜索的是“WordXML格式解析”。下面是我在做项目的过程中,对这些标签做的注释,希望如果有人想做freemarker导出文档的人,少走一点弯路。

  段落字体:

  <w:t>:字符串,文字内容,

如:<w:t>这是文字</w:t>

如:<w:t xml:space="preserve">       </w:t>           <#-- xml:space="preserve"从字面上理解是保持空格 -->

  <w:r>:表示一个样式串,指明它包括的文本的显示样式,如文本属性加粗、下划线、倾斜的分割,内含w:rsidRPr属性

  <w:rpr>:是<w:r>标签内的标签,对文本属性进行修饰,与<w:ppr>类似

  <w:p>:表示段落和html中的<p>标签类似

如:<#-- 下面是一段粗体 -->

<w:r>
   <w:rPr> 
      <w:b w:val="on"/>
   </w:rPr> 
   <w:t> 这是粗体</w:t>
</w:r>

  看完这段代码,应该大概懂点结构了,其中<w:b w:val=”on”> 表示该格式串种的文本为粗体,而<w:p>一般是<w:r>的外层。

再举一例:

<w:p>

  <w:pPr>

    <w:rPr>

      <w:jc w:val="center"/>                 <#-- 这句话表示段落对齐方式 -->

      <w:spacing  w:line="600" w:lineRule="auto"/>                         <#-- 设置行距,要进行运算,要用数字除以240,如此处为600/240=2.5倍行距 -->

    </w:rPr>

  </w:pPr>

  <w:r w:rsidRPr="00F2468A">

    <w:rPr>

      <w:b w:val="on"/>                       <#-- 粗体 -->
      <w:sz w:val="40"/><w:szCs w:val="40"/>                   <#-- 字体尺寸为是40除2等于20 -->

      <w:rFronts w:ascii="宋体" w:hAnsi="宋体" w:hint="esatAsia"/>

    </w:rPr>

    <w:t>${wordtext1}</w:t>                         <#-- ${wordtext1}是freemarker变量,一般是字符串,用于输出,这个可以参考freemarker文档 -->

  </w:r>

</w:p>

  段属性包含在<w:pPr></w:pPr>中,文本格式包含在<w:rPr></w:rPr>中,这儿的Pr是property的意思

  页面设置:

如:

<#-- 设置了页的宽,高,和页的各边距。各项的值均是英寸乘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>

再再如:

</w:body>

  <#-- 文档的视图 -->

  <w:docPr>
      <w:view w:val="print"/><w:zoom w:percent="100"/>
  </w:docPr>

</w:wordDocument>

docPr,就是document property的意思,表示文档的视图是“print”,视图比例100%

  表格:

直接看例子吧:

<w:tbl>
<w:tblPr><w:tblW w:w="0" w:type="auto"/>
<w:tblInd w:w="737" w:type="dxa"/>
<w:tblBorders>
<w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:bottom w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:right w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:insideH w:val="single" w:sz="4" w:space="0" w:color="auto"/>
<w:insideV w:val="single" w:sz="4" w:space="0" w:color="auto"/>
</w:tblBorders>
<w:tblLayout w:type="fixed"/><w:tblLook w:val="04A0"/>
</w:tblPr>
<w:tblGrid><w:gridCol w:w="2635"/><w:gridCol w:w="3372"/><w:gridCol w:w="2074"/></w:tblGrid>

<w:tr w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidTr="00D074CF">
<w:trPr><w:trHeight w:val="566"/></w:trPr>
<w:tc><w:tcPr><w:tcW w:w="2000" w:type="dxa"/></w:tcPr>
<w:p w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidRDefault="00F2468A" w:rsidP="00E9655B">
<w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:szCs w:val="21"/></w:rPr></w:pPr>
<w:r w:rsidRPr="00F2468A"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:szCs w:val="21"/></w:rPr>
<w:t>第一列</w:t></w:r>
</w:p></w:tc>

<w:tc><w:tcPr><w:tcW w:w="1200" w:type="dxa"/></w:tcPr>
<w:p w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidRDefault="00F2468A" w:rsidP="00E9655B">
<w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:szCs w:val="21"/></w:rPr></w:pPr>
<w:r w:rsidRPr="00F2468A"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:szCs w:val="21"/></w:rPr>
<w:t>第二列</w:t></w:r>
</w:p></w:tc>

<w:tc><w:tcPr><w:tcW w:w="3200" w:type="dxa"/></w:tcPr>
<w:p w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidRDefault="00F2468A" w:rsidP="00E9655B">
<w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:szCs w:val="21"/></w:rPr></w:pPr>
<w:r w:rsidRPr="00F2468A"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:szCs w:val="21"/></w:rPr>
<w:t>第三列</w:t></w:r>
</w:p></w:tc>
</w:tr>

<#list table3 as item3>
<w:tr w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidTr="00D074CF">
<w:trPr><w:trHeight w:val="566"/></w:trPr>
<w:tc><w:tcPr><w:tcW w:w="2000" w:type="dxa"/></w:tcPr>
<w:p w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidRDefault="00F2468A" w:rsidP="00E9655B">
<w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:szCs w:val="21"/></w:rPr></w:pPr>
<w:r w:rsidRPr="00F2468A"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:szCs w:val="21"/></w:rPr>
<w:t>${item3.tablecolumn1}</w:t></w:r>
</w:p></w:tc>
<w:tc><w:tcPr><w:tcW w:w="1200" w:type="dxa"/></w:tcPr>
<w:p w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidRDefault="00F2468A" w:rsidP="00E9655B">
<w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:szCs w:val="21"/></w:rPr></w:pPr>
<w:r w:rsidRPr="00F2468A"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:szCs w:val="21"/></w:rPr>
<w:t>${item3.tablecolumn2}</w:t></w:r>
</w:p></w:tc>
<w:tc><w:tcPr><w:tcW w:w="3200" w:type="dxa"/></w:tcPr>
<w:p w:rsidR="00F2468A" w:rsidRPr="00F2468A" w:rsidRDefault="00F2468A" w:rsidP="00E9655B">
<w:pPr><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:szCs w:val="21"/></w:rPr></w:pPr>
<w:r w:rsidRPr="00F2468A"><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:szCs w:val="21"/></w:rPr>
<w:t>${item3.tablecolumn3}</w:t></w:r>
</w:p></w:tc>
</w:tr>

</#list>
</w:tbl>

  最后,写一个完整的xml例子吧:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<?mso-application progid="Word.Document"?>
<w:wordDocument xmlns:aml="http://schemas.microsoft.com/aml/2001/core"
xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:w10="urn:schemas-microsoft-com:office:word"
xmlns:w="http://schemas.microsoft.com/office/word/2003/wordml"
xmlns:wx="http://schemas.microsoft.com/office/word/2003/auxHint"
xmlns:wsp="http://schemas.microsoft.com/office/word/2003/wordml/sp2"
xmlns:sl="http://schemas.microsoft.com/schemaLibrary/2003/core"
w:macrosPresent="no" w:embeddedObjPresent="no" w:ocxPresent="no"
xml:space="preserve">

<w:body>
<w:p>
<w:pPr>
<w:jc w:val="left"/>
<w:spacing  w:line="240" w:lineRule="auto"/>
</w:pPr>
<w:r>
<w:rPr> 
<w:sz w:val="24"/><w:szCs w:val="24"/>
<w:rFonts   w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" />
</w:rPr> 
<w:t>Niu don't like Red or Blue! It seems that </w:t>
</w:r>
<w:r>
<w:rPr> 
<w:sz w:val="48"/><w:szCs w:val="48"/>
<w:rFonts   w:ascii="Arial" w:eastAsia="Arial" w:hAnsi="Arial" />
</w:rPr> 
<w:t>Hello world!</w:t>
</w:r>
</w:p>
<w:p>

<w:sectPr wsp:rsidR="002C452C">
<w:pgSz w:w="12240" w:h="15840"/>
<w:pgMar w:top="1526.4" w:right="3254.4" w:bottom="2966.4" w:left="1670.4" w:header="720" w:footer="720" w:gutter="0"/>
<w:hdr w:type="odd" >
<w:p>
<w:pPr>
<w:pStyle w:val="Header"/>
</w:pPr>
<w:r>
<w:t>Header</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>Footer</w:t>
</w:r>
</w:p>
</w:ftr>
</w:sectPr>
</w:body>

<w:docPr>
<w:view w:val="print"/><w:zoom w:percent="100"/>
</w:docPr>
</w:wordDocument>

  一个应用级别的Word文档绝对不仅这些内容,更详细的内容需要参考MS Office SDK。

  顺便提一句,freemarker导出文档用的是freemarker.template.Template这个类,具体可以参考相关文档。。

freemarker导出word文档——WordXML格式解析的更多相关文章

  1. freemarker导出word文档

    使用freemarker导出word文档的过程 **************************************************************************** ...

  2. Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  3. 使用Freemarker导出Word文档(包含图片)代码实现及总结

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  4. Java用freemarker导出Word 文档

    1.用Microsoft Office Word打开word原件: 2.把需要动态修改的内容替换成***,如果有图片,尽量选择较小的图片几十K左右,并调整好位置: 3.另存为,选择保存类型Word 2 ...

  5. 使用FreeMarker导出word文档(支持导出图片)

    一.添加maven依赖,导入FreeMarker所需要的jar包 <dependency> <groupId>org.freemarker</groupId> &l ...

  6. 【Java】导出word文档之freemarker导出

    Java导出word文档有很多种方式,本例介绍freemarker导出,根据现有的word模板进行导出 一.简单导出(不含循环导出) 1.新建一个word文件.如下图: 2.使用word将文件另存为x ...

  7. Java 用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  8. 【Java】用Freemarker完美导出word文档(带图片)

    Java  用Freemarker完美导出word文档(带图片) 前言 最近在项目中,因客户要求,将页面内容(如合同协议)导出成word,在网上翻了好多,感觉太乱了,不过最后还是较好解决了这个问题. ...

  9. java使用freemarker生成word文档

    1.原料 开源jar包freemarker.eclipse.一份模板word文档 2.首先设计模板word文档 一般,通过程序输出的word文档的格式是固定的,例如建立一个表格,将表格的标题写好,表格 ...

随机推荐

  1. ubuntu的常用命令

    1. locate------根据名字找文件,例如: locate php.ini 2.find----------以目录结构的形式搜索文件, 例如:find / -type d -iname jvm ...

  2. node-webkit制作桌面应用

    心血来潮突然想用js尝试写桌面应用,突然发现我大js真的无所不能.在网上搜到了这么一个东东:node-webkit.用Node.js来进行系统资源的访问,用HTML+CSS完成页面的搭建.哇,一切突然 ...

  3. Xcode插件失效解决办法

    升级完Xcode突然间发现之前安装的所有插件都不生效了,费了九牛二虎之力找到了解决办法...      1.打开终端,输入以下代码获取到DVTPlugInCompatibilityUUID       ...

  4. idea常用设置

    Idea删除当前行的快捷键是Ctrl+y,复制当前行的快捷键是Ctrl+d,和eclipse的习惯不一样.虽然可以一键把idea的快捷键映射成eclipse,但是这样做代价太大,如果这样,idea的官 ...

  5. Java 同步容器和并发容器

      同步容器(在并发下进行迭代的读和写时并不是线程安全的)   Vector.Stack.HashTable   Collections类的静态工厂方法创建的类(如Collections.synchr ...

  6. Struts2学习第二天——动态方法调用

    method属性 在前面的例子里,Action默认使用execute()方法来处理请求.但是,如果有多个不同的请求需要同一个Action进行不同处理,怎么办?在Struts.xml文件中,需要指定Ac ...

  7. Java Web(十三) 使用javamail进行发送邮件,(使用QQ,163,新浪邮箱服务器)

    加油加油. --WH 一.发送邮件的原理 在了解其原理之前,先要知道两个协议,SMTP和POP3 SMTP:Simple Mail Transfer Protocol,即简单邮件传输协议,发送邮件的协 ...

  8. Alamofire源码解读系列(三)之通知处理(Notification)

    本篇讲解swift中通知的用法 前言 通知作为传递事件和数据的载体,在使用中是不受限制的.由于忘记移除某个通知的监听,会造成很多潜在的问题,这些问题在测试中是很难被发现的.但这不是我们这篇文章探讨的主 ...

  9. 3631: [JLOI2014]松鼠的新家

    3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 707  Solved: 342[Submit][Statu ...

  10. 1642: [Usaco2007 Nov]Milking Time 挤奶时间

    1642: [Usaco2007 Nov]Milking Time 挤奶时间 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 582  Solved: 33 ...