Java 使用 XDocReport 导出 word 包含图片表格的处理

Java 使用 XDocReport 导出word

前言

遇到word中,表格中每一个单元格图片需要遍历插入多张图片的问题,word模板制作也ok,但是遍历不展示,
主要是图片和表格都需要遍历,所以需要加标记,下面做一下两者的区别和实际展示的效果

首先根据制作word模板,绘制自己想要的样式,然后在需要动态生成的地方设置编辑域
(快捷键: ctrl + F9) ,右击可以修改编辑域的内容, 如图:
在这里插入图片描述
在这里插入图片描述

多张图片时需要 @before-row 和 @after-row 来制定最外层的list 循环

遍历一个加了 @before-row[#list data as h1] .... .....  @after-row[/#list]  
图片用书签定义的时候,同一个文件需要把每个key值唯一,如图:pic1,pic2 

在这里插入图片描述

实体类:
import lombok.Data;

import java.util.List;

/**
 * 模板中excel的内容
 */
@Data
public class XDocExportVo1 {

    // 描述1
    private String hiddenDescribe;

    // 描述2
    private String reformDescribe;

    // 调整前照片
    private List<PicVo> hiddenPics;

    // 调整后照片
    private List<PicVo> reformPics;

}

import fr.opensagres.xdocreport.document.images.IImageProvider;
import lombok.Data;

@Data
public class PicVo {
    // 模板中需要的图片
    private IImageProvider pic;
}
测试类:

import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.images.FileImageProvider;
import fr.opensagres.xdocreport.document.images.IImageProvider;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import fr.opensagres.xdocreport.template.formatter.NullImageBehaviour;
import vo.PicVo;
import vo.XDocExportVo1;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class TestXDocExport {
    public static void main(String[] args) throws Exception {
        export();
    }

    //实现类
    public static void export() throws Exception {
        //1.通过freemarker模板引擎加载文档,并缓存到registry中
        InputStream in = new FileInputStream("F:\\test_path\\model\\xDocExportModel1.docx");
//        InputStream in = TestXDocExport.class.getResourceAsStream("/templates/xDocExportModel1.docx");
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Freemarker);
        //2.设置填充字段、填充类以及是否为list。
        FieldsMetadata fieldsMetadata = report.createFieldsMetadata();
        // 文本
        IContext context = report.createContext();
        context.put("title1", "导出样式1");
        context.put("time1", "2023-05-16");

        /** *******************设置表格内容数据 BEGIN **************** */
        List<XDocExportVo1> list = new ArrayList<>();
        // 第一行数据
        XDocExportVo1 docExportVo1 = new XDocExportVo1();
        docExportVo1.setHiddenDescribe("调整前1");
        docExportVo1.setReformDescribe("调整后1");
        // 图片数据
        List<PicVo> picVos = new ArrayList<>();
        // 用本地的图片做一下测试,实际用途中需要根据自己的项目地址来
        IImageProvider p = new FileImageProvider(new File("F:\\test_path\\cat001.jpg"));
        // 设置图片的大小
        // p.setSize(30f,40f);
        PicVo picVo = new PicVo();
        picVo.setPic(p);
        picVos.add(picVo);

        IImageProvider p1 = new FileImageProvider(new File("F:\\test_path\\cat002.jpg"));
        PicVo picVo1 = new PicVo();
        picVo1.setPic(p1);
        picVos.add(picVo1);
        docExportVo1.setHiddenPics(picVos);

        List<PicVo> picVos2 = new ArrayList<>();
        IImageProvider p3 = new FileImageProvider(new File("F:\\test_path\\xiaomaomi1.jpeg"));
        PicVo picVo2 = new PicVo();
        picVo2.setPic(p3);
        picVos2.add(picVo2);

        IImageProvider p4 = new FileImageProvider(new File("F:\\test_path\\xiaomaomi2.jpeg"));
        PicVo picVo3 = new PicVo();
        picVo3.setPic(p4);
        picVos2.add(picVo3);
        docExportVo1.setReformPics(picVos2);
        list.add(docExportVo1);

        // 第二行数据(这里就简单点写了)
        XDocExportVo1 docExportVo2 = new XDocExportVo1();
        docExportVo2.setHiddenDescribe("调整前2");
        docExportVo2.setReformDescribe("调整后2");
        docExportVo2.setHiddenPics(picVos2);
        docExportVo2.setReformPics(picVos);
        list.add(docExportVo2);

        /** *******************设置表格内容数据 END **************** */
        // 设置表格数据
        context.put("data", list);
        // 设置list的数据来源模型
        fieldsMetadata.load("data",XDocExportVo1.class,true);

        //特殊字符
        fieldsMetadata.addFieldAsImage("pic1","list1.pic", NullImageBehaviour.RemoveImageTemplate);
        fieldsMetadata.addFieldAsImage("pic2","list2.pic", NullImageBehaviour.RemoveImageTemplate);

        OutputStream out = new FileOutputStream(new File("F:\\test_path\\model\\xDocExportModel1_out.docx"));
        report.setFieldsMetadata(fieldsMetadata);
        report.process(context, out);
        out.close();
    }
}

模板和导出效果

在这里插入图片描述

在这里插入图片描述

如果是单张图片

模板相对简单点,直接上代码

