/**
* 导出word
* 第一步生成替换后的word文件,只支持docx
* 第二步下载生成的文件
* 第三步删除生成的临时文件
* @param templatePath word模板地址
* @param temDir 生成临时文件存放地址
* @param fileName 文件名
* @param params 替换的参数
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
public static void exportWord(String templatePath, String temDir, String fileName, Map<String,Object> params, HttpServletRequest request, HttpServletResponse response){
Assert.notNull(templatePath,"模板路径不能为空");
Assert.notNull(temDir,"临时文件路径不能为空");
Assert.notNull(temDir,"导出文件名不能为空");
Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");
FileOutputStream fos = null;
OutputStream out = null;
if (!temDir.endsWith("/")){
temDir = temDir+ File.separator;
}
File dir = new File(temDir);
if (!dir.exists()){
dir.mkdirs();
}
try {
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie")||userAgent.contains("like gecko")){
fileName = URLEncoder.encode(fileName,"UTF-8");
}else {
fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1");
}
XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
String tmpPath = temDir + fileName;
fos = new FileOutputStream(tmpPath);
doc.write(fos);
//设置强制下载不打开
response.setContentType("application/force-download");
//设置文件名
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Access-Control-Expose-Headers", "FileName");
out = response.getOutputStream();
doc.write(out);
}catch (Exception e){
e.printStackTrace();
}finally {
try {
out.close();
fos.close();
delFileWord(temDir,fileName);
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 删除临时生成的文件
*/
public static void delFileWord(String filePath,String fileName){
File file = new File(filePath + fileName);
File file1 = new File(filePath);
file.delete();
file1.delete();
}
/**
* 导出wps
* 第一步生成替换后的word文件,只支持docx
* 第二步将临时word文件内容复制到下载生成的wps文件中
* 第三步删除生成的临时文件
* @param templatePath word模板地址
* @param temDir 生成临时文件存放地址
* @param fileName 文件名
* @param params 替换的参数
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
public static void exportWps(String templatePath, String temDir,String fileName,Map<String,Object> params, HttpServletRequest request, HttpServletResponse response){
FileOutputStream fos = null;
InputStream input = null;
BufferedInputStream bins=null;
OutputStream outs = null;
BufferedOutputStream bouts = null;
if (!temDir.endsWith("/")){
temDir = temDir+ File.separator;
}
File dir = new File(temDir);
if (!dir.exists()){
dir.mkdirs();
}
try {
String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie")||userAgent.contains("like gecko")){
fileName = URLEncoder.encode(fileName,"UTF-8");
}else {
fileName = new String(fileName.getBytes("utf-8"),"ISO-8859-1");
}
XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
String tmpPath = temDir + fileName;
fos= new FileOutputStream(tmpPath);
doc.write(fos);
input = new FileInputStream(tmpPath);
bins = new BufferedInputStream(input);
outs = response.getOutputStream();
bouts = new BufferedOutputStream(outs);
response.setContentType("application/x-download");
//设置文件名
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "utf-8"));
response.setHeader("FileName", URLEncoder.encode(fileName, "utf-8"));
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Access-Control-Expose-Headers", "FileName");
int bytesRead=0;
byte[] buffer = new byte[8192];
while((bytesRead = bins.read(buffer,0,8192))!=-1){
bouts.write(buffer,0,bytesRead);
}
bouts.flush();
}catch (Exception e){
e.printStackTrace();
}finally {
try{
bouts.close();
outs.close();
bins.close();
input.close();
fos.close();
delFileWord(temDir,fileName);
}catch (Exception e){
e.printStackTrace();
}
}
}
/**
* 导出报审文书word
*/
@PostMapping("/writ/exportWord")
public void writExport(String writHead, Long incidentId, HttpServletRequest request, HttpServletResponse response){
try {
ReportExportDTO dto = incidentService.writExport(writHead, incidentId);
if(StringUtils.isEmpty(dto)){
throw new GlobalException(400,"导出异常");
}
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("writHead", dto.getWritHead());
dataMap.put("reportUserName", dto.getReportUserName());
dataMap.put("reportTime", dto.getReportTime());
dataMap.put("opinion", dto.getOpinion());
dataMap.put("approveUserName", dto.getApproveUserName());
dataMap.put("approveTime", dto.getApproveTime());
dataMap.put("content"," "+dto.getContent());
String millis = String.valueOf(System.currentTimeMillis());
WordUtil.exportWord("/templates/report.docx","templates/", millis+".docx", dataMap,request,response);
// WordUtil.exportWps("/templates/report.docx","templates/", millis+".wps", dataMap,request,response);
} catch (Exception e) {
e.printStackTrace();
}
}
注意 .doc后缀不要手动改成.docx的后缀
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
import freemarker.template.Configuration;
import freemarker.template.Template;
/**
* @param outFilePath 导入word的存放路径
**/
@PostMapping("doc")
@ResponseBody
public ResponseData exportDoc(String outFilePath) throws IOException {
Configuration configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
Template template = configuration.getTemplate("test.ftl");
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("username","houli");
// dataMap.put("id","02201");
// dataMap.put("code","251525v");
// dataMap.put("pwd","root");
// dataMap.put("tel","08583552");
;
File outFile = new File(outFilePath+LocalDateTime.now()+".doc");
Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
try {
template.process(dataMap,out);
out.flush();
out.close();
} catch (TemplateException | freemarker.template.TemplateException e) {
e.printStackTrace();
}
return ResponseData.ofSuccess("导出成功",null);
}
注意 不要手动去改.doc文件的后缀名
import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import java.io.File;
import java.io.FileOutputStream;
import java.util.Map;
/**
* @author hl
*/
public class WordUtil {
/**
* 导出word
* 第一步生成替换后的word文件,只支持docx
* 第二步下载生成的文件
* 第三步删除生成的临时文件
* 模版变量中变量格式:{{foo}}
* @param templatePath word模板地址
* @param temDir 生成临时文件存放地址
* @param fileName 文件名
* @param params 替换的参数
*/
public static String exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params) {
if (!temDir.endsWith("/")){
temDir = temDir + File.separator;
}
File dir = new File(temDir);
if (!dir.exists()) {
dir.mkdirs();
}
try {
/* String userAgent = request.getHeader("user-agent").toLowerCase();
if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
fileName = URLEncoder.encode(fileName, "UTF-8");
} else {
fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
}*/
fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
String tmpPath = temDir + fileName;
System.out.println(templatePath);
FileOutputStream fos = new FileOutputStream(tmpPath);
doc.write(fos);
doc.close();
fos.close();
return templatePath;
// 设置强制下载不打开
// response.setContentType("application/force-download");
// // 设置文件名
// response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
// OutputStream out = response.getOutputStream();
// doc.write(out);
// out.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
// delAllFile(temDir);//这一步看具体需求,要不要删
}
return null ;
}
}
@RequestMapping("/demo/export")
public void export(){
Map<String, Object> dataMap = new HashMap<>();
dataMap.put("name", "事件名称");
dataMap.put("time", LocalDateTime.now());
dataMap.put("username", "houli");
dataMap.put("content", "啊实打实犯得上翻跟斗风格和鬼画符鬼画符撒发射点发射点打发士大夫");
String format = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
Date date1 = DateUtils.parseDate(format, new String[] { "yyyy'-'MM'-'dd HH':'mm':'ss" });
// D:/test/为导入word的存放路径
WordUtil.exportWord("templates/1.docx","D:/test/",date1.getTime()+".docx",dataMap);
}
注意 .doc后缀不要手动改成.docx的后缀