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月前
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
146 5
|
25天前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
86 34
|
2月前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
82 4
|
3月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
42 6
|
3月前
|
Web App开发 Java
使用java操作浏览器的工具selenium-java和webdriver下载地址
【10月更文挑战第12天】Selenium-java依赖包用于自动化Web测试,版本为3.141.59。ChromeDriver和EdgeDriver分别用于控制Chrome和Edge浏览器,需确保版本与浏览器匹配。示例代码展示了如何使用Selenium-java模拟登录CSDN,包括设置驱动路径、添加Cookies和获取页面源码。
176 6
|
3月前
|
Java Linux
java读取linux服务器下某文档的内容
java读取linux服务器下某文档的内容
44 3
java读取linux服务器下某文档的内容
|
3月前
|
Java
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
71 2
java实现从HDFS上下载文件及文件夹的功能,以流形式输出,便于用户自定义保存任何路径下
|
3月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
130 1
|
3月前
|
Java
Java PDF模板生成PDF
Java PDF模板生成PDF
64 1
|
3月前
|
存储 前端开发 Java
Java后端如何进行文件上传和下载 —— 本地版(文末配绝对能用的源码,超详细,超好用,一看就懂,博主在线解答) 文件如何预览和下载?(超简单教程)
本文详细介绍了在Java后端进行文件上传和下载的实现方法,包括文件上传保存到本地的完整流程、文件下载的代码实现,以及如何处理文件预览、下载大小限制和运行失败的问题,并提供了完整的代码示例。
1006 2