java使用 xdocreport,以 docx 模板方式进行 docx 文档的下载

gtihub 文档地址

  • https://github.com/opensagres/xdocreport/wiki

项目中引入依赖

<!-- xdocreport -->
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.core</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.document</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.template</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.document.docx</artifactId>
    <version>2.0.1</version>
</dependency>
<dependency>
    <groupId>fr.opensagres.xdocreport</groupId>
    <artifactId>fr.opensagres.xdocreport.template.freemarker</artifactId>
    <version>2.0.1</version>
</dependency>

控制层通过 HttpServletResponse 进行生成并调用

@RequestMapping(value = "/bdcdj/exportWord", method = RequestMethod.GET)
public void exportWord(@RequestParam(value = "countdate", required = false) String countdate, HttpServletResponse response) {
    InputStream inputStream = null;
    try {
        String msg = "";
        Map<String, Object> resultMap = new HashMap<>();
        resultMap.put("success", false);
        resultMap.put("data", null);
        resultMap.put("msg", msg);

        if (StringUtils.isBlank(countdate)) {
            resultMap.put("msg", "参数为空,禁止获取数据");
            throw new RuntimeException("参数为空,禁止获取数据");
        }
        String[] split = countdate.split("-");
        if (split.length != 2) {
            resultMap.put("msg", "参数格式异常,禁止获取数据");
            throw new RuntimeException("参数格式异常,禁止获取数据");
        }

        // 解析参数,获取年份和月份
        String year = split[0];
        String month = split[1];
        Map<String, List<String>> countData = (Map<String, List<String>>) yangLingCountService.getCountData(year, month);
        month = month.replace("0", "");

        // 导出word
        String file = AppConfig.getEgovHome() + "/conf/server/template/杨凌不动产登记信息导出模板.docx";
        if (StringUtils.startsWith(file, "file")) {
            file = StringUtils.substring(file, file.indexOf("/") + 1);
        }

        inputStream = new FileInputStream(new File(file));
        IXDocReport report = XDocReportRegistry.getRegistry().loadReport(inputStream, TemplateEngineKind.Freemarker);
        IContext context = report.createContext();

        context.put("year", year);
        context.put("month", month);

        Iterator<Map.Entry<String, List<String>>> iterator = countData.entrySet().iterator();
        while (iterator.hasNext()) {
            Map.Entry<String, List<String>> next = iterator.next();
            switch (next.getKey()) {
                case "table_1":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table1_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_2":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table2_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_5":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table5_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_6":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table6_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_7":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table7_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_8":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table8_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_9":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table9_" + i, next.getValue().get(i));
                    }
                    break;
                case "table_10":
                    for (int i = 0; i < next.getValue().size(); i++) {
                        context.put("table10_" + i, next.getValue().get(i));
                    }
                    break;
            }
        }

        context.put("test_content", "==测试内容==");

        response.setCharacterEncoding("utf-8");
        response.setContentType("application/msword");

        String fileName = "不动产登记信息统计表(月报)_" + System.currentTimeMillis() + ".docx";
        response.setHeader("Content-Disposition", "attachment;filename="
                .concat(String.valueOf(URLEncoder.encode(fileName, "UTF-8"))));

        report.process(context, response.getOutputStream());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (null != inputStream) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

模板内容

  • 通过 microsoft word 打开,WPS 慎用
  • 在你需要插入数据的地方,按 ctrl+f9
    在这里插入图片描述
  • 鼠标右键点击该区域,选择编辑域

在这里插入图片描述
在这里插入图片描述

  • 选择域名类型,填写域名的值。域名类型为:MergeField,域名格式为:${xxx}
    在这里插入图片描述
  • 点击确定保存
    在这里插入图片描述
  • 保存模板文档

代码内容

  • 通过 content 对象(Map<String,Object> 形式)将内容设置进去
    在这里插入图片描述

导出后的效果

在这里插入图片描述

您可以使用XDocReport和FreeMarker模板来生成带页数的Word文档。以下是一个示例代码: 1. 添加以下依赖项到您的项目中: ```xml <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>xdocreport</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>fr.opensagres.xdocreport</groupId> <artifactId>xdocreport-template-freemarker</artifactId> <version>1.0.6</version> </dependency> ``` 2. 创建一个FreeMarker模板,包含一个名为“page”的变量,用于显示当前页数。例如,以下是一个简单的模板: ``` <html> <head> <title>My Document</title> </head> <body> <p>Page ${page} of ${nbPages}</p> <p>This is the content of my document.</p> </body> </html> ``` 3. 在Java代码中使用XDocReport和FreeMarker模板来填充Word文档。以下是一个示例代码: ```java import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.util.HashMap; import java.util.Map; import org.apache.poi.xwpf.usermodel.XWPFDocument; import fr.opensagres.xdocreport.core.XDocReportException; import fr.opensagres.xdocreport.core.io.XOutputStream; import fr.opensagres.xdocreport.document.registry.XDocReportRegistry; import fr.opensagres.xdocreport.template.TemplateEngineKind; import fr.opensagres.xdocreport.template.formatter.FieldsMetadata; public class GenerateWordDoc { public static void main(String[] args) { try { // Load the template InputStream in = GenerateWordDoc.class.getResourceAsStream("template.docx"); XWPFDocument document = new XWPFDocument(in); FieldsMetadata metadata = new FieldsMetadata(); metadata.addFieldAsTextStyling("page"); XDocReportRegistry.getRegistry().register(document, metadata, TemplateEngineKind.Freemarker); // Populate the template Map<String, Object> context = new HashMap<>(); context.put("page", "${page}"); context.put("nbPages", "${nbPages}"); OutputStream out = new FileOutputStream("output.docx"); XDocReportRegistry.getRegistry().getReport(document, null).process(context, new XOutputStream(out)); // Close the streams in.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 此代码将使用名为“template.docx”的模板创建一个新的Word文档,并将“page”变量替换为当前页数。请注意,您需要使用FieldsMetadata对象来标识文档中的字段,并将其注册到XDocReportRegistry中。最后,代码将输出生成的Word文档到名为“output.docx”的文件中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值