zoukankan      html  css  js  c++  java
  • freemarker导出word文档——WordXML格式解析

      前不久,公司一个项目需要实现导出文档的功能,之前是一个同事在做,做了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这个类,具体可以参考相关文档。。

  • 相关阅读:
    IOS开发-UIDynamic(物理仿真)简单使用
    IOS开发---视频录制
    利用阿里云服务器免费体验word press博客、个人网站
    Next Cloud通过修改数据库表,达到替换文件而不改变分享的链接地址的效果,以及自定义分享链接地址
    非华为笔记本如何实现多屏协同和一碰互传以及一些问题的解决方法
    如何申请XShell和XFtp的免费家庭学生版本
    PicGo配合Typora怎么配置Chevereto图床,PicGo的Chevereto图床配置
    Ubuntu无法正常引导,进不去Ubuntu,安装Ubuntu20和Window10双系统后,
    搭建自己的Chevereto免费图床—写博客更加得心应手了!
    如何搭建自己的本地服务器,Web服务器
  • 原文地址:https://www.cnblogs.com/klbc/p/4005799.html
Copyright © 2011-2022 走看看