spring使用freemarker生成word文档包含表格、图片(循环插入)

spring使用freemarker生成word文档包含表格、图片(循环插入)

效果图

因为测试数据是重复的,所以显示都是重复的数据,替换导入map中的数据可以显示不重复的数据。
在这里插入图片描述

操作步骤

1,创建一个word模板,需要循环的地方建议放在表格里面,图片也可以放在1*1的表格中,将需要替换的字段用"美元符号{字段名}"替换显示,图片需要先放入一张原始图片作为占位图片,可以对占位图片的大小进行调整,占位图片的大小就是后面显示图片的大小。
2,将word模板另存为xml文件,不要直接修改后缀名,同时建议是2003xml格式,之前用2013xml格式,导致图片的base64码是在标签中和图片的位置是在标签中,分别放在两个地方显示无法用循环。重点!!!!!
3,推荐用firstobject软件打开xml文件,点击工具选择缩进排版,可以将杂乱的xml排序显示,将之前定义的${字段名}中间出现的其它标签删除。将需要循环显示的地方用<#list></#list>标记
4,循环显示图片需要修改w:name和 src为动态图片名,不然会导致始终显示第一张图片。

<w:tbl>
<w:tblPr>
<w:tblW w:w="0" w:type="auto"/>
<w:tblLook w:val="04A0"/>
</w:tblPr>
<w:tblGrid>
<w:gridCol w:w="8522"/>
</w:tblGrid>
<#list resultpiclist as resultpic>
<w:tr wsp:rsidR="00B16C33" wsp:rsidTr="005C329D">
<w:tc><w:tcPr><w:tcW w:w="8522" w:type="dxa"/><w:shd w:val="clear" w:color="auto" w:fill="auto"/></w:tcPr>
<w:p wsp:rsidR="00B16C33" wsp:rsidRDefault="00B16C33"><w:r><w:pict>
<w:binData w:name="${"wordml://resultpic_"+resultpic_index+".jpg"}"  xml:space="preserve">${resultpic.pic}</w:binData>
<v:shape id="_x0000_i1026" type="#_x0000_t75" style="width:277.1pt;height:170pt">
<v:imagedata src="${"wordml://resultpic_"+resultpic_index+".jpg"}" o:title="2"/></v:shape></w:pict></w:r></w:p></w:tc></w:tr>
</#list>
</w:tbl>

5,将xml文件后缀名改为ftl后缀。
6,编写java实现代码:
添加依赖:

<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.23</version>
</dependency>

实现代码:

public class ExportWord {
    //图片编码转换BASE64
    public static String getImgStr(String path) throws Exception {
        InputStream in = null;
        byte[] data = null;
        in = new FileInputStream(path);
        data = new byte[in.available()];
        in.read(data);
        in.close();
        BASE64Encoder ecoder = new BASE64Encoder();
        return ecoder.encode(data);
    }

    //private static final String templateFolder = ExportWord.class.getClassLoader().getResource("../..").getPath()+"/ftl";
    private Configuration configuration = null;

    public ExportWord() {
        configuration = new Configuration();
        configuration.setDefaultEncoding("UTF-8");
    }

    public File createWord(Map<String, Object> dataMap, String hallName) throws Exception {
        Date date = new Date();

        configuration.setDirectoryForTemplateLoading(new File("src/main/resources"));
        Template t = null;
        try {
            t = configuration.getTemplate("archive7.ftl"); // 文件名
        } catch (IOException e) {
            e.printStackTrace();
        }
        File outFile = new File(hallName + date.getTime() + ".doc");
        Writer w = null;
        try {
            w = new OutputStreamWriter(new FileOutputStream(outFile), "utf-8");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        try {
            t.process(dataMap, w);
            w.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return outFile;

    }

    public static void main(String[] args) throws Exception {

        List<Map<String, Object>> pic = new ArrayList<>();
        for (int i = 1; i <5; i++) {
            Map<String, Object> picMap = new HashMap<>();
            picMap.put("id", "1");
            picMap.put("time", "201645254247");
            picMap.put("lnt", "114.252152");
            picMap.put("lat", "30.254562");
            pic.add(picMap);
        }


        List<Map<String, Object>> resultpic = new ArrayList<>();
        for (int i = 1; i < 6; i++) {
                Map<String, Object> pic1 = new HashMap<>();
                pic1.put("pic", getImgStr("src/main/resources/pic/3.jpg"));
                pic1.put("name",i+".jpeg");
            resultpic.add(pic1);
        }

        Map<String, Object> dataMap = new HashMap<String, Object>();
        dataMap.put("archive_name", "张三抢劫案");
        dataMap.put("case_name", "张三抢劫案20190926");
        dataMap.put("create_time", "20190924120324");
        dataMap.put("start_time", "20190924120324");
        dataMap.put("end_time", "20190924120324");
        dataMap.put("orgpic", getImgStr("src/main/resources/pic/1.jpg"));
        dataMap.put("piclist", pic);
        dataMap.put("resultpiclist", resultpic);
        ExportWord test = new ExportWord();
        test.createWord(dataMap, "E:/var");
    }
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页