freemarker 导出word

xml分页

  • 分页符是需要依附于某个元素的
<!-- 下标为偶数时执行分页 -->
   <#if per_index?if_exists+1%2 ==0> 
   <w:p ><w:r><w:br w:type="page" /></w:r></w:p> 
   <!-- 此标签用于强制分页 -->
</#if>
    

<!-- 分页符 -->
<w:p ><w:r><w:br w:type="page" /></w:r></w:p> 
  • 另存为word 2003 xml格式的xml,然后xmll文件改后缀,xxx.xml->xxx.ftl
  • 正文在w:body 标签下
  • 取出参数${world} 其中${},是占位符,world是属性名
  • 表格
  • w:tab 是表格标签,w:tr是row tr 用<#list> <w:tr> </w:tr> </#list> 标签循环
  • 页边距:<w:pgMar w:top="2275" w:right="1800" w:bottom="1699" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/>

xml 文档结构

<w:wordDocument>
    <w:body>
        <w:p>
            <w:pPr>
            </w:pPr>    
            <w:r>
                <w:rPr>属性:加粗,倾斜,字体颜色等</w:rPr>
                <w:t> 文本内容</w:t>
            </w:r>      
        </w:p>
    </w:body>
</<w:wordDocument>
<!-- 判断null -->
<#if users?exists && users.size != 0 >
    <#list users as u>
                    <!-- 表格 -->
                    <w:tbl>
                    <!-- 每一行 -->
                     <w:tr>
                     </w:tr> 
                    </w:tbl>
                    
                    <!-- 每10个分页 -->
                <#if u.id%10 == 0 > 
                <w:p ><w:r><w:br w:type="page" /></w:r></w:p> 
                </#if>
    </#list>
</#if>
  • <w:p> 会包裹一段数据,(段落)

  • <w:pPr> 段落的属性,可选元素。 段落属性的一些示例包括对齐方式、边框、断字覆盖、缩进、行距、底纹、文本方向和孤行控制

  • <w:r> 它是具有一组共同属性(如格式设置)的文本区域。它可以包含多个<w:t>元素。

  • 如果示例文本中只有一个字是粗体,粗体将会分离到一个<w:r>

  • <w:rPr>用于指定<w:r>属性。 连续文本属性的一些示例包括粗体、边框、字符样式、颜色、字体、字号、斜体、字距调整、禁用拼写/语法检查、底纹、小号大写字母、删除线、文字方向和下划线

  • <w:t> 实际的文本内容

  • 注意: 分页是标签要包裹 <w:tbl>
  • 每一页都是新的 table
  • 表头 可以用 if 标签来控制
<!-- 双重List 动态生成page -->
    <#list pvc as brw>
        <#list brw as basic>
                <!-- 分页全部包裹 -->
                    <w:tbl>
                        <w:tr>
                          </w:tr>
                       
                    </w:tbl>
        </#list>
            <#if  brw_has_next>
                    <w:p ><w:r><w:br w:type="page" /></w:r></w:p> 
            </#if>
                        
    </#list>
    <!-- 最后一页 不分页 -->
    <#if  !showLimit>
            <w:p ><w:r><w:br w:type="page" /></w:r></w:p> 
    </#if>

java Render


	@Autowired
	FreeMarkerConfigurer freeMarkerConfigurer;

	public Template getTemplate(String name) throws IOException {
		return freeMarkerConfigurer.getConfiguration().getTemplate(name);
	}

    /**
	 * 
	 * @Title: exportDocToClient   
	 * @Description: TODO(这里用一句话描述这个方法的作用)   
	 * @param: @param response  响应流
	 * @param: @param fileName	导出文件名
	 * @param: @param tplName	模板名称  
	 * 	spring boot /src/main/resources/templates
	 * @param: @param data      Map<String, Object> data 数据
	 * @param: @throws Exception      
	 * @return: void      
	 * @throws
	 */
	public void exportDocToClient(HttpServletResponse response, String fileName, String tplName,
			Map<String, Object> data) throws Exception {
		response.reset();
		response.setCharacterEncoding("UTF-8");
		response.setContentType("application/msword");
//	        response.setContentType("application/msexcel");
		response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
		// 把本地文件发送给客户端
		Writer writer = response.getWriter();
		Template template = getTemplate(tplName);
		template.process(data, writer);
		writer.close();
	}