使用场景:打开一个表单页面,导出word或wps文件,代码框架基于springboot+jpa

一、准备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工具类,里面包含导出word和导出wps两种方法
导出文件工具类中的文件流一定要按照最先使用的最后关闭原则,否则会造成临时文件删除不了的问题。导出wps的方法就是在导出word方法的基础上将临时文件内容写入到下载的wps文件中。

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.*;
import java.net.URLEncoder;
import java.util.Map;public class ExportWord {/*** 导出word* <p>第一步生成替换后的word文件,只支持docx</p>* <p>第二步下载生成的文件</p>* <p>第三步删除生成的临时文件</p>* @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.addHeader("Content-Disposition","attachment;fileName=" + 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* <p>第一步生成替换后的word文件,只支持docx</p>* <p>第二步将临时word文件内容复制到下载生成的wps文件中</p>* <p>第三步删除生成的临时文件</p>* @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=" + 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();}}}
}

四、Controller层代码

/**
* @param id 实体类id
* @param flag 标志位,用来判断调用导出word还是导出wps
* @param request HttpServletRequest
* @param response HttpServletResponse
*/
@ApiOperation("导出word")
@GetMapping("/exportWord")
public void exportWord(@RequestParam String id,@RequestParam String flag,HttpServletRequest request, HttpServletResponse response) {handleTipService.exportWord(id,flag,request,response);
}

五、Service实现层

@Override
public void exportWord(String id, String flag,HttpServletRequest request, HttpServletResponse response)  {//处理模板需要的参数信息List<HashMap> byId = handleTipNativeRepository.findById(id);String path = "";HashMap hashMap = byId.get(0);if(hashMap.get("repeatCode")!=null){String repeatCode = hashMap.get("repeatCode").toString();int length = repeatCode.split(",").length;hashMap.put("repeatCode",length);}try {//取到模板所在系统中的静态资源位置path = ResourceUtils.getFile("classpath:static/wps/handleTip.docx").getPath();} catch (FileNotFoundException e) {e.printStackTrace();}//根据前端传过来的标志位判断是用word还是wpsif(flag!=null){if("word".equals(flag)){ExportWord.exportWord(path,"test", "HandleTip.docx", hashMap,request,response);}else if("wps".equals(flag)){ExportWord.exportWps(path,"test", "HandleTip.wps", hashMap,request,response);}}
}

六、Repository实现层

@Override
public List<HashMap> findById(String id){String sql = " sql语句 ";StringBuilder whereSql = new StringBuilder(" ");if (StringUtils.isNotEmpty(id)) {whereSql.append(" and h.ID = :id ");}Query query = this.entityManager.createNativeQuery(sql+(whereSql).toString());if (StringUtils.isNotEmpty(id)) {query.setParameter("id", id);}query.unwrap(SQLQuery.class).setResultTransformer(Transformers.ALIAS_TO_ENTITY_MAP);List<HashMap> list = query.getResultList();return list;
}

作者:锋林华

链接:https://blog.csdn.net/u012451819/article/details/109061373

easypoi导出word表格_java如何导出word和wps文档相关推荐

  1. word打开wps文件乱码_Word打开WPS文档成乱码怎么办

    Word打开WPS文档成乱码怎么办 最近一位同事拿来一篇WPS做的论文,请我帮他修改后再打印出来,我的电脑中安装的字处理软件是Word XP.记得Office XP中自带了WPS文档转换器,一向没机会 ...

  2. Word 打开WPS文档成乱码的解决方法(转)

    Word 打开WPS文档成乱码的解决方法(转)[@more@] 最近一位同事拿来一篇WPS做的论文,请我帮他修改后再打印出来,我的电脑中安装的字处理软件是Word XP.记得Office XP中自带了 ...

  3. 怎么把html文档转换成wps,怎么把wps文档转换成word文档

    您可能感兴趣的话题: wps 核心提示:今天,我们就来学习一下将wps转换成word的方法,包括了修改文件后缀名的方法.另外为doc格式的方法.下面就一起来看看具体的内容吧! 我们知道,电脑安装的是金 ...

  4. 删除Office(Word,Excel,PowerPoint)中Recent Document最近文档地址不存在的文件

    最近碰到一个需求,删除Office(Word,Excel,PowerPoint)中Recent Document最近文档地址不存在的文件,即每次打开office(Word,Excel,PowerPoi ...

  5. 如何去掉/消除网页复制粘贴后带到word或WPS文档中的浅灰色背景

    如何去掉/消除网页复制粘贴后带到word或WPS文档中的浅灰色背景 从网页或者其它地方复制过来的文字,有时候背景会呈浅灰色,但并非是"突出显示"或是设置了背景颜色,只有有文字的地方 ...

  6. 删除Office Word (Excel)中Recent Document最近文档中本地和online打开文件路径已经不存在的文件记录

    上次写了一篇删除Office(Word,Excel,PowerPoint)中Recent Document最近文档地址不存在的文件,注重从注册表中删除记录,后来发现有问题,online打开文件的记录在 ...

  7. WPS文档办公 自由绘制表格的方法。

    转载自品略图书馆 http://www.pinlue.com/article/2020/09/0111/0411160971848.html 我们在利用WPS文档与Word文档进行日常办公时,经常需要 ...

  8. 打印表格打印机没有反应_windows10下office2016文档和表格 hp打印机 按打印没反应解决办法...

    这个问题困扰了我好久,搜网上这问题也很多,但没有一个有效的方法.我这边系统是win10 64位,office 2016,打印机是局域网连接的hp m1005.开始也是其他都能打印,pdf,图片,文本文 ...

  9. 使用WPS文档创建表格怎么调整行间距

    在WPS文档中可以绘制表格,表格绘制完成后,大家可在表格中输入想要展现的表格数据,表格数据可以根据需要进行调整,比如调整表格数据行间距,调整表格宽度等. 由于是手动绘制的表格,在调整表格时可能会出现牵 ...

最新文章

  1. c语言中,关于指针变量前的*有两种表现形式:
  2. js中表单验证常用到的正则表达式
  3. wxWidgets:库LIB清单
  4. 2. Mysql数据库的入门知识
  5. php long2ip,php 中IPV6 ip2long的问题解决办法
  6. android屏幕适配流程,Android屏幕适配姿势
  7. Hystrix面试 - 基于本地缓存的 fallback 降级机制
  8. C++ unsigned long 转化为 unsigned char*
  9. SQL Server Alwayson概念总结
  10. CleanMyMac偏好设置你知道多少?
  11. vs 配置 .pdb
  12. 用BT3和spoonwep2研究学习WEP密码…
  13. 测试ai模糊软件,“马赛克”视频能被AI软件彻底还原?测试结果出乎意料!
  14. 爬虫CASE01:反爬策略之使用随机user-agent模拟浏览器的网页爬取
  15. 去除xp系统计算机多余的系统,WinXP电脑如何清理垃圾?
  16. chrome浏览器更新后重新安装配置chromedriver
  17. 【Nodejs】732- 我为 Express 开了外挂
  18. Unity 视频编码器问题解决方案(视频卡顿,花屏,黑屏)
  19. 【智能驾驶】汽车智能化行业深度报告
  20. intouch报表数据的获取

热门文章

  1. 错误:“Cannot load JDBC driver class ‘com.mysql.jdbc.Driver”的解决方法
  2. Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?
  3. 解决虚拟机 Virtualbox 中 linux 共享文件夹只读问题
  4. 【解决】Word 在试图打开文件时遇到错误 请尝试下列方法:* xxx * xxx * xxx
  5. ORACLE 存储过程异常捕获并抛出
  6. Android消息推送完美解决方案全析
  7. 【Airtest】Airtest中swipe方法兼容不同分辨率的解决方法
  8. 多行字符串,带有多余的空格(保留缩进)
  9. Rails 4:如何使用带有turbo-links的$(document).ready()
  10. 如何从命令行重新加载.bash_profile?