poi-tl word模版生成、动态表格、坑点合集

一、配置

1、导入依赖

  
            com.deepoove
            poi-tl
            1.10.0
   

apache poi版本要对应 

 
            org.apache.poi
            poi
            4.1.2


            org.apache.poi
            poi-ooxml
            4.1.2



            org.apache.poi
            poi-ooxml-schemas
            4.1.2

2、模版存放问题

(1)如果你的模版存放在你c盘之类的,是不用再去配置maven文件

(2)如果你的是要发布到inux的spring项目,或者为了可用性,将模版存放在resource文件夹下面,这个时候就要配置maven文件,因为打jar包的时候,会将你的word文件默认压缩,通过maven构建文件不对后缀docx的文件压缩过滤,这样文件打包之后就不会损坏

    
        
            
                org.apache.maven.plugins
                2.6
                maven-resources-plugin
                
                    UTF-8
                    
                        docx
                    
                
            

         
     

二、案例

1、普通模版

新建一个word文档,{{}}这种格式,里面放替换的字母,将map集合替换内容设置好,交给poi-tl渲染。

word模版

poi-tl word模版生成、动态表格、坑点合集_第1张图片

以下就是普通模版生成的三个方法,其中一个为主方法,调用生成。如果需要字节流转成mutipartfile需要导入mock依赖

        
            org.springframework
            spring-mock
            2.0.8
        
public class WordTemplateUtils {  


    public static void main(String[] args) {
        Map templateMap = new HashMap<>();
        templateMap.put("Year", "2023年");
        templateMap.put("HqCompany","测试名单");
        exportWord(templateMap);
    }


/**
     * 生成word模版
     *
     * @param data
     * @return
     */
    public static MultipartFile exportWord(Map data) {
        MultipartFile multipartFile = null;
        ByteArrayOutputStream ostream = null;
        XWPFTemplate template = null;
        try {
            //获取模板
            template = getWordTemplate(data);
            ostream = new ByteArrayOutputStream();
            // 将模板输出到字节流
            template.write(ostream);//这里还有一个方法是template.writeToFile("");可以直接填写本地文件路径
            byte[] fileBytes = ostream.toByteArray();
            String newFileName = "测试" + data.get("Year") + "年生成文件.docx";
            //转成可上传的文件(作者这里是为了上传到服务器转换成mutipartFile)
            multipartFile = new MockMultipartFile(newFileName, newFileName,
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileBytes);
        } catch (IOException e) {
            log.error("模版1导出异常");
        } finally {
            //关闭流
            IOUtils.close(ostream);
            IOUtils.close(template);
        }
        return multipartFile;
    }

    /**
     * 获取普通word模版渲染
     *
     * @param data
     * @return
     * @throws IOException
     */
    private static XWPFTemplate getWordTemplate(Map data) {
        //获取模板的输入流,读取resource里面的template文件夹里的word1.docx
        ClassPathResource tempFileResource = new ClassPathResource("template/" + "word1.docx");
        InputStream stream = null;
        try {
            stream = tempFileResource.getInputStream();
        } catch (IOException e) {
            log.error("获取模版失败!");
        }
        ConfigureBuilder builder = Configure.builder();
        builder.useSpringEL();
        XWPFTemplate template = XWPFTemplate.compile(stream, builder.build()).render(data);
        return template;
    }

}

2、带有表格的模版

word模版

poi-tl word模版生成、动态表格、坑点合集_第2张图片

 代码:

  public class WordTemplateUtils {
  /**
     * 生成word表格模版
     *
     * @param data
     * @return
     */
    public static MultipartFile exportWordTable(Map data) {
        //模板地址
        ClassPathResource tempFileResource = new ClassPathResource("template/" + "word2.docx");
        // 行循环实例
        LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
        //这里可以指定一个config类,用来指定一些规则,也可以改变模板中{{}}的这种格式
        MultipartFile multipartFile = null;
        XWPFTemplate compile = null;
        File file = null;
        ByteArrayOutputStream ostream = null;
        try {
            //lists绑定对象
            Configure config = Configure.builder()
                    .bind("lists", policy).build();
            compile = XWPFTemplate.compile(tempFileResource.getInputStream(), config);
            compile.render(data);
            ostream = new ByteArrayOutputStream();
            compile.write(ostream);
            byte[] fileBytes = ostream.toByteArray();
            String newFileName = "测试" + data.get("Year") + "年企业名单.docx";
            multipartFile = new MockMultipartFile(newFileName, newFileName,
                    "application/vnd.openxmlformats-officedocument.wordprocessingml.document", fileBytes);
        } catch (IOException e) {
            log.error("模版导出失败");
        } finally {
            IOUtils.close(ostream);
            IOUtils.close(compile);
        }
        return multipartFile;
    }


    public static void main(String[] args) {
        Map templateMap = new HashMap<>();
        //建立公司对象集合
        List companyList=new ArrayList();
        Company company1=new Company();
        company1.setIndex(1);
        company1.setEnterpriseName("测试1");
        Company company2=new Company();
        company1.setIndex(2);
        company1.setEnterpriseName("测试2");
        companyList.add(company1);
        //放进模版集合
        templateMap.put("Year", "2023年");
        templateMap.put("lists","测试名单");
        exportWordTable(templateMap);
    }

}

你可能感兴趣的:(java,word)