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

本文涉及的产品
.cn 域名,1个 12个月
简介: java使用 xdocreport,以 docx 模板方式进行 docx 文档的下载

gtihub 文档地址



项目中引入依赖

<!-- 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


58454135d0a749b1af32a98e2df9ef25.png


  • 鼠标右键点击该区域,选择编辑域

71073109e1fd462a8411f590297eba52.png64de78ce4e364bd9878176487f44efc9.png


选择域名类型,填写域名的值。域名类型为:MergeField,域名格式为:${xxx}

445a78029252496598d39fa83820407b.png


点击确定保存

36d859681d114c1f8171203bbf5719a4.png


  • 保存模板文档


代码内容

  • 通过 content 对象(Map<String,Object> 形式)将内容设置进去

a8a7c465accb4821933742ed7618c002.png


导出后的效果

c0fc2b8e32ce406fa2e20532593aef1e.png

相关文章
|
2月前
|
XML 数据采集 存储
使用Java和XPath在XML文档中精准定位数据
在数据驱动的时代,从复杂结构中精确提取信息至关重要。XML被广泛用于数据存储与传输,而XPath则能高效地在这些文档中导航和提取数据。本文深入探讨如何使用Java和XPath精准定位XML文档中的数据,并通过小红书的实际案例进行分析。首先介绍了XML及其挑战,接着阐述了XPath的优势。然后,提出从大型XML文档中自动提取特定产品信息的需求,并通过代理IP技术、设置Cookie和User-Agent以及多线程技术来解决实际网络环境下的数据抓取问题。最后,提供了一个Java示例代码,演示如何集成这些技术以高效地从XML源中抓取数据。
使用Java和XPath在XML文档中精准定位数据
|
2天前
|
Java Linux
java读取linux服务器下某文档的内容
java读取linux服务器下某文档的内容
13 3
java读取linux服务器下某文档的内容
|
2天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
9 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
2月前
|
Java
Java通过HttpClient从外部url下载文件到本地
该Java程序旨在通过URL将外部网络文件(如图片)下载至本地,并解决防盗链问题。首先,它通过`HttpGet`请求获取远程文件,并通过设置`Referer`头防止防盗链。然后,根据响应内容类型确定文件后缀并保存至指定路径。测试表明,程序能够成功下载文件。
168 8
Java通过HttpClient从外部url下载文件到本地
|
9天前
|
存储 缓存 监控
Java——图片文件位于 bin 目录下,下载新图片会导致应用程序重启
【9月更文挑战第22天】在Java应用中,若图片位于bin目录下且下载新图片导致应用重启,可能是因为部署方式不当或资源监控机制过于敏感。解决方法包括:更改图片存储位置至独立目录;配置应用服务器减少资源监控敏感度;使用独立资源服务器托管静态资源;优化代码减少资源重复加载。具体方案需根据应用实际情况和技术栈调整。
|
9天前
|
JSON 前端开发 JavaScript
java中post请求调用下载文件接口浏览器未弹窗而是返回一堆json,为啥
客户端调接口需要返回另存为弹窗,下载文件,但是遇到的问题是接口调用成功且不报错,浏览器F12查看居然返回一堆json,而没有另存为弹窗; > 正确的效果应该是:接口调用成功且浏览器F12不返回任何json,而是弹窗另存为窗口,直接保存文件即可。
35 2
|
2月前
|
小程序 Java
【aspose-words】Aspose.Words for Java模板语法详细剖析
本文通过详细分析Aspose.Words for Java模板语法,介绍了使用条件块、变量和动态合并表格单元格三个常用模板标签,并结合实际案例进行演示。通过这三个标签的实操,帮助读者更好地掌握Aspose.Words的使用技巧。此外,还提供了官方文档链接以便进一步学习。
89 0
【aspose-words】Aspose.Words for Java模板语法详细剖析
|
2月前
|
Java
Java系列之 IDEA 为类 和 方法设置注解模板
这篇文章介绍了如何在IntelliJ IDEA中为类和方法设置注解模板,包括类模板的创建和应用,以及两种不同的方法注解模板的创建过程和实际效果展示,旨在提高代码的可读性和维护性。
|
1月前
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
290 0
|
2月前
|
JavaScript Java Python
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
【Azure 应用服务】在Azure App Service for Windows 中部署Java/NodeJS/Python项目时,web.config的配置模板内容
下一篇
无影云桌面