freemaker 导出自动分页word文档

**freemaker 导出word 基本步骤
1.准备好原word文档
2.将word文档存储为xml文件
3.用文档编辑器打开xml文档,将要动态展示的数据用${name}的形式替换,其中“name”对应返回的动态数据的名称
4.xml文档另存为ftl文档
5.利用freemaker<#list>标签分页,每一页作为list中的一项
以下是具体实现:
要求:每一页的文档都是这样,自动分页,页码自加**

XML文档部分(只标注word的body部分)

*<#assign pageNo =0><#list zmlList as zmlInfo><#assign pageNo = pageNo+1>*<w:body><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:snapToGrid w:val="0"/><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:b/><w:bCs/><w:spacing w:val="20"/><w:sz w:val="52"/></w:rPr></w:pPr><w:bookmarkStart w:id="0" w:name="OLE_LINK1"/><w:bookmarkStart w:id="1" w:name="OLE_LINK2"/><w:bookmarkStart w:id="2" w:name="OLE_LINK3"/><w:bookmarkStart w:id="3" w:name="OLE_LINK4"/><w:bookmarkStart w:id="4" w:name="OLE_LINK5"/><w:bookmarkStart w:id="5" w:name="OLE_LINK6"/><w:bookmarkStart w:id="6" w:name="OLE_LINK8"/><w:bookmarkStart w:id="7" w:name="OLE_LINK9"/><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:b/><w:bCs/><w:spacing w:val="20"/><w:sz w:val="52"/></w:rPr><w:t>XX目录</w:t></w:r></w:p><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:snapToGrid w:val="0"/><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:spacing w:val="20"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:spacing w:val="20"/><w:sz w:val="24"/></w:rPr><w:t>[${zmlInfo.nd}]年${zmlInfo.js}卷                                  第${pageNo}页</w:t></w:r></w:p><w:tbl><w:tblPr><w:tblW w:w="10428" w:type="dxa"/><w:jc w:val="center"/><w:tblInd w:w="-157" 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:tblBorders><w:tblLayout w:type="fixed"/><w:tblLook w:val="04A0" w:firstRow="1" w:lastRow="0" w:firstColumn="1" w:lastColumn="0" w:noHBand="0" w:noVBand="1"/></w:tblPr><w:tblGrid><w:gridCol w:w="1026"/><w:gridCol w:w="2138"/><w:gridCol w:w="1242"/><w:gridCol w:w="3171"/><w:gridCol w:w="1281"/><w:gridCol w:w="843"/><w:gridCol w:w="727"/></w:tblGrid><w:tr w:rsidR="006A55E9" w:rsidTr="00B604BB"><w:trPr><w:trHeight w:val="592"/><w:jc w:val="center"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1026" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="18" 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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><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: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="2138" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="24"/></w:rPr><w:t>编号</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1242" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="24"/></w:rPr><w:t>责 任 者</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3171" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="24"/></w:rPr><w:t>名称</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1281" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="24"/></w:rPr><w:t>所属期限</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="843" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="24"/></w:rPr><w:t>页数</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="727" w:type="dxa"/><w:tcBorders><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="18" w:space="0" w:color="auto"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="24"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="24"/></w:rPr><w:t>备注</w:t></w:r></w:p></w:tc></w:tr><#list zmlInfo.mlList as mlInfo><w:tr w:rsidR="006A55E9" w:rsidTr="00B604BB"><w:trPr><w:trHeight w:hRule="exact" w:val="454"/><w:jc w:val="center"/></w:trPr><w:tc><w:tcPr><w:tcW w:w="1026" w:type="dxa"/><w:tcBorders><w:top w:val="single" w:sz="4" w:space="0" w:color="auto"/><w:left w:val="single" w:sz="18" 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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:bookmarkStart w:id="8" w:name="OLE_LINK7" w:colFirst="4" w:colLast="4"/><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="18"/><w:szCs w:val="18"/><w:lang w:bidi="ar"/></w:rPr><w:t>${mlInfo.xh}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="2138" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="18"/><w:szCs w:val="18"/><w:lang w:bidi="ar"/></w:rPr><w:t>${mlInfo.nsrsbh}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1242" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="18"/><w:szCs w:val="18"/><w:lang w:bidi="ar"/></w:rPr><w:t>${mlInfo.zrz}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="3171" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="18"/><w:szCs w:val="18"/><w:lang w:bidi="ar"/></w:rPr><w:t>${mlInfo.zlmc}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="1281" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="18"/><w:szCs w:val="18"/><w:lang w:bidi="ar"/></w:rPr><w:t>${mlInfo.ssq}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="843" w:type="dxa"/><w:tcBorders><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:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="00B604BB"><w:pPr><w:widowControl/><w:jc w:val="center"/><w:textAlignment w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:cs="宋体" w:hint="eastAsia"/><w:color w:val="000000"/><w:kern w:val="0"/><w:sz w:val="18"/><w:szCs w:val="18"/><w:lang w:bidi="ar"/></w:rPr><w:t>${mlInfo.ym}</w:t></w:r></w:p></w:tc><w:tc><w:tcPr><w:tcW w:w="727" w:type="dxa"/><w:tcBorders><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="18" w:space="0" w:color="auto"/></w:tcBorders><w:vAlign w:val="center"/></w:tcPr><w:p w:rsidR="006A55E9" w:rsidRDefault="000E48CB"><w:pPr><w:spacing w:line="400" w:lineRule="exact"/><w:jc w:val="center"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="18"/><w:szCs w:val="18"/></w:rPr><w:t>${mlInfo.bz}</w:t></w:r><w:bookmarkStart w:id="9" w:name="_GoBack"/><w:bookmarkEnd w:id="9"/></w:p></w:tc></w:tr><#--<#if len==pageno></span><w:br w:type="page"/></span></#if>--></#list><w:bookmarkEnd w:id="8"/></w:tbl><w:p w:rsidR="00B604BB" w:rsidRDefault="00B604BB"><w:pPr><w:spacing w:line="580" w:lineRule="exact"/><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体"/><w:sz w:val="30"/></w:rPr></w:pPr><w:r><w:rPr><w:rFonts w:ascii="宋体" w:hAnsi="宋体" w:hint="eastAsia"/><w:sz w:val="30"/></w:rPr><w:t xml:space="preserve">    填制人:${zmlInfo.tzr}  审核人:${zmlInfo.shr}    装订人:${zmlInfo.zdr}</w:t></w:r><w:bookmarkEnd w:id="0"/><w:bookmarkEnd w:id="1"/><w:bookmarkEnd w:id="2"/><w:bookmarkEnd w:id="3"/><w:bookmarkEnd w:id="4"/><w:bookmarkEnd w:id="5"/><w:bookmarkEnd w:id="6"/><w:bookmarkEnd w:id="7"/></w:p><w:sectPr w:rsidR="00B604BB"><w:pgSz w:w="11906" w:h="16838"/><w:pgMar w:top="1440" w:right="1800" w:bottom="1440" w:left="1800" w:header="851" w:footer="992" w:gutter="0"/><w:cols w:space="425"/><w:docGrid w:type="lines" w:linePitch="312"/></w:sectPr></w:body></#list> 

