通过poi-tl 模板 生成word文档

<!--        word-->
        <dependency>
            <groupId>com.deepoove</groupId>
            <artifactId>poi-tl</artifactId>
            <version>1.10.0-beta</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>4.1.2</version>
        </dependency>
import cn.hutool.core.util.StrUtil;
import com.deepoove.poi.render.compute.EnvModel;
import com.deepoove.poi.render.compute.RenderDataCompute;
import com.deepoove.poi.render.compute.SpELRenderDataCompute;
import lombok.extern.slf4j.Slf4j;

import java.util.Map;

/**
 * 全局参数
 * global开始的变量将直接使用全局参数
 * @author liaozesong
 */
@Slf4j
public class GlobalSpELRenderDataCompute implements RenderDataCompute {
    private final SpELRenderDataCompute spELRenderDataCompute;
    private final Map<String, Object> map;
    public static final String GLOBAL = "global.";

    public GlobalSpELRenderDataCompute(EnvModel model, Map<String, Object> global) {
        this.spELRenderDataCompute = new SpELRenderDataCompute(model);
        this.map = global;
    }

    @Override
    public Object compute(String el) {
        if (StrUtil.startWith(el, GLOBAL)) {
            if(null==map){
                return null;
            }
            return map.get(StrUtil.removePrefix(el, GLOBAL));
        }
        return spELRenderDataCompute.compute(el);
    }
}

import cn.hutool.core.collection.CollUtil;
import com.deepoove.poi.plugin.table.LoopRowTableRenderPolicy;
import com.deepoove.poi.util.TableTools;
import org.apache.poi.xwpf.usermodel.XWPFTable;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

/**
 * @author liaozesong
 */
public class MergeGroupTablePolicy extends LoopRowTableRenderPolicy {
    @Override
    protected void afterloop(XWPFTable table, Object data) {
        List<IntroductionList> list = (List<IntroductionList>) data;
        List<List<IntroductionList>> group = CollUtil.groupByField(list, "groupHidden");
        int index = 1;
        for (List<IntroductionList> statistics : group) {
            int size = statistics.size();
            int to = index + size - 1;
            if (index < to) {
                TableTools.mergeCellsVertically(table, 0, index, to);
                index = index + size;
            }
        }
    }

    public List<? extends Group> hiddenGroup(List<? extends Group> list) {
        HashMap<String, Object> tmpMap = new HashMap<>();
        for (Group tmp : list) {
            String group = tmp.getGroup();
            tmp.setGroupHidden(group);
            if (tmpMap.containsKey(group)) {
                tmp.setGroup(null);
            }
            tmpMap.put(group, null);
        }
        return list;
    }
}

 protected byte[] toWord(Introduction introduction, List<?> geoDefect, List<?> imgDefect, ClassPathResource resource) {
        InputStream stream = null;
        byte[] result = null;
        ByteArrayOutputStream byteArrayOutputStream = null;
        XWPFTemplate template = null;
        try {
            stream = resource.getStream();
            byteArrayOutputStream = new ByteArrayOutputStream();
            RenderPolicy policy = new LoopRowTableRenderPolicy();
            MergeGroupTablePolicy mergeGroupTablePolicy = new MergeGroupTablePolicy();
            List<? extends Group> groups = mergeGroupTablePolicy.hiddenGroup(introduction.getList());
            introduction.setList(groups);

            Configure config = Configure.builder()
                    .bind("one", policy)
                    .bind("two", policy)
                    .bind("three", policy)
                    .bind("introduction.list", mergeGroupTablePolicy)
                    .useSpringEL()
                    .setRenderDataComputeFactory(a -> new GlobalSpELRenderDataCompute(a, new HashMap<>(2) {{
                        put("domain", selectPoleStr());
                        put("domainStr", selectDomainStr());
                    }}))
                    .build();

            template = XWPFTemplate.compile(stream, config).render(
                    new HashMap<String, Object>(3) {{
                        put("introduction", introduction);
                        put("geoDefect", geoDefect);
                        put("imgDefect", imgDefect);
                    }});

            template.write(byteArrayOutputStream);
            result = byteArrayOutputStream.toByteArray();
        } catch (IOException e) {
            Assert.isTrue(false, e.getMessage());
        } finally {
            IoUtil.close(stream);
            IoUtil.close(template);
            IoUtil.close(byteArrayOutputStream);
        }
        return result;
    }

版权声明:本文为weixin_35928208原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。