import fr.opensagres.xdocreport.document.images.IImageProvider;
import lombok.Data;

import java.util.List;

/**
 * 模板中excel的内容
 */
@Data
public class XDocExportVo2 {

    // 描述1
    private String hiddenDescribe;

    // 描述2
    private String reformDescribe;

    // 调整前照片
    private IImageProvider pic1;

    // 调整后照片
    private IImageProvider pic2;

}

import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.images.FileImageProvider;
import fr.opensagres.xdocreport.document.images.IImageProvider;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import fr.opensagres.xdocreport.template.formatter.NullImageBehaviour;
import vo.PicVo;
import vo.XDocExportVo1;
import vo.XDocExportVo2;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/**
 * 模板2测试
 */
public class TestXDocExport2 {
    public static void main(String[] args) throws Exception {
        export();
    }

    //实现类
    public static void export() throws Exception {
        //1.通过freemarker模板引擎加载文档,并缓存到registry中
        InputStream in = TestXDocExport.class.getResourceAsStream("/templates/xDocExportModel2.docx");
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Freemarker);
        //2.设置填充字段、填充类以及是否为list。
        FieldsMetadata fieldsMetadata = report.createFieldsMetadata();
        // 文本
        IContext context = report.createContext();
        context.put("title1", "导出样式1");
        context.put("time1", "2023-05-16");

        /** *******************设置表格内容数据 BEGIN **************** */
        List<XDocExportVo2> list = new ArrayList<>();
        // 第一行数据
        XDocExportVo2 docExportVo1 = new XDocExportVo2();
        docExportVo1.setHiddenDescribe("调整前1");
        docExportVo1.setReformDescribe("调整后1");
        // 图片数据
        // 用本地的图片做一下测试,实际用途中需要根据自己的项目地址来
        IImageProvider p = new FileImageProvider(new File("F:\\test_path\\cat001.jpg"));
        // 设置图片的大小
        // p.setSize(30f,40f);
        docExportVo1.setPic1(p);
        docExportVo1.setPic2(new FileImageProvider(new File("F:\\test_path\\cat002.jpg")));
        list.add(docExportVo1);

        // 第二行数据(这里就简单点写了)
        XDocExportVo2 docExportVo2 = new XDocExportVo2();
        docExportVo2.setHiddenDescribe("调整前2");
        docExportVo2.setReformDescribe("调整后2");

        docExportVo2.setPic1(new FileImageProvider(new File("F:\\test_path\\xiaomaomi1.jpeg")));
        docExportVo2.setPic2(new FileImageProvider(new File("F:\\test_path\\xiaomaomi2.jpeg")));
        list.add(docExportVo2);

        /** *******************设置表格内容数据 END **************** */

        // 模板2
        // 设置表格数据
        context.put("h1", list);
        // 设置list的数据来源模型
        fieldsMetadata.load("h1", XDocExportVo2.class,true);
        //特殊字符
        fieldsMetadata.addFieldAsImage("pic1","h1.pic1", NullImageBehaviour.RemoveImageTemplate);
        fieldsMetadata.addFieldAsImage("pic2","h1.pic2", NullImageBehaviour.RemoveImageTemplate);

        OutputStream out = new FileOutputStream(new File("F:\\test_path\\model\\xDocExportModel2_out2.docx"));
        report.setFieldsMetadata(fieldsMetadata);
        report.process(context, out);
        out.close();
    }
}

在这里插入图片描述
在这里插入图片描述
[写了一个demo,可以点击链接下载看看]
https://download.csdn.net/download/weixin_35332034/87789220

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
导出带有图片Word表格涉及到前端与后端的协作。下面是一个简单的实现步骤: 1. 前端使用JavaScript创建一个包含表格图片的HTML页面。表格可以使用HTML的table标签来构建,而图片则可以使用img标签来引用。为了将图片嵌入到表格,可以将图片转换为Base64编码。 2. 在前端页面使用JavaScript的Canvas API将图片渲染到Canvas元素上。首先,将图片加载到一个img元素,然后将img元素绘制到Canvas上。最后,使用Canvas的toDataURL方法将Canvas内容转换为Base64编码的图片数据。 3. 前端可以使用第三方库,如jsPDF或html-docx-js,将HTML内容导出Word文档。这些库提供了将HTML转换为Word文档的功能,支持表格图片导出。在导出Word文档时,可以将Base64编码的图片数据添加到Word文档,以使图片嵌入到文档。 4. 后端使用Java开发一个接口,接收前端发送的HTML内容和图片数据。后端可以使用Apache POI库操作Word文档,将接收到的HTML内容转换为Word表格,并将图片数据添加到Word文档。通过将图片数据以二进制形式插入到Word文档的方式,图片可以在Word文档正确显示。 5. 前端发送HTTP请求将HTML内容和图片数据发送到后端接口。可以使用AJAX或Fetch进行发送。 6. 后端接收到请求后,根据接收到的HTML内容和图片数据,使用Apache POI创建Word文档并将内容写入文档。 7. 后端将生成的Word文档返回给前端。 通过以上步骤,前端JS和后端Java可以实现导出带有图片Word表格。前端负责生成HTML内容和处理图片,并将数据发送到后端。而后端负责将HTML内容转换为Word文档,并将图片数据添加到文档
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值