我们经常在进行前后端设计的时候需要对前端下载请求进行相应,对响应报文进行封装成word供下载,下面基于springboot对这一过程进行介绍

一、准备word模板,用于设置导出时的样式

二、pom.xml文件中引入依赖

   <dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-base</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-web</artifactId><version>3.0.3</version></dependency><dependency><groupId>cn.afterturn</groupId><artifactId>easypoi-annotation</artifactId><version>3.0.3</version></dependency>

三、构造ExportWord类

package com.zju.gcs.common.util;import cn.afterturn.easypoi.word.WordExportUtil;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.springframework.util.Assert;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.Map;
public class ExportWord {/*** 导出word* <p>第一步生成替换后的word文件,只支持docx</p>* <p>第二步下载生成的文件</p>* <p>第三步删除生成的临时文件</p>* 模版变量中变量格式:{{foo}}* @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(fileName,"导出文件名不能为空");Assert.isTrue(fileName.endsWith(".docx"),"word导出请使用docx格式");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;FileOutputStream fos = new FileOutputStream(tmpPath);doc.write(fos);// 设置强制下载不打开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 {delFileWord(temDir,fileName);//这一步看具体需求,要不要删}}/*** 删除零时生成的文件*/public static void delFileWord(String filePath, String fileName){File file =new File(filePath+fileName);File file1 =new File(filePath);file.delete();file1.delete();}
}

这时候如果显示httpserveltrequest报错,则还需要在当前模块的配置文件下引入依赖

<dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version><scope>provided</scope></dependency>

三、controller层,接收前端请求

 @RequestMapping("/download")public void downloadMedicalRecord( HttpServletRequest request, HttpServletResponse response) {try {medicalRecordService.downloadMedicalRecord(1,request,response);} catch (Exception e) { }}

引用service层的download方法进行请求的处理,并捕捉异常

四、service 层

声明接口函数

void downloadMedicalRecord(Integer id, HttpServletRequest request, HttpServletResponse response) throws IllegalAccessException, IOException;
}

五、service实现层

@Overridepublic void downloadMedicalRecord(Integer id,HttpServletRequest request, HttpServletResponse response){MedicalRecordDOWithBLOBs record = medicalRecordDOMapper.selectByPrimaryKey(id);SimpleDateFormat dateFormat= new SimpleDateFormat("yyyy-MM-dd");Map<String,Object> params = new HashMap<>();params.put("patientId",record.getPatientId() == null ? "暂无": record.getPatientId());params.put("name",record.getName() == null ? "暂无": record.getName());System.out.println(1);params.put("gender",record.getGender()==1? "男":"女");params.put("doctorName",record.getDoctorName() == null ? "暂无": record.getDoctorName());params.put("birthday", record.getBirthday() == null ? "暂无": dateFormat.format(record.getBirthday()));params.put("height",record.getHeight() == null ? "暂无": record.getHeight());params.put("weight",record.getWeight() == null ? "暂无": record.getWeight());params.put("disease",record.getDisease() == null ? "暂无": record.getDisease());params.put("chfCmp",record.getChfCmp() == null ? "暂无": record.getChfCmp());params.put("hisPreIll",record.getHisPreIll() == null ? "暂无": record.getHisPreIll());params.put("hisTre",record.getHisTre() == null ? "": record.getHisTre());params.put("prvMedHis",record.getPrvMedHis() == null ? "暂无": record.getPrvMedHis());params.put("perHis",record.getPerHis() == null ? "暂无": record.getPerHis());params.put("famHis",record.getFamHis() == null ? "暂无": record.getFamHis());params.put("treAdv",record.getTreAdv() == null ? "暂无": record.getTreAdv());ExportWord.exportWord("C:/Users/23644/Desktop/export.docx","test","第"+id+"份电子病历.docx",params,request,response);}

上面MedicalRecordDOWithBLOBs为接收数据库数据定义的一个接收类,可根据实际情况自定义
selectByPrimaryKey用于查询数据库相关数据

<select id="selectByPrimaryKey" resultMap="ResultMapWithBLOBs" parameterType="java.lang.Integer" >select m.id, m.patient_id, m.name, d.name as doctor_name, m.gender, m.birthday, m.weight, m.height,m.disease, m.chf_cmp, m.his_pre_ill, m.his_tre, m.prv_med_his, m.per_his, m.fam_his, m.tre_advfrom medical_record mleft join doctor don m.doctor_id = d.idwhere m.id = #{id}</select>

