背景

本文将给大家带来如何导入数据到word文档中,固定传值和动态制作表格传值等。


依赖:

        <!-- word导出 --><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.7.3</version></dependency><!--  上面需要的依赖--><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.9.1</version></dependency>

创建word模板:

说明:{{ }} 这个是用来做占位符的,后续代码中替换值。

如果导出的数据是个集合list,那么在你的表格标题的第一个单元格输入{{list}}占位符,下面空白单位元是用来占位集合中元素key的,占位符是:[]  如图

代码实例:

public void getStandingBook(String activityId, HttpServletResponse response, HttpServletRequest request) {try {//获取文件流InputStream stream = getClass().getClassLoader().getResourceAsStream("static/word.docx");//获取临时文件File file = new File("static/word.docx");//将读取到的类容存储到临时文件中,后面就可以用这个临时文件访问了FileUtils.copyInputStreamToFile(stream, file);//这个时候再去获取证书的文件路径 就可以正常获取了String filePath = file.getAbsolutePath();QueryWrapper<TActivity> tActivityQueryWrapper = new QueryWrapper<>();tActivityQueryWrapper.eq("uuid", activityId);tActivityQueryWrapper.eq("status", "0");TActivity tActivity = tActivityService.getOne(tActivityQueryWrapper);if (tActivity == null) {throw new CustomException("导出失败,活动不存在!");}List<Map> detailList = new ArrayList<>();QueryWrapper<TActivityBudget> budgetQueryWrapper = new QueryWrapper<>();budgetQueryWrapper.eq("activity_id", tActivity.getUuid());budgetQueryWrapper.eq("status", "0");List<TActivityBudget> budgetList = activityBudgetService.list(budgetQueryWrapper);if (!CollectionUtils.isEmpty(budgetList)) {budgetList.forEach(x -> {Map map = new HashMap();map.put("feeName", x.getFeeName());map.put("purpose", x.getPurpose());map.put("price", x.getPrice());map.put("number", x.getNumber());map.put("totalPrice", x.getTotalPrice());map.put("remarks", x.getRemarks());detailList.add(map);});}QueryWrapper<TActivityProfessional> professionalQueryWrapper = new QueryWrapper<>();professionalQueryWrapper.eq("activity_id", tActivity.getUuid());professionalQueryWrapper.eq("status", "0");List<TActivityProfessional> professionalList = activityProfessionalService.list(professionalQueryWrapper);if (!CollectionUtils.isEmpty(professionalList)) {professionalList.forEach(x -> {Map map = new HashMap();map.put("feeName", x.getPersonName());map.put("purpose", "社会工作者/专业老师补贴");map.put("price", x.getPrice());map.put("number", "1");map.put("totalPrice", x.getPrice());map.put("remarks", x.getRemarks());detailList.add(map);});}if (detailList.size() == 0) {Map map = new HashMap();map.put("feeName", "");map.put("purpose", "");map.put("price", "");map.put("number", "");map.put("totalPrice", "");map.put("remarks", "");detailList.add(map);}//计算合计double totalNum = 0d;if (!CollectionUtils.isEmpty(detailList)) {totalNum = detailList.stream().mapToDouble(x -> Double.valueOf(x.get("totalPrice").toString())).sum();}log.info("合计:{}", totalNum);//处理图片String[] arr = tActivity.getActivityReviewUrl().split(",");List<Map> pic = new ArrayList<>();if (arr != null && arr.length > 0) {for (String str : arr) {File ff = aliyunCloudStorageService.getFileByUrl(str);BufferedImage bi = null;try {bi = ImageIO.read(ff);} catch (Exception e) {e.printStackTrace();}int width = bi.getWidth(); // 像素if (width > 500) {width = 500;}int height = bi.getHeight(); // 像素if (height > 500) {height = 500;}Map picMap = new HashMap();picMap.put("urlImg", Pictures.ofUrl(str, PictureType.JPEG).size(width, height).create());pic.add(picMap);System.out.println(str);bi.flush();}}//渲染表格HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind("detailList", policy).build();double finalTotalNum = totalNum;XWPFTemplate template = XWPFTemplate.compile(filePath, config).render(new HashMap<String, Object>() {{put("activityName", tActivity.getActivityName());put("activityBackground", tActivity.getActivityBackground());put("startTime", DateUtils.getStringDate(tActivity.getStartTime()));put("endTime", DateUtils.getStringDate(tActivity.getEndTime()));put("activityContent", tActivity.getActivityContent());put("distinctidName", tActivity.getDistinctidName());put("activityLimit", tActivity.getActivityLimit());put("organizer", tActivity.getOrganizer());put("nowDate", DateUtils.getStringDate(new Date()));put("totalNum", finalTotalNum);put("activityAddress", tActivity.getActivityAddress());put("activityReviewWeb", tActivity.getActivityReviewWeb());put("detailList", detailList);put("picList", pic);}});//=================生成文件保存在本地D盘某目录下=================//String temDir="D:/mimi/"+File.separator+"file/word/"; ;//生成临时文件存放地址//生成文件名Long time = new Date().getTime();// 生成的word格式String fileName = tActivity.getActivityName() + time + ".docx";System.out.println("文件名:" + fileName);//=================生成word到设置浏览默认下载地址=================//解决文件下载名称变为 ____下划线的BUG//针对IE或者以IE为内核的浏览器:String userAgent = request.getHeader("User-Agent");if (userAgent.contains("MSIE") || userAgent.contains("Trident")) {fileName = java.net.URLEncoder.encode(fileName, StandardCharsets.UTF_8.toString());} else {//非IE浏览器:fileName = new String(fileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.ISO_8859_1);// 设置强制下载不打开response.setContentType("application/force-download");// 设置文件名response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);response.setCharacterEncoding("UTF-8");OutputStream out = response.getOutputStream();template.write(out);out.flush();out.close();template.close();}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

重点代码在这里:

 //渲染表格HackLoopTableRenderPolicy policy = new HackLoopTableRenderPolicy();Configure config = Configure.newBuilder().bind("detailList", policy).build();double finalTotalNum = totalNum;XWPFTemplate template = XWPFTemplate.compile(filePath, config).render(new HashMap<String, Object>() {{put("activityName", tActivity.getActivityName());put("activityBackground", tActivity.getActivityBackground());put("startTime", DateUtils.getStringDate(tActivity.getStartTime()));put("endTime", DateUtils.getStringDate(tActivity.getEndTime()));put("activityContent", tActivity.getActivityContent());put("distinctidName", tActivity.getDistinctidName());put("activityLimit", tActivity.getActivityLimit());put("organizer", tActivity.getOrganizer());put("nowDate", DateUtils.getStringDate(new Date()));put("totalNum", finalTotalNum);put("activityAddress", tActivity.getActivityAddress());put("activityReviewWeb", tActivity.getActivityReviewWeb());put("detailList", detailList);put("picList", pic);}});

关于向word文档中插入多张图片:

代码:

 //处理图片String[] arr = tActivity.getActivityReviewUrl().split(",");List<Map> pic = new ArrayList<>();if (arr != null && arr.length > 0) {for (String str : arr) {//File ff = aliyunCloudStorageService.getFileByUrl(str);BufferedImage bi = null;try {bi = ImageIO.read(ff);} catch (Exception e) {e.printStackTrace();}//int width = bi.getWidth(); // 像素//if (width > 500) {//    width = 500;//}//int height = bi.getHeight(); // 像素//if (height > 500) {//    height = 500;//}Map picMap = new HashMap();picMap.put("urlImg", Pictures.ofUrl(str, PictureType.JPEG).size(width, height).create());pic.add(picMap);System.out.println(str);bi.flush();}}

文档中插入多张图片的占位符是:{{?picList}}{{@urlImg}}{{/picList}}    picList是你集合key  ,urlImg是集合内元素

导出结果:

Springboot 导出word,动态填充表格数据相关推荐

  1. Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题。

    Java实现根据Word模板填充表格数据(poi方式),以及doc和docx转PDF,最全最详细版本,解决外部引用jar在linux上报ClassNotFound的问题. 适用场景: 1.固定格式的W ...

  2. SpringBoot导出word模板并动态渲染数据

    导出word模板并动态渲染数据 一.需求介绍 背景:需要导出word模板的时候,有些数据是动态或者图片等不确定因素的时候.根据需求定制好的模板要求填充数据,那么这个时候就需要进行根据word模板进行动 ...

  3. freemarker模板导出word循环图片表格详细教程

    前言:表哥之前已经过一篇freemarker模板导出带表格word详细教程  freemarker模板导出带表格word详细教程_Java大表哥的博客-CSDN博客,为什么现在又要写一篇呢. 因为我这 ...

  4. poi导出word文件(带表格)

    poi导出word文件(带表格) 一.背景介绍 现有业务需求根据前端页面上所选的时间和列,来生成word表格,方便打印. 二.POM <dependency><groupId> ...

  5. POI导出word文件中表格合并方法(行合并,列合并)

    项目中遇到记录一下 POI导出word文件中表格合并方法(行合并,列合并) . // word表格跨列合并单元格//row 指定行.fromCell 开始列数.toCell 结束列数.public v ...

  6. js动态修改表格数据

    js动态修改表格数据 使用js在表格个内进行动态修改,需要再点击每一个td的时候在每个td里动态的添加一个input文本框 然后把input的样式设计一下与td的宽度和高度一致去掉input的内外边框 ...

  7. springboot中使用poi-tl导出word(包含表格合并单元格)实例

    一.背景 在业务开发过程中,遇到有需要生成包含表格的word文档,且一部分表格需要动态生成,且需要根据数据来合并单元格,最后呈现的方式如下图: 一开始想到的解决方案是通过freemarker来生成,但 ...

  8. SpringBoot整合Freemarker导出word文档表格

    freemarker模板里面的template.process()方法里传入的第一个参数Object类型,如果是一个实体类对象在模板上怎么进行渲染,将实体类的值取出 freemarker会调用Obje ...

  9. Java使用Poi实现导出Word段落以及表格,XWPFParagraph和XWPFRun详解,生成目录,生成折线图、柱状图、饼状图

    导出段落 public void exportSummarizeWord(HttpServletResponse response, Integer id) {Summarize summarize ...

最新文章

  1. B站资源推荐:复旦大学机器学习、深度学习公开课,附PDF课件下载
  2. C#中调用Windows API的要点【转载】
  3. 好想学python机器人_【Python成长之路】从零学GUI -- 制作智能聊天机器人
  4. SAP WebClient UI删除搜索条件的后台处理,以及max hit的处理逻辑
  5. php调用API支付接口(转自刘68)
  6. linux之分区的水深(标准分区方式)
  7. 初试hive-创建内表(最简单的表),load加载方式简介
  8. 元学习(Meta Learning)最全论文、视频、书籍资源整理
  9. 编译器对源代码的编译过程
  10. api 二次 开发 禅道_禅道 Rest API 开发
  11. 阿里二面:RocketMQ 消费失败了,怎么处理?
  12. Win10企业版激活
  13. 70多G的Kindle电子书合集
  14. php得到时间 毫秒数,php获取毫秒_php获取当前时间的毫秒数
  15. Laravel开发的小程序后台管理系统
  16. 惊魂一小时:全国域名解析首遭大规模污染
  17. matlab用已知二维数组做plot_Matlab二维数组及其应用
  18. HTML5+CSS+JS--前端入门级网页尝试
  19. 一文详解私募基金投资策略(8大类17小类)
  20. 轻松做性能测试,月入3万的主流测试工具 大 揭 秘

热门文章

  1. 微博推荐算法学习(Weibo Recommend Algolrithm)
  2. 佐藤ひろ美 - わたしのそらのいろ
  3. matlab将图片旋转的代码_我的MATLAB魔方新玩法:拼出任意图案!
  4. SSH远程控制与访问
  5. NLP领域可以投稿的期刊(2022整理)
  6. 【Vue】高级系列(五)Vue模块化实战-demo2-任务清单todoList
  7. 【机器学习】阿里云天池竞赛——工业蒸汽量预测(6)
  8. 【转】程序员面试揭秘之程序员靠什么途径去美国工作?
  9. Web标准概念--摘抄《CSS布局实录》
  10. iphone上app store切换国家和地区