效果
使用模版 占位符实现将数据渲染到表格中
生成的报告名称
@GetMapping("/getEquipmentWord")
public ResponseEntity<byte[]> getReportWord(
//参数接收前端的起始时间终止时间(前端根据时间选择器,选择时间范围查看设备异常报告)
@RequestParam LocalDate startTime
, @RequestParam LocalDate endTime
//设备的类型和基站名
, @RequestParam String stationNum
, @RequestParam String deviceType
/* @RequestParam Integer type*/) throws Exception {
//生成的报告名称
String fileName =startTime +"-"+endTime + "数据质控报告.docx";
qcService.exportEquipmentWord(Const.STATE_XLSX_TEMP_PATH+ fileName, startTime,endTime,deviceType,stationNum);
File docFile = new File(Const.STATE_XLSX_TEMP_PATH + fileName);
byte[] body = null;
InputStream is = new FileInputStream(docFile);
body = new byte[is.available()];
is.read(body);
HttpHeaders headers = new HttpHeaders();
fileName = new String(fileName.getBytes("Gb2312"), "ISO-8859-1");
headers.add("Content-Disposition", "attchement;filename=" + fileName);
HttpStatus statusCode = HttpStatus.OK;
ResponseEntity<byte[]> entity = new ResponseEntity<>(body, headers, statusCode);
return entity;
}
Service层代码在
实现java生成并下载数据质控报告的 Word 文档(Service)
一、核心功能
-
接口定义
- 使用
@GetMapping("/getEquipmentWord")
定义 HTTP GET 请求接口 - 返回类型为
ResponseEntity<byte[]>
,表示直接以二进制流形式返回文件内容。
- 使用
-
参数接收
- 接收四个请求参数:
startTime
和endTime
(LocalDate 类型,时间范围)stationNum
(站点编号)deviceType
(设备类型)
- 参数通过
@RequestParam
从 URL 中提取,未设置required
属性时默认为必填。
- 接收四个请求参数:
二、业务流程
-
文件生成
- 根据参数动态生成 Word 文件名(格式如
2025-03-01-2025-03-28数据质控报告.docx
) - 调用
qcService.exportEquipmentWord()
方法,传入文件路径和参数,执行数据查询与 Word 文档生成逻辑。
- 根据参数动态生成 Word 文件名(格式如
-
文件读取与流处理
- 通过
FileInputStream
读取生成的 Word 文件,将其转换为字节数组byte[]
。
- 通过
-
响应头设置
- 设置
Content-Disposition
响应头,指定文件名为附件(attachment
),并对中文文件名进行编码转换(GB2312 → ISO-8859-1),解决部分浏览器乱码问题 - 注意:更推荐使用
StandardCharsets.UTF_8
等标准编码,避免兼容性问题。
- 设置
-
响应返回
- 封装字节数组、响应头和 HTTP 状态码(200 OK)到
ResponseEntity
,完成文件下载响应。
- 封装字节数组、响应头和 HTTP 状态码(200 OK)到
三、技术实现特点
-
Spring Boot 集成
- 符合 Spring MVC 的请求处理流程:通过注解实现 URL 映射、参数绑定和响应封装
- 依赖
@RestController
隐式处理 JSON 序列化,但此处直接操作二进制流。
- 符合 Spring MVC 的请求处理流程:通过注解实现 URL 映射、参数绑定和响应封装
-
文件操作
- 使用硬编码路径
Const.STATE_XLSX_TEMP_PATH
,需确保服务器端目录权限和磁盘空间。 - 改进建议:采用动态临时文件路径(如
Files.createTempFile()
),避免并发冲突。
- 使用硬编码路径
-
异常处理
- 方法声明
throws Exception
抛出所有异常,但未定义具体的异常处理逻辑(如try-catch
)。 - 优化方向:添加全局异常处理器(
@ControllerAdvice
),返回更友好的错误信息。
- 方法声明
这段代码实现了一个 数据质控报告生成与下载 的 API 接口,核心流程包括参数接收、文件生成、二进制流封装和响应返回。其技术实现依赖 Spring Boot 框架的请求处理机制,但存在资源管理、异常处理和编码兼容性等方面的优化空间。典型应用场景为设备监控系统中的报告导出功能
。