Angular/Spring Boot Rest API下载Word文档
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
以上是关于Angular/Spring Boot Rest API下载Word文档的主要内容,如果未能解决你的问题,请参考以下文章
Angular - Spring Boot - Keycloak - 401错误
向服务器发送 POST 请求,服务器的响应为空,Angular - Spring-boot
如何在 Angular、spring-boot、maven 项目中配置项目以自动重新加载浏览器
Angular2 Spring Boot JWT 缺少响应标头