添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

XDocReport

XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法(Freemarker、Velocity)转换为另外一种格式文档(Doc、Docx、XHTML、PDF)。

XDocReport特性

XDocReport是模块化而且非常轻便(不需要在你的服务器安装MS Office、LiberOffice)。你可以选择要管理的XML类型文档(docx、odt…)和选择熟悉的模板引擎(Freemarker、Velocity)组合使用。

  1. 支持OpenOffice、MS Word格式。
  2. 默认支持Freemarker、Velocity语法,也可以自己扩展语法。
  3. 支持报告生成的调试过程。
  4. 支持表格循环遍历。
  5. 支持动态图像替换。
  6. 在OSGI环境中管理XDcoReport。
  7. 支持格式转换器,默认支持的转换器(ODT 2 PDF、Docx 2 PDF).
  8. 支持实现自己的模板引擎。默认情况下实现了FreeMarker、Velocity。
  9. 支持转换器扩展。默认实现了ODT 2 PDF(通过ODFDOM+iText)、Docx 2 PDF(通过POI+iText)。

工具类封装

package org.leaf.word.xdocreport;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.document.registry.XDocReportRegistry;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.TemplateEngineKind;
import java.io.FileInputStream;
import java.io.IOException;
public class WordUtils {
    public static ExportData getExportData(String url) throws IOException, XDocReportException {
        final IXDocReport report = createReport(url);
        final IContext context = report.createContext();
        return new ExportData(report, context);
    private static IXDocReport createReport(String url) throws IOException, XDocReportException {
        final FileInputStream fileInputStream = new FileInputStream(url);
        return XDocReportRegistry.getRegistry().loadReport(fileInputStream, TemplateEngineKind.Freemarker);
package org.leaf.word.xdocreport;
import fr.opensagres.xdocreport.core.XDocReportException;
import fr.opensagres.xdocreport.document.IXDocReport;
import fr.opensagres.xdocreport.template.IContext;
import fr.opensagres.xdocreport.template.formatter.FieldsMetadata;
import java.io.IOException;
import java.io.OutputStream;
public class ExportData {
    private IXDocReport report;
    private IContext context;
    public ExportData(IXDocReport report, IContext context) {
        this.report = report;
        this.context = context;
    public void process(OutputStream out) throws IOException, XDocReportException {
        report.process(context, out);
    public void setData(String key, Object value) {
        FieldsMetadata fieldsMetadata = report.getFieldsMetadata();
        fieldsMetadata = fieldsMetadata == null ? new FieldsMetadata() : fieldsMetadata;
        fieldsMetadata.addFieldAsList(key);
        context.put(key, value);
 
  1. 创建ODTHelloWordWithVelocity.docx文档,输入内容Hello ${name}。
  2. ${name}设置步骤
    1. Ctrl + F9,选择邮件合并类型,输入"${name}"

Maven

<!--org.leaf.word.to.pdf.aspose-->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/xdocreport -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>xdocreport</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/fr.opensagres.xdocreport.document.docx -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/fr.opensagres.xdocreport.template -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/fr.opensagres.xdocreport.template -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.document</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/fr.opensagres.xdocreport.template -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.core</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/fr.opensagres.xdocreport/fr.opensagres.xdocreport.template -->
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.converter</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.converter.docx.xwpf</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
        <dependency>
            <groupId>fr.opensagres.xdocreport</groupId>
            <artifactId>fr.opensagres.xdocreport.template.velocity</artifactId>
            <version>${xdocreport.version}</version>
        </dependency>
    </dependencies>
    public static void main(String[] args) throws IOException, XDocReportException {
        final ExportData exportData = WordUtils.getExportData("F:\\idea-workspace\\my_source\\word-document\\src\\main\\resources\\xdocreport\\ODTHelloWordWithVelocity.docx");
        exportData.setData("name", "world");
        exportData.process(new FileOutputStream("F:\\idea-workspace\\my_source\\word-document\\src\\main\\resources\\xdocreport\\ODTHelloWordWithVelocity_out.docx"));

普通域对象

图片对象的设置使用书签设置
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

package org.leaf.word.xdocreport;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import fr.opensagres.xdocreport.core.XDocReportException;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
public class Demo1 {
    public static void main(String[] args) throws IOException, XDocReportException {
        final ExportData exportData = WordUtils.getExportData("F:\\idea-workspace\\my_source\\word-document\\src\\main\\resources\\xdocreport\\ODTHelloWordWithVelocity.docx");
        exportData.setData("data", readJSON());
        exportData.process(new FileOutputStream("F:\\idea-workspace\\my_source\\word-document\\src\\main\\resources\\xdocreport\\ODTHelloWordWithVelocity_out.docx"));
    public static JSONObject readJSON() throws IOException {
        ObjectMapper mapper = new ObjectMapper();
        return mapper.readValue(new File("F:\\idea-workspace\\my_source\\word-document\\src\\main\\resources\\xdocreport\\xdocreport.json"), JSONObject.class);
  "userName": "张三",
  "applyDate": "2022-12-12",
  "applyDetail": [
      "sqxm": "北京出差",
      "sqje": 123458.695,
      "sxmx": "住宿",
      "sqr": "张三",
      "sqrq": "2022-12-26"
      "sqxm": "北京出差",
      "sqje": 1238.695,
      "sxmx": "路费",
      "sqr": "张三",
      "sqrq": "2022-12-26"
      "sqxm": "北京出差",
      "sqje": 128.695,
      "sxmx": "吃饭",
      "sqr": "张三",
      "sqrq": "2022-12-26"
  "list": ["1、飞机票", "2、电影票", "3、住宿发票"]
 

普通文本使用${}

条件使用[#if condition] [/#if]

表格使用@before-row[#list data as d]和@after-row[/#list]表示遍历的开始和结束,文本的输入和普通文本一样

列表遍历使用[#list data.list as l]开始和[/#list]结束

XDocReport是GitHub上根据麻省理工学院许可证开源的Wrod导出框架。XDocReport可以根据ODT、Doc、Docx文档模板通过模板引擎语法(Freemarker、Velocity)转换为另外一种格式文档(Doc、Docx、XHTML、PDF)。
(一)xdocreport能做什么? 1.xdocreport是一个java api,它能够根据ms office(docx或者ppt)以及open office的odt创建的xml文档模板,与java模型一起配合生成你想要的docx或者odt文档报告。 2.同时你可以把生成的docx或者odt文档转换你想要的其它格式,例如pdf,xhtml等。 所以我们可...
如果你要先问我为什么要导出word?那么请你走开,你个杠精! 在完成这个功能时花费了大量的时间查阅资料,发现能满足导出复杂word文档的工具只有xdocreport,如果有其他的工具欢迎分享。废话不多说,上菜! 一、导入包 <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>fr.opensagres.xdocrep.
XDocReport介绍初步了解XDocReport适用范围源码地址模板引擎一个填充的简单例子需求设计设计填充模板最终效果图填充字段设置我对填充字段的理解图片填充设置代码编写maven依赖填充类模板加载设置域模拟填充数据开始填充测试结果更多内容... 初步了解XDocReport XDocReport是一个用来进行文档填充和文档格式转换的java api。在一些项目中,我们可能需要对一份...
java freemarker + word 模板 生成 word 文档 (变量替换,数据的循环,表格数据的循环,以及图片的替换) 1,最近有个需求,动态生成 Word 文当并供前端下载,网上找了一下,发现基本都是用 word 生成 xml 然后用模板替换变量的方式 1.1,这种方式虽然可行,但是生成的 xml 是在是太乱了,整理就得整理半天,而且一旦要修改模板,那简直就是灾难,而且据说还不兼容 WPS 1.2,所以笔者找到了以下可以直接用 word 文档作为模板的方法,这里做以下笔记,以下代码依赖于