XDocReport 简单使用

2,468 阅读3分钟

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

按照上述操作之后显示如下

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

其他

源码链接

实例代码