创建word模板使用的是:FreeMarker,如何制作可以搜到很多的文章
package com.jtkj.utils;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import freemarker.template.Configuration;
import freemarker.template.Template;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Locale;
import java.util.Map;
public class ToWord {
private static Configuration configuration = null;
//注意这个地方的path是Word文档所在的路径
private static final String templateFolder = ToWord.class.getClassLoader ().getResource ("").getPath ();
//判断当前项目是在windows服务器还是在其他服务器,用来存放模板文件;如果是本地的话模板存放在项目下的resources文件夹下,线上服务器的话需要自己创建文件夹存放模板文件
static {
configuration = new Configuration ();
configuration.setDefaultEncoding ("utf-8");
try {
String Os = System.getProperty("os.name").toLowerCase(Locale.US);
if (Os.indexOf("Window") >= 0 || Os.indexOf("window") >= 0) {
configuration.setDirectoryForTemplateLoading (new File (templateFolder));
}else {
//线上模板所在地址
configuration.setDirectoryForTemplateLoading (new File ("服务器存放word模板地址"));
}
} catch (IOException e) {
e.printStackTrace ();
}
}
private ToWord() {
throw new AssertionError ();
}
public static void exportMillCertificateWord (HttpServletResponse response, Map map,int i) {
String name=null,tille = null;
Template freemarkerTemplate;
try {
//根据自己在controller传的i值添加case和自己模板名
switch (i){
case 1:
tille="ftl/SFYWRCYW";
name= "xxx";
break;
case 2:
tille="ftl/SFYWRCYWZD";
//文件名
name= "xxx";
break;
case 3:
tille="ftl/YWLXDGL";
name= "xxx";
break;
default:
System.out.println("---111---");;
}
freemarkerTemplate = configuration.getTemplate (tille+".ftl");
//freemarkerTemplate = configuration.getTemplate (tille+".ftl");
File file = null;
// 调用工具类的createDoc方法生成Word文档
file = createDoc (map, freemarkerTemplate);
response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(name+".doc", "UTF-8"));
//读取要下载的文件,保存到文件输入流
FileInputStream in = new FileInputStream(file);
//创建输出流
OutputStream out = response.getOutputStream();
//创建缓冲区
byte buffer[] = new byte[1024];
int len = 0;
//循环将输入流中的内容读取到缓冲区当中
while ((len = in.read(buffer)) > 0) {
//输出缓冲区的内容到浏览器,实现文件下载
out.write(buffer, 0, len);
}
//关闭文件输入流
in.close();
//关闭输出流
out.close();
} catch (IOException e) {
e.printStackTrace ();
}
}
private static File createDoc (Map<?, ?> dataMap, Template template) {
String name = "xxx";
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;
}
}
获取需要导出的数据装到map中,然后调用工具类中的方法将数据放到word模板里,前端调用此方法下载word文件
/**
* 导出word
*
* @return
*/
@ApiOperation("导出word")
@GetMapping("/Model/Config/Word/{ids}")
public void exporWord(@PathVariable("ids") String id, HttpServletResponse response) throws IOException {
MajorEventsEntity majorEvents = majorEventsService.getById(id);
BaseEventInfoEntity infoEntity = baseEventInfoService.getInfo(majorEvents.getFauequipment());
Map<String,Object> map = new HashMap<>();
//map中的key和模板的{}中的字段一一对应
map.put("faultSite",majorEvents.getFaultSite());
map.put("fauEquipment",infoEntity.getName());
map.put("faultTime",majorEvents.getFaultTime());
map.put("fauCondition",majorEvents.getFaucondition());
map.put("accidentImpact",majorEvents.getAccidentImpact());
map.put("responsibleParty",majorEvents.getResponsibleParty());
map.put("resPartTel",majorEvents.getRespartTel());
map.put("faultReason",majorEvents.getFaultReason());
map.put("handleSituation",majorEvents.getHandleSituation());
map.put("recoveryTime",majorEvents.getRecoveryTime());
ToWord.exportMillCertificateWord(response,map,2);
}
给table每条数据加导出按钮
<el-button type="text" :disabled="scope.row.flowState!==2"
@click="exportWord(scope.row.id,scope.row.eventName)" >导出word
</el-button>
exportWord(id,eventName) {
this.$confirm('您确定要导出当前数据, 是否继续?', '提示', {
type: 'warning'
}).then(() => {
request({
url: `/api/business/MajorEvents/Model/Config/Word/${id}`,
method: 'get',
responseType: 'blob',
}).then(res => {
//设置下载word文件的文件名
this.handleDownLoadFile(res,"doc","重大事件--"+eventName+"记录表.doc")
})
}).catch(() => {
})
},
//word文件下载
handleDownLoadFile(response, type, fileName) {
let blob = new Blob([response], {
type: type + ';charset=utf-8'
});
let src = window.URL.createObjectURL(blob);
if (src) {
let link = document.createElement('a');
link.style.display = 'none';
link.href = src;
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
document.body.removeChild(link); //下载完成移除元素
window.URL.revokeObjectURL(src); //释放掉blob对象
}
},