• springboot 集成poi导出word


    使用ruoyi-前后端分离版本,根据word模板导出,包含表格和图片。

    一、创建模板

     列表使用{{}},文本使用[]

    二、引入依赖

           <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
            </dependency>
    
            <!-- Word工具 -->
            <dependency>
                <groupId>com.deepoove</groupId>
                <artifactId>poi-tl</artifactId>
                <version>1.10.0</version>
            </dependency>
    

      三、调用接口

     @PostMapping("/exportPic")
        public void groupExportPic(HttpServletResponse response, InfoGroup infoGroup)
        {
          //从数据库中获取数据,组成list
            groupService.groupExportPic(response,list);
        }
    

      四、WordUtil导出类

    package com.ruoyi.common.utils.poi;
    
    import com.deepoove.poi.XWPFTemplate;
    import com.deepoove.poi.config.Configure;
    import com.deepoove.poi.data.PictureRenderData;
    import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
    import com.deepoove.poi.policy.PictureRenderPolicy;
    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.*;
    import java.util.List;
    
    import com.ruoyi.common.core.domain.AjaxResult;
    import org.apache.poi.util.Units;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import javax.imageio.ImageIO;
    import javax.servlet.http.HttpServletResponse;
    
    import static com.deepoove.poi.data.PictureType.PNG;
    import static com.ruoyi.common.config.RuoYiConfig.getProfile;
    
    /**
     * Word导出方法
     */
    public class WordUtil {
        private static final Logger log = LoggerFactory.getLogger(WordUtil.class);
        /**
         * 导出群组信息图片
         * @param data 导出模板数据
         * @param response
         * @return
         * @throws Exception
         */
        public AjaxResult groupExportPic(HttpServletResponse response,List<Map<String, Object>> data) throws Exception {
            response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
            response.setCharacterEncoding("utf-8");
    
            Map<String, Object> datas = new HashMap<>();//传入word数据
            List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
            List<String> pictureTag = new ArrayList<>();//图片处理
            for (int i = 0; i < data.size(); i++) {
                Map<String, Object> detailMap = new HashMap<String, Object>();//将word中标签名的例和对应数据保存到map
                detailMap.put("groupName", data.get(i).get("groupName"));
                //添加图片
                BufferedImage image = ImageIO.read(new File(picPath));
                detailMap.put("photo", new PictureRenderData(100, 100, PNG, image));
                pictureTag.add("photo");//用于设置图片
                }
                list.add(detailMap);//将设置好的行保存到list集合中
            }
            //图片配置
            LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
            Configure config = Configure.builder().bind("lists", policy).build();//设置列表配置,如果有多个列表时需加.bind("list1", policy) 新列表配置即可
            for (String tag : pictureTag
            ) {
                config.customPolicy(tag, new PictureRenderPolicy());//设置图片,不然保存的是一串字符
            }
            datas.put("lists", list);        //将列表保存到渲染的map中
            //3.创建XWPFTemplate对象,并设置读取模板路径和要渲染的数据
            String inputFile = getProfile() + "\\template\\grouppic.docx";
            XWPFTemplate template = XWPFTemplate.compile(inputFile, config).render(datas);
            //compile(模板路径,对应的配置)方法是设置模板路径和模板配置的,如果不设置配置时可不传config
            //render(datas)方法是用来渲染数据,将准备好的map数据方进去渲染
            //4.模板的输出,用FileOutputStream输出流(可以输出到指定文件位置,也可以用ajax直接返回给浏览器下载)
            //FileOutputStream out = null;//创建文件输出流并指定位置
            try {
                //out = new FileOutputStream(getProfile() + "\\download\\groupPicOut.docx");
                //template.write(out);
                //out.flush();
                //out.close();
                template.write(response.getOutputStream());
                template.close();
                return AjaxResult.success("成功");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                return AjaxResult.error(e.getMessage());
            } catch (IOException e) {
                e.printStackTrace();
                return AjaxResult.error(e.getMessage());
            }
        }
    }

      五、导出页面调用,使用现成的导出方法

    this.download('test/group/exportPic', {
              ...this.queryParams
            }, `test.docx`)
    

      

  • 相关阅读:
    angular2监听页面大小变化
    angular如何引入公共JS
    angular使用Md5加密
    angular4模块中标签添加背景图
    angular使用sass的scss语法
    设置angular公共样式表
    更改angular的默认端口
    angular模拟web API
    RN与webview通讯
    shell通过ping检测整个网段IP的网络状态脚本
  • 原文地址:https://www.cnblogs.com/webttt/p/16379230.html
Copyright © 2020-2023  润新知