Angular/Spring Boot Rest API下载Word文档

POI生成Word文档

使用POI XWPF生成Word文档,引入POI:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.1.0</version>
</dependency>

项目中经常从Word模板生成文档,下面示例演示了替换文档内容的方法。模版中要替换的内容以${}标识,调用XWPFRun.setText()方法更新文档。

package org.iata.caims.util;

import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;

import static org.springframework.util.StringUtils.isEmpty;

public class XWPFDocumentUtils {
    public static byte[] replaceDocument(String path, Map<String, String> fields) throws IOException {
        try (XWPFDocument doc = new XWPFDocument(new FileInputStream(path))) {
            for (XWPFParagraph paragraph : doc.getParagraphs()) {
                String paragraphText = paragraph.getText();
                if (!paragraphText.contains("${")) {
                    continue;
                }

                for (Map.Entry<String, String> field : fields.entrySet()) {
                    String find = "${" + field.getKey() + "}";
                    if (!paragraphText.contains(find)) {
                        continue;
                    }

                    List<XWPFRun> runs = paragraph.getRuns();
                    for (int i = 0; i < runs.size(); i++) {
                        XWPFRun run = runs.get(i);
                        String text = run.text();

                        if (isEmpty(text)) {
                            continue;
                        }

                        if (text.contains("${") || (text.contains("$") && runs.get(i + 1).text().startsWith("{"))) {
                            while (!text.contains("}")) {
                                text += runs.get(i + 1).text();
                                paragraph.removeRun(i + 1);
                            }
                            run.setText(text.contains(find) ? text.replace(find, field.getValue()) : text, 0);
                        }
                    }
                }
            }

            try (ByteArrayOutputStream out = new ByteArrayOutputStream()) {
                doc.write(out);
                return out.toByteArray();
            }
        }
    }
}

Spring Boot Rest API

调用replaceDocument()方法生成word文档,如要在Rest API中定义文件名称,使用ResponseEntity并增加header,否则可以直接返回byte[]。

@GetMapping("/api/doc/{heroName}")
public ResponseEntity<byte[]> getDocument(@PathVariable String heroName) {
    try {
        Map<String, String> fields = new HashMap<>();
        fields.put("hero_name", heroName);
        fields.put("create_date", "2019年6月");
        byte[] bytes = XWPFDocumentUtil.replaceDocument("template/hero.docx", fields);
        HttpHeaders headers = new HttpHeaders();
        headers.add("Content-Disposition", "attachment;filename=hero.docx");
        return ResponseEntity.ok().headers(headers).body(bytes);
    } catch (Exception e) {
        throw new XWPFDocumentException(e.getMessage());
    }
}

配置CORS的ExposedHeaders,否则前台不能读取"Content-Disposition":

@Bean
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    SecurityProperties.Cors cors = config.getCors();
    configuration.setAllowedMethods(Arrays.asList("*"));
    configuration.setAllowedHeaders(Arrays.asList("Accept","Accept-Encoding","Accept-Language","Authorization","Connection","Content-Type","Host","Origin","Referer","User-Agent","X-Requested-With"));
    configuration.setExposedHeaders(Arrays.asList("Content-Disposition"));
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

Angular下载文档

可以使用链接直接访问REST URL下载文档,若项目启用了JWT Token验证,则必须使用HttpClient的get方法。
本文使用了FileSaver.js保存文档,开始之前先安装:

npm install --save file-saver

然后在tsconfig.json中添加:

"paths": {
  "file-saver": [
    "node_modules/file-saver/dist/FileSaver.js"
  ]
}

下载方法:

import * as fs from ‘file-saver‘;

downloadDocument() {
  this.httpClient.get(‘yourUrl‘, {observe: ‘response‘, responseType: ‘blob‘}).subscribe(response => {
    fs.saveAs(response.body, this.getFilename(response.headers));
  });
}

private getFilename(headers: HttpHeaders): string {
  const disposition = headers.get(‘Content-Disposition‘);
  if (!disposition || disposition.indexOf(‘filename=‘) < 0) {
    return ‘‘;
  }

  return disposition.substr(disposition.indexOf(‘filename=‘) + 9);
}

downloadDocument() {
  this.httpClient.get(‘yourUrl‘, {responseType: ‘blob‘}).subscribe(data => {
    fs.saveAs(data, ‘yourFilename‘);
  });
}

参考文档

Excel File – Download from SpringBoot RestAPI + Apache POI + MySQL
Apache POI Word Tutorial

原文地址:https://blog.51cto.com/7308310/2412183

时间: 2024-08-25 17:38:25

Angular/Spring Boot Rest API下载Word文档的相关文章

Spring Boot:整合Swagger在线文档

综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于移动端.在实际开发过程中,这些接口还要提供给开发测试进行相关的白盒测试,那么势必存在如何在多人协作中共享和及时更新API开发接口文档的问题. 假如你已经对传统的wiki文档共享方式所带来的弊端深恶痛绝,那么尝试一下Swagger2 方式,一定会让你有不一样的开发体验. 使用 Swagger 集成文档