六、实现效果



springboot根据模板导出word相关推荐

  1. springboot整合poi-tl根据模板导出word

    springboot整合poi-tl根据模板导出word poi-tl中文文档:http://deepoove.com/poi-tl/ 引入所需包 <dependency><grou ...

  2. springboot中使用freemarker根据flt模板导出word、pdf文档

    1.导包: <!--FreeMarker --> <dependency><groupId>org.springframework.boot</groupId ...

  3. Springboot + vue 实现导出word

    Springboot + vue 实现导出word 后端代码 使用word先创建好已知的模板 使用word工具另存为.xml格式的文件 使用freemarker ftl模板 将修改后的xml文件复制到 ...

  4. 根据模板导出word,复合格式表格生成、可变列表格生成

    系列文章目录 第一章:springboot下生成复杂word文档方案 在Word软件里面制作模板 第三章:doc和docx插入多图 第四章:web环境下word文档预览 根据模板导出word,复合格式 ...

  5. 【Apache POI】Java Web根据模板导出word文件

    最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...

  6. POI根据模板导出word文件,以及word转PDF,PDF转图片再插入PDF中(防止PDF被修改)

    POI操作word和PDF POI根据模板导出word文件 word转PDF PDF转图片再插入PDF中(防止PDF被修改) POI根据模板导出word文件 一.制作word模版,${xxxx}是一会 ...

  7. java调用word模板文件_Java使用模板导出word文档

    Java使用模板导出word文档 需要导入freemark的jar包 使用word模板,在需要填值的地方使用字符串代替,是因为word转换为xml文件时查找不到要填入内容的位置.尽量不要在写字符串的时 ...

  8. poi-tl,根据word模板导出word(表格行循环,表格无表头的情况)

    最近项目里要做一个根据客户提供的word模板导出word的功能,方法有很多,比如easyPoi(对word的支持并不是很好),freeMark(太麻烦不想研究),以及poi-tl, 最后研究了半天发现 ...

  9. easypoi根据模板导出word

    easypoi根据模板导出word 在工作中,模板导出必不或缺,实现模板导出的第三方工具包也有很多.例如:poi.freemaker.hutool的word工具类以及第三方报表工具.这里我简单介绍一下 ...

最新文章

  1. NET::ERR_CACHE_MISS
  2. 计算机应届生必读的 AI 入门经典书单
  3. 丘成桐拉来又一菲尔茨奖得主全职加盟清华!年轻数学家40岁获奖,或带领军班、英才班本科生...
  4. c++中虚函数和纯虚函数定义
  5. VS中查看子类对象内存分布的方法
  6. 鸟哥的Linux私房菜(服务器)- 第十三章、文件服务器之一:NFS 服务器
  7. 什么是伪静态?SEO中如何理解伪静态?
  8. 《剑指offer》把数组排成最小的数
  9. 关于ElasticSearch性能调优几件必须知道的事
  10. linux输入子系统
  11. 洛谷P1288 取数游戏II[博弈论]
  12. C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文
  13. C、C++编程学习资料收藏
  14. 解析身份证号码(附加Java代码)
  15. 学习GIT的一个小游戏
  16. 标题、首图、详情页:三位一体的搜索优化技巧
  17. 树莓派-从入手到使用(一):树莓派入手操作第一步
  18. 社会工程常见攻击方式
  19. java秃顶_【本人秃顶程序员】在Java中使用函数范式提高代码质量
  20. 2011正月初3 震中映秀

热门文章

  1. 面试官:说说kafka、activemq、rabbitmq、rocketmq都有什么优缺点和使用场景
  2. 玩音箱的“老男孩”们
  3. 黄金分割点c的坐标c语言,黄金分割点(第五周 c语言版)
  4. 沈师PTA数据结构2021编程复习题
  5. Pygments — Python syntax highlighter
  6. linux时间与北京时间同步
  7. 不死UBOOT下载链接
  8. 模型整合之模型堆叠——详细理解Stacking model
  9. 基于Echarts实现可视化数据大屏百度地图医疗大数据模板
  10. python 描述符