解析数据部分

private void getData(Map<String, Object> dataMap,@RequestParam Map<String, Object> pMap) {  

        List<Map<String,Object>> list = new ArrayList<Map<String,Object>>();  
        List<Map<String,Object>> mllist =  new ArrayList<Map<String,Object>>();
        List<Map<String,Object>> list1 =  new ArrayList<Map<String,Object>>();
        Map<String, Object> mlMap = new HashMap<String,Object>();  
        List rows = null ;
        int len =0;
        int zys = 0;
        String zdr="";
        String shr="";
        String tzr="";
        String js = "";
        try {
            logger.info("request========"+JSON.toJSONString(pMap));
            String rtnResult = baseService.executeProc("XX", JSON.toJSONString(pMap));//调用存储过程从数据库返回数据
            logger.info("response= " + rtnResult);
            DbRtnDataGrid dbRtnDataGrid = JSONArray.parseObject(rtnResult, DbRtnDataGrid.class);
             rows = dbRtnDataGrid.getRows();
             len = rows.size();
             if(len%25 !=0){
                 zys = (int)len/25 +1;
             }else{
                 zys = (int)len/25;
             }

        } catch(Exception e) {
            /*resultJSONObj.put("returnCode", "099");
            resultJSONObj.put("returnMessage", "加载列表失败!");*/
            logger.error( "加载列表失败!" + e.getMessage());
        }
        for(int k =0; k<zys;k++){/*根据总页数循环*/
         list = new ArrayList<Map<String,Object>>();  
         mlMap = new HashMap<String,Object>();  
         Calendar calendar = Calendar.getInstance();// 取当前日期。
         String year = String.valueOf(calendar.get(1) );
         JSONObject btObject= JSONObject.parseObject(rows.get(0).toString());

         mlMap.put("nd", pMap.get("nd").toString());  
         mlMap.put("tzr", btObject.get("tzr")); 
         mlMap.put("shr", btObject.get("shr")); 
         mlMap.put("zdr", btObject.get("zdr")); 
        /* mlMap.put("page", k+1);  */
         mlMap.put("js", btObject.get("js"));  
         mlMap.put("len", zys); 
        int maxLen = 0;
        if (len<(k+1)*25){
            maxLen =len;
            }
        else{
            maxLen = (k+1)*25;
        }


        for(int i = k*25;i<maxLen;i++){
        Map<String,Object> map = new HashMap<String,Object>();  
          JSONObject jsonObject = JSONObject.parseObject(rows.get(i).toString());
            map.put("nsrsbh", jsonObject.get("nsrsbh"));  
            map.put("zlmc", jsonObject.get("zlmc"));  
            map.put("zrz", jsonObject.get("zrz")); 
            map.put("ym", jsonObject.get("ym"));
            map.put("ssq", jsonObject.get("ssq"));
            map.put("bz", jsonObject.get("bz"));
            map.put("xh", jsonObject.get("xh"));

        list.add(map);  

        }  
        if(k==zys-1){
        if(len<(k+1)*25){
                int blankTr =25-len%25;
                for(int j =0; j<blankTr;j++){
                Map<String,Object> map = new HashMap<String,Object>();  
                 map.put("nsrsbh", " ");  
                 map.put("zlmc", " ");  
                 map.put("zrz", " "); 
                 map.put("ym", " ");
                 map.put("ssq", " ");
                 map.put("bz", " ");
                 map.put("xh", " ");
                 list.add(map);  
                }

            } 
        }
        mlMap.put("mlList", list) ;    
        mllist.add(k, mlMap);
    }

        dataMap.put("zmlList", mllist);    

    }

