From a747c8ba5ccfdea9e1dfdb78c6ad0e5845c603ef Mon Sep 17 00:00:00 2001 From: du <1725534722@qq.com> Date: Thu, 1 Aug 2024 20:12:20 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E4=B8=9A=E5=8F=91=E5=B1=95?= =?UTF-8?q?=E6=8A=A5=E5=91=8A=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ruoyi-admin/pom.xml | 5 + .../JDevelopmentReportController.java | 91 +++++++++++++++++- .../jjh/ent/entity/JDevelopmentReport.java | 5 + .../resources/template/~$发展报告模板.docx | Bin 0 -> 162 bytes .../main/resources/template/发展报告模板.docx | Bin 0 -> 14633 bytes 5 files changed, 99 insertions(+), 2 deletions(-) create mode 100644 ruoyi-admin/src/main/resources/template/~$发展报告模板.docx create mode 100644 ruoyi-admin/src/main/resources/template/发展报告模板.docx diff --git a/ruoyi-admin/pom.xml b/ruoyi-admin/pom.xml index 3ede565..b606cb4 100644 --- a/ruoyi-admin/pom.xml +++ b/ruoyi-admin/pom.xml @@ -16,6 +16,11 @@ + + org.jsoup + jsoup + 1.17.2 + cn.hutool hutool-all diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java index f3d180f..8c9abfd 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/controller/JDevelopmentReportController.java @@ -1,5 +1,8 @@ package com.ruoyi.jjh.ent.controller; +import cn.hutool.core.io.FileUtil; +import cn.hutool.core.io.resource.ClassPathResource; +import cn.hutool.poi.word.Word07Writer; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.jjh.ent.entity.JDevelopmentReport; @@ -7,13 +10,29 @@ import com.ruoyi.jjh.ent.entity.response.JTemplateMetricsResponse; import com.ruoyi.jjh.ent.service.JDevelopmentReportService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; -import javax.annotation.Resource; +import java.awt.*; +import java.io.File; +import java.io.IOException; +import java.nio.file.Path; +import java.nio.file.Paths; /** * 服务业发展报告(j_template_metrics)表控制层 + * * @author du * @since 2024/7/31 15:09 */ @@ -23,7 +42,7 @@ import javax.annotation.Resource; public class JDevelopmentReportController extends BaseController { - @Resource + @Autowired private JDevelopmentReportService jDevelopmentReportService; @@ -46,4 +65,72 @@ public class JDevelopmentReportController extends BaseController { public AjaxResult getTemplateMetrics(String year) { return success(jDevelopmentReportService.getTemplateMetrics(year)); } + + @ApiOperation(value = "下载发展模板") + @GetMapping("/downloadLocal") + public ResponseEntity downloadLocal() { + String filePath = System.getProperty("user.dir") + "/ruoyi-admin/src/main/resources/template/发展报告模板.docx"; + // 创建文件资源 + Path path = Paths.get(filePath); + FileSystemResource resource = new FileSystemResource(path.toFile()); + // 设置响应头 + HttpHeaders headers = new HttpHeaders(); + headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + "moban"); + headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); + // 返回 ResponseEntity + return ResponseEntity.ok() + .headers(headers) + .body(resource); + } + +// @ApiOperation(value = "下载发展模板") +// @PostMapping("/downloadTemplate") +// public ResponseEntity downloadTemplate(@RequestBody JDevelopmentReport s) { +// // 定义文件路径 +// ClassPathResource filePath = new ClassPathResource("/template/moban.docx"); +// File touch = filePath.getFile(); +// // 创建 Word07Writer 实例 +// Word07Writer writer = new Word07Writer(); +// +// try { +// // 添加段落(标题) +// writer.addText(new Font("宋体", Font.PLAIN, 22), s.getTitle()); +// +// // 添加副标题 +// writer.addText(new Font("宋体", Font.PLAIN, 18), s.getSubheading()); +// +// // 使用 Jsoup 解析页面内容 +// Document doc = Jsoup.parse(s.getContent(), "UTF-8"); +// +// // 获取页面内容中的段落 +// Elements paragraphs = doc.select("p"); +// for (Element paragraph : paragraphs) { +// writer.addText(new Font("仿宋", Font.PLAIN, 16), paragraph.text()); +// } +// +// // 写出到文件 +// writer.flush(touch); +// +// // 设置响应头 +// HttpHeaders headers = new HttpHeaders(); +// headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"发展报告模板1.docx\""); +// headers.add(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE); +// +// // 封装为 ResponseEntity +// FileSystemResource resource = new FileSystemResource(touch); +// return ResponseEntity.ok() +// .headers(headers) +// .body(resource); +// } catch (Exception e) { +// // 处理异常情况,例如日志记录或者其他错误处理 +// e.printStackTrace(); +// return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build(); +// } finally { +// // 关闭资源 +// writer.close(); +// // 删除临时文件 +// FileUtil.del((Path) filePath); +// } +// } } + diff --git a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java index 60dda27..7f58849 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/jjh/ent/entity/JDevelopmentReport.java @@ -8,6 +8,8 @@ import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotBlank; + /** * 服务业发展报告(j_template_metrics)表实体类 * @author du @@ -28,18 +30,21 @@ public class JDevelopmentReport extends BaseInfoEntity { /** * 标题 */ + @NotBlank @ApiModelProperty("标题") private String title; /** * 副标题 */ + @NotBlank @ApiModelProperty("副标题") private String subheading; /** * 内容 */ + @NotBlank @ApiModelProperty("内容") private String content; } diff --git a/ruoyi-admin/src/main/resources/template/~$发展报告模板.docx b/ruoyi-admin/src/main/resources/template/~$发展报告模板.docx new file mode 100644 index 0000000000000000000000000000000000000000..e066214c67301551698699d4f097185e6b7b4ac9 GIT binary patch literal 162 ecmZSEc68VJ%kLOS1I!FD>3;*;qe;_6o@xLV;s>Gt literal 0 HcmV?d00001 diff --git a/ruoyi-admin/src/main/resources/template/发展报告模板.docx b/ruoyi-admin/src/main/resources/template/发展报告模板.docx new file mode 100644 index 0000000000000000000000000000000000000000..efefc5b9a477716fe16c2ecaa149dfa0679bc216 GIT binary patch literal 14633 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 Wr9l7q*CKrI=-@ww2F&sc^nU;