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

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

效果图

因为测试数据是重复的,所以显示都是重复的数据,替换导入map中的数据可以显示不重复的数据。
spring使用freemarker生成word文档包含表格、图片(循环插入)_第1张图片

操作步骤

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









<#list resultpiclist as resultpic>



${resultpic.pic}




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


    org.freemarker
    freemarker
    2.3.23

实现代码:

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 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> pic = new ArrayList<>();
        for (int i = 1; i <5; i++) {
            Map 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> resultpic = new ArrayList<>();
        for (int i = 1; i < 6; i++) {
                Map pic1 = new HashMap<>();
                pic1.put("pic", getImgStr("src/main/resources/pic/3.jpg"));
                pic1.put("name",i+".jpeg");
            resultpic.add(pic1);
        }

        Map dataMap = new HashMap();
        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");
    }
}

你可能感兴趣的:(JAVA)