调用导出

/**
     * 生成导出word
     */
    @RequestMapping("/dcWord1")
    public @ResponseBody void dcWord1(@RequestParam Map<String, Object> pMap,HttpServletRequest request,HttpServletResponse response){
        Map<String, Object> dataMap = new HashMap<String, Object>(); 
        if(pMap!=null){
             try {
                                 String filename = "";//文件名

                 getData(dataMap,pMap);//获取数据
                 WordUtil.exportMillCertificateWord(request,response,dataMap,filename,"mb.ftl");
             } catch (IOException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();
             }    


        }
    }

导出word到本地通用

package com.nss.framework.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.net.URLEncoder;
import java.util.Date;
import java.util.Map;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import freemarker.template.Configuration;
import freemarker.template.Template;

public class WordUtil {
     //配置信息,代码本身写的还是很可读的,就不过多注解了  
    private static Configuration configuration = null;  
    //这里注意的是利用WordUtils的类加载器动态获得模板文件的位置  
   // private static final String templateFolder = WordUtils.class.getClassLoader().getResource("../../").getPath() + "WEB-INF/templetes/";  
    private static final String templateFolder = WordUtil.class.getResource("").getPath().toString();
    static {  
        configuration = new Configuration();  
        configuration.setDefaultEncoding("utf-8");  
        try {  
            //configuration.setDirectoryForTemplateLoading(new File(templateFolder)); 
            configuration.setClassForTemplateLoading(WordUtil.class, "/com/nss/framework/util");
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
   }  

    private WordUtil() {  
        throw new AssertionError();  
    }  

    public static void exportMillCertificateWord(HttpServletRequest request, HttpServletResponse response, Map map,String title,String ftlFile) throws IOException {  
        Template freemarkerTemplate = configuration.getTemplate(ftlFile);  
        File file = null;  
        InputStream fin = null;  
        ServletOutputStream out = null;  
        try {  
            // 调用工具类的createDoc方法生成Word文档  
            file = createDoc(map,freemarkerTemplate);  
            fin = new FileInputStream(file);  

            response.setCharacterEncoding("utf-8");  
            response.setContentType("application/msword");  
            // 设置浏览器以下载的方式处理该文件名  
            //String fileName = title+DateUtil.getStrDate("yyyyMMddHHmmss") + ".doc";  
            response.setHeader("Content-Disposition", "attachment;filename="  
                    .concat(String.valueOf(URLEncoder.encode(title+".doc", "UTF-8"))));  

            out = response.getOutputStream();  
            byte[] buffer = new byte[512];  // 缓冲区  
            int bytesToRead = -1;  
            // 通过循环将读入的Word文件的内容输出到浏览器中  
            while((bytesToRead = fin.read(buffer)) != -1) {  
                out.write(buffer, 0, bytesToRead);  
            }  
        } finally {  
            if(fin != null) fin.close();  
            if(out != null) out.close();  
            if(file != null) file.delete(); // 删除临时文件  
        }  
    }  

    private static File createDoc(Map<?, ?> dataMap, Template template) {  
        String name =  "sellPlan.doc";  
        File f = new File(name);  
        Template t = template;  
        try {  
            // 这个地方不能使用FileWriter因为需要指定编码类型否则生成的Word文档会因为有无法识别的编码而无法打开  
            Writer w = new OutputStreamWriter(new FileOutputStream(f), "utf-8");  
            t.process(dataMap, w);  
            w.close();  
        } catch (Exception ex) {  
            ex.printStackTrace();  
            throw new RuntimeException(ex);  
        }  
        return f;  
    }  
}
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Web应用中,有时需要按照固定的模板将数据导出Word,如流程审批单,在流程处理完成后将处理过程按照流程单的要求导出,有时程序中需要实现生成标准Word文档,要求能够打印,并且保持页面样式不变,常见的方案有POI、iText、JACOB、JSP几种方式,POI读取Word文档比较适合、对于生成文档样式比较难控制,iText操作Excel还可以,对Word的操作功能有限,JACOB操作Word实现复杂,并且无法将服务部署到Linux平台,要求安装office,对于实现固定格式的报表实现困难,对于JSP直接输出方式样式控制难。 Word从2003开始支持XML格式,用XML+Freemarder还做就很简单了,大致的思路是先用office2003或者2007编辑好 word的样式,然后另存为xml,将xml翻译为FreeMarker模板,最后用java来解析FreeMarker模板并输出Doc。经测试这样方式生成的word文档完全符合office标准,样式、内容控制非常便利,打印也不会变形,生成的文档和office中编辑文档完全一样。具体实现过程如下: 1、 首先用office【版本要2003以上,以下的不支持xml格式】编辑文档的样式,将需要动态填充的内容使用Freemarker标签替换:Word文档样式如下: 2、 将Word文档另存为XML格式,将后缀名“xml”修改为“ftl” 3、 使用Freemarker填充内容,代码如下: [java] view plaincopyprint? 1. package com.test.freemarker.report; 2. 3. 4. 5. import java.io.BufferedWriter; 6. 7. import java.io.File; 8. 9. import java.io.FileOutputStream; 10. 11. import java.io.IOException; 12. 13. import java.io.OutputStreamWriter; 14. 15. import java.io.Writer; 16. 17. import java.util.HashMap; 18. 19. import java.util.Map; 20. 21. 22. 23. import freemarker.template.Configuration; 24. 25. import freemarker.template.Template; 26. 27. import freemarker.template.TemplateException; 28. 29. 30. 31. public class DocumentHandler { 32. 33. private Configuration configuration = null; 34. 35. 36. 37. public DocumentHandler() { 38. 39. configuration = new Configuration(); 40. 41. configuration.setDefaultEncoding("utf-8"); 42. 43. } 44. 45. 46. 47. public void createDoc() { 48. 49. // 要填入模本的数据文件 50. 51. Map dataMap = new HashMap(); 52. 53. getData(dataMap); 54. 55. // 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以重servlet,classpath,数据库装载, 56. 57. // 这里我们的模板是放在com.havenliu.document.template包下面 58. 59.

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值