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