**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 pMap,HttpServletRequest request,HttpServletResponse response){
Map dataMap = new HashMap();
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;
}
}