一、 准备模版
填充word数据,图片用大小合适的真实图片代替,生成ftl文件后修改为参数形式。
填充完数据后另存为xml文件,打开文件参数正常,没有数据断开的情况
文件后缀改为ftl格式,打开文件对数据集合修改和图片参数修改
集合数据填充可参考https://blog.csdn.net/weixin_41701049/article/details/83143998
图片数据填充
<#list dts.imagelist as image><w:pict><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"/><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"/><v:f eqn="sum @0 1 0"/><v:f eqn="sum 0 0 @1"/><v:f eqn="prod @2 1 2"/><v:f eqn="prod @3 21600 pixelWidth"/><v:f eqn="prod @3 21600 pixelHeight"/><v:f eqn="sum @0 0 1"/><v:f eqn="prod @6 1 2"/><v:f eqn="prod @7 21600 pixelWidth"/><v:f eqn="sum @8 21600 0"/><v:f eqn="prod @7 21600 pixelHeight"/><v:f eqn="sum @10 21600 0"/></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/><o:lock v:ext="edit" aspectratio="t"/></v:shapetype><v:shape id="图片 29" o:spid="_x0000_i1025" type="#_x0000_t75" style="width:174.6pt;height:128.4pt;mso-position-horizontal-relative:page;mso-position-vertical-relative:page"><v:fill o:detectmouseclick="t"/><w:binData w:name="${"wordml://0"+dts_index+3+"00000"+image_index+1+".png"}" xml:space="preserve">${image}
</w:binData><v:imagedata src="${"wordml://0"+dts_index+3+"00000"+image_index+1+".png"}" o:title=""/></v:shape></w:pict></#list>
配合参考https://bbs.csdn.net/topics/392194575?page=1
二、java后台
@ResponseBody
@RequestMapping(value = "/exportSubgrade", method = RequestMethod.GET)
public String exportSubgrade(HttpServletRequest request, HttpServletResponse response,@RequestParam("fPkMtntaskrecordid") String fPkMtntaskrecordid) {
MtntaskrecordEntity mtntaskrecordEntity=null;
Map<String, Object> dataMap = new HashMap<String, Object>();
List<Map<String,Object>> list1 = new ArrayList<Map<String,Object>>();
List<Map<String,Object>> tests = new ArrayList<Map<String,Object>>();
List<Map<String,Object>> dtslist = new ArrayList<Map<String,Object>>();
try {
mtntaskrecordEntity= mtntaskrecordService.selectMtntaskrecordByid(fPkMtntaskrecordid);
dataMap.put("wxxmmc", mtntaskrecordEntity.getfVcBoqbillnm());
dataMap.put("bgbh", mtntaskrecordEntity.getfVcIdentifier());
dataMap.put("lxbm", mtntaskrecordEntity.getfVcRoadcode());
dataMap.put("sgrq", new SimpleDateFormat("yyyyMMdd").format(mtntaskrecordEntity.getfDtConstructiontime())
+"-"+new SimpleDateFormat("yyyyMMdd").format(mtntaskrecordEntity.getfDtConstructionendtime()));
dataMap.put("lxmc", mtntaskrecordEntity.getfVcRoadnm());
dataMap.put("tq", mtntaskrecordEntity.getfVcWeather());
dataMap.put("gldw", mtntaskrecordEntity.getfVcManagenm());
dataMap.put("sgdw", mtntaskrecordEntity.getfVcConstructionnm());
dataMap.put("zysgsbjcl", mtntaskrecordEntity.getfVcEquipmentnm());
dataMap.put("zysgry", mtntaskrecordEntity.getfVcConstructionPersonnel());
dataMap.put("rwdbh", mtntaskrecordEntity.getfVcTaskcode());
List<InventoryEntity> disdtslist=mtntaskrecordEntity.getInventoryList();
for (int i = 0; i < disdtslist.size(); i++) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("xh", i+1);
map.put("fx", disdtslist.get(i).getfVcDirection());
map.put("zh", disdtslist.get(i).getfVcStakenumber());
map.put("wz", disdtslist.get(i).getfVcPosition());
map.put("qdxm", disdtslist.get(i).getfVcItemlist());
map.put("dw", disdtslist.get(i).getfVcUnit());
map.put("sbsl", disdtslist.get(i).getfDbDeclarenumber());
map.put("sksl", disdtslist.get(i).getfDbReviewnumber());
String sxx="";
if(disdtslist.get(i).getfInTimeliness()==0) {
sxx="否";
}else if(disdtslist.get(i).getfInTimeliness()==1) {
sxx="是";
}
map.put("sxx", sxx);
map.put("bz", disdtslist.get(i).getfVcRemark());
list1.add(map);
}
dataMap.put("list1", list1);
List<InspectionrecordEntity> inspectionlist=mtntaskrecordEntity.getInspectionrecordList();
for(int i=0;i<inspectionlist.size();i++) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("jyxm", inspectionlist.get(i).getfVcBoqbillnm());
map.put("gdzhyxpc", inspectionlist.get(i).getfVcRegulations());
String zjjg="";
if(inspectionlist.get(i).getfInSelfcheck()==1) {
zjjg="合格";
}else if(inspectionlist.get(i).getfInSelfcheck()==2) {
zjjg="不合格";
}
map.put("zjjg", zjjg);
String ysjg="";
if(inspectionlist.get(i).getfInAcceptance()==1) {
ysjg="合格";
}else if(inspectionlist.get(i).getfInAcceptance()==2) {
ysjg="不合格";
}
map.put("ysjg", ysjg);
map.put("bhgsm", inspectionlist.get(i).getfVcUnqualifiedstatement());
tests.add(map);
}
dataMap.put("tests", tests);
String zjyj="";
if(mtntaskrecordEntity.getfInConunitcheck()==0) {
zjyj="合格";
}else if(mtntaskrecordEntity.getfInConunitcheck()==1) {
zjyj="不合格";
}
dataMap.put("zjyj", zjyj);
dataMap.put("zjyjqz", mtntaskrecordEntity.getfVcConunitsign()+"/"+new SimpleDateFormat("yyyyMMdd").format(mtntaskrecordEntity.getfDtConunittime()));
String ysyj="";
if(mtntaskrecordEntity.getfInManunitcheck()==0) {
ysyj="合格";
}else if(mtntaskrecordEntity.getfInManunitcheck()==1) {
ysyj="不合格";
}
dataMap.put("ysyj", ysyj);
dataMap.put("zgtz", mtntaskrecordEntity.getfVcManunitnotice());
dataMap.put("zgtzqz", mtntaskrecordEntity.getfVcConunitsign()+"/"+new SimpleDateFormat("yyyyMMdd").format(mtntaskrecordEntity.getfDtManunittime()));
List<MtntaskrecorddtsEntity> mtntaskrecorddtslist=mtntaskrecordEntity.getMtntaskrecorddtsList();
for (int i = 0; i < mtntaskrecorddtslist.size(); i++) {
Map<String,Object> map = new HashMap<String,Object>();
map.put("xh2", i+1);
String[] imagessrc=mtntaskrecorddtslist.get(i).getfVcImages().split(",");
List<String> imagelist = new ArrayList<String>();
for(int j=0;j<imagessrc.length;j++) {
imagelist.add(imgBase64(imagessrc[j]));
}
map.put("imagelist", imagelist);
map.put("zyjlsm", mtntaskrecorddtslist.get(i).getfVcDescription());
dtslist.add(map);
}
dataMap.put("dtslist", dtslist);
dataMap.put("qz", mtntaskrecordEntity.getfVcConunitsign());
dataMap.put("sgdwrq", new SimpleDateFormat("yyyyMMdd").format(mtntaskrecordEntity.getfDtConunittime()));
response.setContentType("application/octet-stream; charset=UTF-8");
String as = "高速公路路基日常养护作业" + new SimpleDateFormat("MM.dd").format(new Date()) + ".doc";
String fileName = as;// = java.net.URLEncoder.encode(as, "UTF-8");
/* 根据request的locale 得出可能的编码,中文操作系统通常是gb2312 */
fileName = new String(as.getBytes("GB2312"), "ISO8859-1");
as = fileName;
response.setHeader("content-disposition", "attachment;filename=" + as);
Writer out = new BufferedWriter(new OutputStreamWriter(response.getOutputStream(), "utf-8"));// 重点:一定要注意编码格式,漏写编码格式将导致word无法打开(xml非法字符)
Word word = new Word();
word.createWord(dataMap, out, "luji.ftl",request.getSession().getServletContext());
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
package cn.microvideo.qsyhxc.repMtn.controller;
import java.io.IOException;
import java.io.Writer;
import java.util.Map;
import javax.servlet.ServletContext;
import freemarker.template.Configuration;
import freemarker.template.Template;
public class Word {
private Configuration configuration = null;
public Word(){
configuration = new Configuration();
configuration.setDefaultEncoding("UTF-8");
}
public void createWord(Map<String, Object> dataMap,Writer out,String modelName,ServletContext context){
//两种获取模版文件路径方式
// configuration.setClassForTemplateLoading(this.getClass(), path+"exportModel");//模板文件所在路径
configuration.setServletContextForTemplateLoading(context, "/exportModel");
Template t=null;
try {
t = configuration.getTemplate(modelName); //获取模板文件
} catch (IOException e) {
e.printStackTrace();
}
try {
t.process(dataMap, out); //将填充数据填入模板文件并输出到目标文件
} catch (Exception e) {
e.printStackTrace();
}
}
}
三、前端调用
window.location.href='${basePath}/export/exportSubgrade?fPkMtntaskrecordid=' + fPkMtntaskrecordid;