当前位置:   article > 正文

使用poi-tl实现图片批量导出到word模板_poi-tl 图片

poi-tl 图片

poi-tl工具附上:

        Poi-tl Documentation (deepoove.com)​​​​​​

引用:Maven

  1. <dependency>
  2. <groupId>com.deepoove</groupId>
  3. <artifactId>poi-tl</artifactId>
  4. <version>1.12.1</version>
  5. </dependency>

正文:

        在word模板中同时插入多张图片,我们使用的是区对块+图片标签的方式
        {{?photo}}{{@img}}{{/photo}}

格式:

  1. {
  2. "photo": [
  3. { "img": "xxx.jpeg" },
  4. { "img": "aaa.jpeg" },
  5. { "img": "bbb.jpeg" }
  6. ]
  7. }

实际代码:

  1. public String exportDataWord(ExportWordDateDto dto, LoginVo loginVo) {
  2. //1.1 查出模板 伪代码
  3. Document formWordTemplate = xxxserviceImpl.getDataTempale();
  4. //1.2 查出数据 键值对 伪代码
  5. Document document = xxxserviceImpl.getData();
  6. String url = null;
  7. //2.读出模板,这里的模板是一个url,可以跟换成本地地址
  8. if (ObjectUtil.isEmpty(formWordTemplate)) {
  9. return "没有找到导出word数据模板!";
  10. }
  11. if (ObjectUtil.isEmpty(document)) {
  12. return "当前表单没有数据,请先新增数据后在进行导出!";
  13. }
  14. //宽
  15. Integer imagesWide = formWordTemplate.getInteger("images_wide");
  16. //高
  17. Integer imagesHigh = formWordTemplate.getInteger("images_high");
  18. InputStream inputStream = null;
  19. ByteArrayInputStream byteArrayInputStream = null;
  20. ByteArrayOutputStream out = new ByteArrayOutputStream();
  21. ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
  22. try {
  23. //请求模板文件
  24. URL wordUrl = new URL(formWordTemplate.getString("word_url"));
  25. HttpURLConnection conn = (HttpURLConnection) wordUrl.openConnection();
  26. //设置超时间为3秒
  27. conn.setConnectTimeout(3 * 1000);
  28. //防止屏蔽程序抓取而返回403错误
  29. conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)");
  30. //得到输入流
  31. inputStream = conn.getInputStream();
  32. //图片字段 因为图片要做特殊处理,所以在设计模板的时候就把图片字段给提前拿出来了 这里就比如图片字段是 img
  33. String[] imagesFields = formWordTemplate.getString("images_fields").split(",");
  34. if (ObjectUtil.isNotEmpty(imagesFields)) {
  35. List<String> imagesFieldList = Arrays.asList(imagesFields);
  36. ArrayList<String> keyList = new ArrayList<>(document.keySet());
  37. // 创建渲染数据
  38. for (String key : keyList) {
  39. //区块对list
  40. List<Map<String, PictureRenderData>> list = new ArrayList<>();
  41. if (imagesFieldList.contains(key)) {
  42. Object o = document.get(key);
  43. URL imageUrl = null;
  44. //判断是否是list对象
  45. if (o instanceof List) {
  46. List<Document> documents = (List<Document>) o;
  47. //这里采用得是poi-tl得区块对方式实现得
  48. for (Document value : documents) {
  49. //区块对list属性值
  50. Map<String, PictureRenderData> map = new HashMap<>();
  51. imageUrl = new URL(value.getString("url"));
  52. HttpURLConnection urlConnection = (HttpURLConnection) imageUrl.openConnection();
  53. if (200 == urlConnection.getResponseCode()) {
  54. InputStream is = urlConnection.getInputStream();
  55. //PictureType.suggestFileType(value.getString("url"))根据连接获取后缀名 一定要指定类型,不然图片数据展示出不来
  56. map.put(key, Pictures.ofStream(is, PictureType.suggestFileType(value.getString("url"))).size(imagesWide, imagesHigh).create());
  57. list.add(map);
  58. }
  59. }
  60. } else {
  61. imageUrl = new URL(document.getString(key));
  62. HttpURLConnection urlConnection = (HttpURLConnection) imageUrl.openConnection();
  63. if (200 == urlConnection.getResponseCode()) {
  64. InputStream is = urlConnection.getInputStream();
  65. document.put(key, Pictures.ofStream(is, PictureType.suggestFileType(document.getString(key))).size(imagesWide, imagesHigh).create());
  66. }
  67. }
  68. //封装区对块得list外层对象 这里的phto就是word模板的图片的区对块标签
  69. document.put("photo", list);
  70. document.remove(key);
  71. }
  72. }
  73. }
  74. byteArrayInputStream = new ByteArrayInputStream(out.toByteArray());
  75. XWPFTemplate template = XWPFTemplate.compile(inputStream).render(document);
  76. template.write(outputStream);
  77. //上传文件流伪代码
  78. url = uploadFile(outputStream);
  79. } catch (Exception e) {
  80. e.printStackTrace();
  81. return ResponseVo.fail2("服务异常,导出失败!");
  82. } finally {
  83. try {
  84. if (ObjectUtil.isNotEmpty(inputStream)) {
  85. inputStream.close(); // 关闭输入流
  86. }
  87. if (ObjectUtil.isNotEmpty(byteArrayInputStream)) {
  88. byteArrayInputStream.close();
  89. }
  90. out.close();
  91. outputStream.close();
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. }
  96. //3.返回结果
  97. return url;
  98. }

运行结果:

        模板:

         实际内容:      

上面代码涉及到一些伪代码,根据自己的业务进行相应的修改就可以了,返回值建议返回对象。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/606835
推荐阅读
相关标签
  

闽ICP备14008679号