From 6c47bed5aa64ef56c715a7196a4e50161b935a63 Mon Sep 17 00:00:00 2001 From: hehaowei Date: Thu, 10 Apr 2025 10:56:32 +0800 Subject: [PATCH] =?UTF-8?q?word=E5=AF=BC=E5=87=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasicInformationController.java | 49 ++++++++++++++++++ .../gysl/service/BasicInformationService.java | 2 + .../impl/BasicInformationServiceImpl.java | 32 ++++++++++++ .../static/word/项目单片材料模板.dotx | Bin 0 -> 25197 bytes 4 files changed, 83 insertions(+) create mode 100644 ruoyi-admin/src/main/resources/static/word/项目单片材料模板.dotx diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java index 175f065..e31d2ef 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/controller/BasicInformationController.java @@ -437,5 +437,54 @@ public class BasicInformationController extends BaseController { ExcelUtil util = new ExcelUtil<>(BasicInformation.class); util.exportExcel(response, filteredList, "基本信息"); } + + /** + * word导出 + */ + @ApiOperation(value = "word导出") + @PostMapping(value = "/word_export") + public void word_export(HttpServletResponse response, @RequestParam List ids) throws Exception { + + //设置n值为0 用来检查是否为一个文件 + int n = 0; + for (Long id : ids) { + n++; + //b1是word里面需要的值 + BasicInformationResponse b1 = basicInformationService.selectOne(id); + Map data = new HashMap<>(); + data.put("name", b1.getBasicInformation().getName()); + data.put("ssgnq", b1.getBasicInformation().getSsgnq()); + data.put("jsdd", b1.getBasicInformation().getJsdd()); + data.put("xmfrdwxz",b1.getBasicInformation().getXmfrdwxz()); + data.put("tyshxydm",b1.getBasicInformation().getTyshxydm()); + data.put("sgdw",b1.getBasicInformation().getSgdw()); + data.put("sjdw",b1.getBasicInformation().getSjdw()); + data.put("begainTime",b1.getBasicInformation().getBegainTime()); + data.put("endTime",b1.getBasicInformation().getEndTime()); + data.put("projectLeader",b1.getBasicInformation().getProjectLeader()); + data.put("phone",b1.getBasicInformation().getPhone()); + data.put("zydmj",b1.getBasicInformation().getZydmj()); + data.put("rjl",b1.getPlanInformation().getRjl()); + data.put("zjzmj",b1.getPlanInformation().getZjzmj()); + data.put("jzds",b1.getPlanInformation().getJzds()); + data.put("bzcjzmj",b1.getPlanInformation().getBzcjzmj()); + data.put("jzmd",b1.getPlanInformation().getJzmd()); + data.put(""); + data.put(""); + data.put(""); + data.put(""); + data.put(""); + data.put(""); + + } + //如果n=1的时候就输出一个word + if (n == 1) { + + } + //如果n>1的时候输出zip + else { + + } + } } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java index 316b0b7..2430bd2 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/BasicInformationService.java @@ -93,5 +93,7 @@ public interface BasicInformationService extends IService { * @return 单条数据 */ BasicInformationResponse stagingInfo(Long id); + + void generateDocument(String filePath, Map data)throws Exception; } diff --git a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java index cd294ce..c082740 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/gysl/service/impl/BasicInformationServiceImpl.java @@ -1,5 +1,6 @@ package com.ruoyi.gysl.service.impl; +import cn.hutool.core.io.resource.ClassPathResource; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.annotation.Excel; @@ -22,13 +23,19 @@ import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFCellStyle; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.io.FileOutputStream; +import java.io.InputStream; import java.io.Serializable; import java.lang.reflect.Field; import java.util.List; +import java.util.Map; import java.util.Objects; import java.util.stream.Collectors; @@ -473,4 +480,29 @@ public class BasicInformationServiceImpl extends ServiceImpl data) throws Exception { + // 加载模板文件 + try (InputStream inputStream = new ClassPathResource("template.docx").getStream()) { + XWPFDocument document = new XWPFDocument(inputStream); + + // 替换模板中的占位符 + for (XWPFParagraph paragraph : document.getParagraphs()) { + for (String key : data.keySet()) { + String text = paragraph.getText(); + if (text.contains("{" + key + "}")) { + text = text.replace("{" + key + "}", data.get(key)); + paragraph.removeRun(0); // 删除原有内容 + XWPFRun run = paragraph.createRun(); + run.setText(text); // 设置替换后的内容 + } + } + } + // 输出生成的文档 + try (FileOutputStream out = new FileOutputStream(filePath)) { + document.write(out); + } + } + } } diff --git a/ruoyi-admin/src/main/resources/static/word/项目单片材料模板.dotx b/ruoyi-admin/src/main/resources/static/word/项目单片材料模板.dotx new file mode 100644 index 0000000000000000000000000000000000000000..11760a72d48d5866ca7064f2b6185595b30f2353 GIT binary patch literal 25197 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