@Operation(summary = "下载导入主数据的excel模板", description = "") @GetMapping("/download-excel-template") public ResponseEntity<Resource> downloadExcelTemplate(@RequestParam(name = "logicModelId", required = true) Long logicModelId) throws BizBaseException { LoginUserBO loginUser = ContextUtil.getLoginUser(); OperationInfo operationInfo = OperationInfoBuilder.build(loginUser); MasterdataModelBO masterdataModelBO = masterdataModelService.getMasterdataModelById(ShardingKey.ofContext(), logicModelId); // 创建 Excel 文件 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("sheet1"); // 添加字段 List<LogicalModelColumnBO> fieldInfos = masterdataModelBO.getFieldInfos(); if (fieldInfos != null && !fieldInfos.isEmpty()) { Row headerRow = sheet.createRow(0); for (int i = 0; i < fieldInfos.size(); i++) { LogicalModelColumnBO field = fieldInfos.get(i); if (ignoreField(field.getName())) continue; Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(field.getCname()); } } // 写入到文件流中 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } // 构造下载文件的响应头 HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=template.xlsx"); // 将字节流封装成 Resource 对象 ByteArrayResource resource = new ByteArrayResource(outputStream.toByteArray()); // 返回文件下载响应 return ResponseEntity.ok() .headers(headers) .contentType(MediaType.parseMediaType("application/vnd.ms-excel")) .contentLength(resource.contentLength()) .body(resource); }
时间: 2023-06-24 17:06:46 浏览: 32
这段代码是一个下载 Excel 模板的接口,接口的请求路径为 "/download-excel-template",需要传递一个名为 "logicModelId" 的必填参数,表示要下载的 Excel 模板对应的逻辑模型 ID。接口响应的是一个 Excel 文件,响应头中包含了文件名和文件类型,文件内容是根据逻辑模型 ID 查询到的字段信息动态生成的。具体实现过程是:创建一个 Workbook 对象,然后根据逻辑模型 ID 查询到该模型对应的字段信息,根据字段信息动态生成 Excel 文件,最后将 Excel 文件转换成字节流并封装成 Resource 对象返回。
相关问题
改造这段代码,使其能下载主数据模型对应的主数据包含在下载的excel中 @Operation(summary = "下载导入主数据的excel模板", description = "") @GetMapping("/download-excel-template") public ResponseEntity<Resource> downloadExcelTemplate(@RequestParam(name = "logicModelId", required = true) Long logicModelId) throws BizBaseException { LoginUserBO loginUser = ContextUtil.getLoginUser(); OperationInfo operationInfo = OperationInfoBuilder.build(loginUser); MasterdataModelBO masterdataModelBO = masterdataModelService.getMasterdataModelById(ShardingKey.ofContext(), logicModelId); // 创建 Excel 文件 Workbook workbook = new XSSFWorkbook(); Sheet sheet = workbook.createSheet("sheet1"); // 添加字段 List<LogicalModelColumnBO> fieldInfos = masterdataModelBO.getFieldInfos(); if (fieldInfos != null && !fieldInfos.isEmpty()) { Row headerRow = sheet.createRow(0); for (int i = 0; i < fieldInfos.size(); i++) { LogicalModelColumnBO field = fieldInfos.get(i); if (ignoreField(field.getName())) continue; Cell headerCell = headerRow.createCell(i); headerCell.setCellValue(field.getCname()); } } // 写入到文件流中 ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); try { workbook.write(outputStream); } catch (IOException e) { e.printStackTrace(); } // 构造下载文件的响应头 HttpHeaders headers = new HttpHeaders(); headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=template.xlsx"); // 将字节流封装成 Resource 对象 ByteArrayResource resource = new ByteArrayResource(outputStream.toByteArray()); // 返回文件下载响应 return ResponseEntity.ok() .headers(headers) .contentType(MediaType.parseMediaType("application/vnd.ms-excel")) .contentLength(resource.contentLength()) .body(resource); }
改进的代码如下所示:
```java
@Operation(summary = "下载导入主数据的excel模板", description = "")
@GetMapping("/download-excel-template")
public ResponseEntity<Resource> downloadExcelTemplate(@RequestParam(name = "logicModelId", required = true) Long logicModelId) throws BizBaseException {
LoginUserBO loginUser = ContextUtil.getLoginUser();
OperationInfo operationInfo = OperationInfoBuilder.build(loginUser);
// 获取主数据模型信息
MasterdataModelBO masterdataModelBO = masterdataModelService.getMasterdataModelById(ShardingKey.ofContext(), logicModelId);
// 创建 Excel 文件
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet("sheet1");
// 添加字段
List<LogicalModelColumnBO> fieldInfos = masterdataModelBO.getFieldInfos();
if (fieldInfos != null && !fieldInfos.isEmpty()) {
Row headerRow = sheet.createRow(0);
for (int i = 0; i < fieldInfos.size(); i++) {
LogicalModelColumnBO field = fieldInfos.get(i);
if (ignoreField(field.getName())) continue;
Cell headerCell = headerRow.createCell(i);
headerCell.setCellValue(field.getCname());
}
}
// 添加主数据
List<MasterdataBO> masterdataList = masterdataService.getMasterdataListByModelId(ShardingKey.ofContext(), logicModelId);
if (masterdataList != null && !masterdataList.isEmpty()) {
int rowIndex = 1;
for (MasterdataBO masterdata : masterdataList) {
Row dataRow = sheet.createRow(rowIndex++);
for (int i = 0; i < fieldInfos.size(); i++) {
LogicalModelColumnBO field = fieldInfos.get(i);
if (ignoreField(field.getName())) continue;
Cell dataCell = dataRow.createCell(i);
Object value = masterdata.getAttrValue(field.getName());
if (value != null) {
if (value instanceof Date) {
dataCell.setCellValue((Date) value);
} else {
dataCell.setCellValue(value.toString());
}
}
}
}
}
// 写入到文件流中
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
try {
workbook.write(outputStream);
} catch (IOException e) {
e.printStackTrace();
}
// 构造下载文件的响应头
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=template.xlsx");
// 将字节流封装成 Resource 对象
ByteArrayResource resource = new ByteArrayResource(outputStream.toByteArray());
// 返回文件下载响应
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.parseMediaType("application/vnd.ms-excel"))
.contentLength(resource.contentLength())
.body(resource);
}
```
修改后的代码在原有代码的基础上,增加了添加主数据的部分。首先获取主数据模型信息,然后获取该模型对应的主数据列表,按照字段信息的顺序将主数据添加到 Excel 文件中。最终返回文件下载响应。
java通过ResponseEntity下载excel文件模板
下面是一个示例代码,用于通过ResponseEntity下载Excel文件模板:
```java
@GetMapping("/downloadExcelTemplate")
public ResponseEntity<ByteArrayResource> downloadExcelTemplate() throws IOException {
// 从 classpath 中读取 Excel 模板
InputStream inputStream = getClass().getResourceAsStream("/templates/excel_template.xlsx");
byte[] data = IOUtils.toByteArray(inputStream);
// 构建 ByteArrayResource 对象并设置响应头
ByteArrayResource resource = new ByteArrayResource(data);
HttpHeaders headers = new HttpHeaders();
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=excel_template.xlsx");
// 返回 ResponseEntity 对象
return ResponseEntity.ok()
.headers(headers)
.contentLength(data.length)
.contentType(MediaType.parseMediaType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
.body(resource);
}
```
在上面的示例中,我们首先使用 `getClass().getResourceAsStream()` 方法从 classpath 中读取 Excel 模板文件,然后使用 Apache Commons IO 库的 `IOUtils.toByteArray()` 方法将其转换为字节数组。接着,我们构建了一个 `ByteArrayResource` 对象,并设置了响应头,包括文件名和文件类型。最后,我们使用 `ResponseEntity` 对象返回文件内容以及响应头信息。
注意,上面的代码中使用了 Apache Commons IO 库,需要在 pom.xml 文件中添加以下依赖:
```xml
<dependencies>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.8.0</version>
</dependency>
<!-- 其他依赖... -->
</dependencies>
```
另外,需要注意的是,上面的代码示例是基于 Spring Boot 框架编写的,如果你使用的是其他框架,可能需要进行适当的修改。