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 exportPic(HttpServletResponse response, InfoGroup infoGroup)
    {
      //从数据库中获取数据,组成list
        groupService.exportPic(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 exportPic(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("name", data.get(i).get("name"));
            //添加图片
            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\\pic.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\\picOut.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/exportPic', {
          ...this.queryParams
        }, `test.docx`)

  

posted on 2022-06-15 17:29  七七2020  阅读(1902)  评论(0编辑  收藏  举报

导航