XDocReport Tools
链接: https://pan.baidu.com/s/1ot-dQ_e1cM-CT5IGiZHajQ 提取码: 9f9i
解压后会看到三个文件夹
- bin
- lib
- macro
Java Project quickstart
Create xdocreport-quickstart-docx
把lib文件夹中的jar粘贴到项目中,并添加引用。
Model
public class Project {
private final String name;
public Project(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
public class Developer {
private final String name;
private final String lastName;
private final String mail;
private final IImageProvider logo;
public Developer(String name, String lastName, String mail, IImageProvider logo) {
this.name = name;
this.lastName = lastName;
this.mail = mail;
this.logo = logo;
}
public String getName() {
return name;
}
public IImageProvider getLogo() {
return logo;
}
public String getLastName() {
return lastName;
}
public String getMail() {
return mail;
}
}
Generate XML fields
public class GenerateXMLFields {
public static void main(String[] args) throws XDocReportException, IOException {
FieldsMetadata fieldsMetadata = new FieldsMetadata(TemplateEngineKind.Velocity.name());
fieldsMetadata.load("project", Project.class);
fieldsMetadata.load("developers", Developer.class, true);
File xmlFieldsFile = new File("project.fields.xml");
fieldsMetadata.saveXML(new FileOutputStream(xmlFieldsFile), true);
}
}
执行之后会得到project.fields.xml文件,内容如下
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<fields templateEngineKind="Velocity" >
<description><![CDATA[]]></description>
<field name="project.Name" list="false" imageName="" syntaxKind="">
<description><![CDATA[]]></description>
</field>
<field name="developers.LastName" list="true" imageName="" syntaxKind="">
<description><![CDATA[]]></description>
</field>
<field name="developers.Logo" list="true" imageName="developers.Logo" syntaxKind="">
<description><![CDATA[]]></description>
</field>
<field name="developers.Mail" list="true" imageName="" syntaxKind="">
<description><![CDATA[]]></description>
</field>
<field name="developers.Name" list="true" imageName="" syntaxKind="">
<description><![CDATA[]]></description>
</field>
</fields>
XDocReport.dotm
运行macro文件夹中的XDocReport.dotm

XDocReport选项,现在使用这个来设置word模板

XML Fields中选择project.fields.xml所在的目录


此时已经完成了一个简单的模板配置,保存到项目目录中(project.docx)。
GenerateDocxReport
public class GenerateDocxReport {
public static void main(String[] args) throws IOException, XDocReportException {
InputStream in = GenerateDocxReport.class.getResourceAsStream("project.docx");
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);
FieldsMetadata fieldsMetadata = report.createFieldsMetadata();
fieldsMetadata.load("project", Project.class);
IContext context = report.createContext();
Project project = new Project("ProjectName");
context.put("project", project);
OutputStream out = new FileOutputStream(new File("project_out.docx"));
report.process(context, out);
}
}
运行后可在项目目录中看到project_out.docx,没有错误的话会看到如下图

Table
如果想要生成Table,我们只需在word模板中插入一个表格,在单元格中标记对应的字段即可,如下图

public class GenerateDocxReport {
public static void main(String[] args) throws IOException, XDocReportException {
InputStream in = GenerateDocxReport.class.getResourceAsStream("project.docx");
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in,TemplateEngineKind.Velocity);
fieldsMetadata.load("project", Project.class);
IImageProvider logo = new ClassPathImageProvider(GenerateDocxReport.class, "img/logo.png");
fieldsMetadata.load("developers", Developer.class, true);
fieldsMetadata.addFieldAsList("developers.Name");
fieldsMetadata.addFieldAsList("developers.LastName");
fieldsMetadata.addFieldAsList("developers.Mail");
IContext context = report.createContext();
Project project = new Project("ProjectName");
context.put("project", project);
List<Developer> developers = new ArrayList<Developer>();
developers .add(new Developer("ZERR", "Angelo", "angelo.zerr@gmail.com", logo));
developers.add(new Developer("Leclercq", "Pascal","pascal.leclercq@gmail.com", logo));
developers.add(new Developer("Leclercq", "Pascal", "pascal.leclercq@gmail.com", logo));
context.put("developers", developers);
OutputStream out = new FileOutputStream(new File( "project_out.docx"));
report.process(context, out);
}
}
fieldsMetadata.addFieldAsList('')//标记该字段是在列表中展示
运行结果如下

Image
图片需要在模板中插入图片模板,并且配合书签一起使用,可插入任何图片做模板。。
WordTemplate

在模板中插入图片,并且选中图片在图片上插入书签,和实体类的属性保持一致,一定要在图片上插入书签。
Code
public class GenerateImgReport {
public static void main(String[] args) throws IOException, XDocReportException {
InputStream in = GenerateImgReport.class.getResourceAsStream("project.docx");
IXDocReport report = XDocReportRegistry.getRegistry().loadReport(in, TemplateEngineKind.Velocity);
FieldsMetadata metadata = new FieldsMetadata();
metadata.addFieldAsImage("avatar");//注册图片所在的书签
report.setFieldsMetadata(metadata);
metadata.load("developers", Developer.class, true);
metadata.addFieldAsList("developers.Name");
metadata.addFieldAsList("developers.LastName");
metadata.addFieldAsList("developers.Mail");
metadata.addFieldAsList("developers.logo");
IContext context = report.createContext();
Project project = new Project("XDocReport");
context.put("project", project);
File img=new File("C:\\Users\\admin\\Desktop\\echart-demo\\a.png");
IImageProvider avatar = new FileImageProvider( img);
context.put("avatar", avatar); //图片
List<Developer> developers = new ArrayList<Developer>();
developers .add(new Developer("ZERR", "Angelo", "angelo.zerr@gmail.com", avatar));
developers.add(new Developer("Leclercq", "Pascal","pascal.leclercq@gmail.com", avatar));
developers.add(new Developer("Leclercq123", "Pascal","pascal.leclercq@gmail.com", avatar));
developers.add(new Developer("Leclercq435", "Pascal","pascal.leclercq@gmail.com", avatar));
context.put("developers", developers);
OutputStream out = new FileOutputStream(new File("project_out.docx"));
report.process(context, out);
}}
列表中插入图片也可按照这种方式,上面代码也可实现,
developers对象中也有图片显示。
Insert List


保持模板之后再次执行代码