下载Word文档

//方法一 下载word Response.ClearContent(); Response.ClearHeaders(); Response.ContentType = "Application/msword"; string s = Server.MapPath(WordPath); Response.WriteFile(WordPath); //Response.Write(s); Response.Flush(); Response.Close(); //方法二 下载word

JSP实现word文档的上传,在线预览,下载

前两天帮同学实现在线预览word文档中的内容,而且需要提供可以下载的链接!在网上找了好久,都没有什么可行的方法,只得用最笨的方法来实现了.希望得到各位大神的指教.下面我就具体谈谈自己的实现过程,总结一下学习中的收获. 我相信很多程序员都遇到过,有些word文档希望直接在浏览器中打开进行预览,但是浏览器往往不是很配合,直接就提示下载,不像pdf文档,浏览器可以直接进行预览.Word文档甚至始终都会通过本地的Office软件打开.那么,问题来了,如何可以在线浏览word文档呢? 其实,我在最初的时候

支持打印和打印预览Word文档处理控件TX Text Control ActiveX

TX Text Control ActiveX 控件为软件开发人员提供了强大的所见所得的Word文档处理,可以加载.编辑和保存Wod格式(DOCX.DOC.RTF等),生成Word报表,文档转换,导出和直接创建PDF和PDF/A文件.该产品分发完全免费,包含了标准版.专业版和企业版. 具体功能: 支持打印和打印预览 文档可以分割为多个不同的段落,每个段落都可以单独的格式化 支持定义超链接,并加载和保存HTML文件 支持添加项目符号和数字列表 支持多层Undo和Redo操作 支持插入任何数量的列到

怎样将pdf转换成word文档

怎样将pdf转换成word文档 从事办公文书的同学唠叨最近一段时间都在烦恼同一个问题,就是有大量的PDF文档需要操 作,工作量大的时候,忙得焦头烂额,甚至要还得加班才能赶完.当面对数量大的文档需要转换时,你该怎么办?小编给你推荐一款叫迅捷PDF转换成Word转 换器,简单的操作,就可以把文档完美转换哦,一起来看看怎么转换吧! PC版迅捷PDF转换成Word转换器: 这是一款操作简单,使用方便,效果极好的PDF转换成Word转换器工具,使用它,您可以将一个或多个文件PDF文件转换成想要的文本格式,

使用Spring Boot构建微服务(文末福利)

本文主要内容 学习微服务的关键特征 了解微服务是如何适应云架构的 将业务领域分解成一组微服务 使用Spring Boot实现简单的微服务 掌握基于微服务架构构建应用程序的视角 学习什么时候不应该使用微服务 软件开发的历史充斥着大型开发项目崩溃的故事,这些项目可能投资了数百万美元.集中了行业里众多的顶尖人才.消耗了开发人员成千上万的工时,但从未给客户交付任何有价值的东西,最终由于其复杂性和负担而轰然倒塌. 这些庞大的项目倾向于遵循大型传统的瀑布开发方法,坚持在项目开始时界定应用的所有需求和设计.这

C# : 操作Word文件的API - (将C# source中的xml注释转换成word文档)

这篇博客将要讨论的是关于: 如何从C#的source以及注释, 生成一份Word格式的关于各个类,函数以及成员变量的说明文档. 他的大背景如下...... 最近的一个项目使用C#, 分N个模块, 在项目的里程碑的时候, 日本的总公司要检查我们的成果物. 成果物包括源代码, 概要设计式样书(SD,System Design), 详细设计式样书(PD, Program Design), 自动化测试等等. 源代码必须要符合编码规范(每个函数都要有注释, 方法变量的命名规则等...) 这些检查都很正常,

php在程序中把网页生成word文档并提供下载

在这篇文章中主要解决两个问题: 1:在php中如何把html中的内容生成到word文档中 2:php把html中的内容生成到word文档中时,不居中显示问题,即会默认按照web视图进行显示. 3:php把html中的内容生成到word文档中时,相关样式不兼容问题 正文:    echo '<html xmlns:o="urn:schemas-microsoft-com:office:office"  xmlns:w="urn:schemas-microsoft-com:

ASP.NET MVC 拓展ViewResult实现word文档下载

? 最近项目中有同事用到word文档导出功能,遇到了一些导出失败问题,帮其看了下解决问题的同事,看了下之前的代码发现几个问题: 代码编写不规范,word导出功能未收口 重复代码导出都是 实现逻辑比较复杂,不易于维护及使用 在帮其解决问题后,写了下面这个ViewResult拓展,依赖Razor视图,能够直接转换页面为word文档,但是不支持外联样式表,样式可以定义在<head>头部 废话不多说,直接上代码: ? public class WordFileResult : ViewResultBa