当前位置: 首页 > ds >正文

将数据赋值到Word并下载

<!--        poi-tl导出word文档--><dependency><groupId>com.deepoove</groupId><artifactId>poi-tl</artifactId><version>1.12.1</version></dependency>

需要的实体类

package com.dream.domain.vo;import lombok.Data;import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;@Data
public class QuestionVo  implements Serializable {private String quesTitle;private int type;private String numb;private ArrayList<AnwserVo> anwser;
}
package com.dream.domain.vo;import lombok.Data;import java.io.Serializable;@Data
public class AnwserVo  implements Serializable {private String content;private int type;private int supplementType;private String supplement;
}

以下是实现逻辑

package com.dream.controller.file;import com.deepoove.poi.XWPFTemplate;
import com.dream.common.BussinessException;
import com.dream.common.Result;
import com.dream.domain.vo.AnwserVo;
import com.dream.domain.vo.PageVo;
import com.dream.domain.vo.QuestionVo;
import com.dream.domain.vo.Student;
import com.dream.service.admin.QuestionnaireAdminService;
import com.dream.service.admin.UserMangeAdminService;
import com.dream.utils.Utils;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import freemarker.template.Configuration;
import freemarker.template.Template;
import org.apache.commons.io.FilenameUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.*;import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;@RestController
@RequestMapping("file")
public class FileUploadController {private final ResourceLoader resourceLoader;@Autowiredprivate QuestionnaireAdminService questionnaireAdminService;// 通过构造函数注入ResourceLoaderpublic FileUploadController(ResourceLoader resourceLoader) {this.resourceLoader = resourceLoader;}/*** 导出单个word* @param id* @param response*/@GetMapping("/export")public void exportStudents(@RequestParam("id") Integer id,HttpServletResponse response) {try {// 1. 加载模板文件Resource resource = resourceLoader.getResource("classpath:templates/question.docx");// 2. 验证模板是否存在if (!resource.exists()) {throw new FileNotFoundException("模板文件未找到");}Map<String,ArrayList<QuestionVo>> map1 = questionnaireAdminService.queryUserQuestionnaireById(id);ArrayList<QuestionVo> list = (ArrayList<QuestionVo>) map1.get("subject");// 3. 准备数据(示例数据,实际应从数据库获取)Map<String, String> data = new HashMap<>();if(list.size() > 0){Map map = questionnaireAdminService.queryNameByQuestionnaireId(id);for (int i = 0; i <list.size(); i++) {QuestionVo questionVo = list.get(i);List<AnwserVo> anwser = questionVo.getAnwser();switch (questionVo.getNumb()){case "one":for (int j = 0; j <anwser.size(); j++) {AnwserVo anwserVo = anwser.get(j);if (anwserVo.getType() == 1){data.put("one_"+j,"√");}}break;case "two":for (int j = 0; j <anwser.size(); j++) {AnwserVo anwserVo = anwser.get(j);if (anwserVo.getType() == 1){data.put("two_"+j,"√");}if(anwserVo.getSupplementType() == 1){data.put("two_supplement",anwserVo.getSupplement());}}break;case "three":for (int j = 0; j <anwser.size(); j++) {AnwserVo anwserVo = anwser.get(j);if (anwserVo.getType() == 1){data.put("three_"+j,"√");}}break;case "four":for (int j = 0; j <anwser.size(); j++) {AnwserVo anwserVo = anwser.get(j);if (anwserVo.getType() == 1){data.put("four_"+j,"√");}if(anwserVo.getSupplementType() == 1){data.put("four_supplement",anwserVo.getSupplement());}}break;case "five":for (int j = 0; j <anwser.size(); j++) {AnwserVo anwserVo = anwser.get(j);if (anwserVo.getType() == 1){data.put("five_"+j,"√");}}break;case "six":for (int j = 0; j <anwser.size(); j++) {AnwserVo anwserVo = anwser.get(j);if (anwserVo.getType() == 1){data.put("six_"+j,"√");}if(anwserVo.getSupplementType() == 1){data.put("six_supplement",anwserVo.getSupplement());}}break;}}// 4. 生成文档try (XWPFTemplate template = XWPFTemplate.compile(resource.getInputStream()).render(data)) {String name = "未知";if (map != null && map.get("name") != null &&  !"".equals((String)map.get("name"))){Object nameA = map.get("name");name = (String) nameA;}// 5. 设置响应头String encodedFileName = URLEncoder.encode(name + "的问卷调查.docx",StandardCharsets.UTF_8.toString());response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);response.setCharacterEncoding(StandardCharsets.UTF_8.toString());response.setHeader(HttpHeaders.CONTENT_DISPOSITION,"attachment; filename*=UTF-8''" + encodedFileName);// 6. 输出文件流template.writeAndClose(response.getOutputStream());}}} catch (IOException e) {throw new RuntimeException("文件导出失败: " + e.getMessage(), e);}}}
 /*** 查询用户的问卷调查通过id    sevice层* @return*/@Overridepublic Map<String, ArrayList<QuestionVo>> queryUserQuestionnaireById(Integer id) {try {Map<String, Object> map1 = questionnaireAdminMapper.queryUserQuestionnaireById(id);if (map1 == null || map1.get("content") == null) {return Collections.singletonMap("subject", new ArrayList<>());}ObjectMapper objectMapper = new ObjectMapper();String subject = (String) map1.get("content");// 使用 TypeReference 指定泛型类型Map<String, ArrayList<QuestionVo>> map2 = objectMapper.readValue(subject,new TypeReference<Map<String, ArrayList<QuestionVo>>>() {});return map2;} catch (JsonProcessingException e) {throw new BussinessException("问卷调查转化异常");}}
    /*** 查询用户的问卷调查通过id   mapper层* @return*/@Select("select content from module_user_questionnaire where id = #{id}")Map queryUserQuestionnaireById(@Param("id") Integer id);

以下是生成的word模板

9、是否对中医药文化感兴趣?
A. 非常感兴趣  {{one_0}}
B.一般         {{one_1}}
C.不感兴趣     {{one_2}}10、想通过中医药元宇宙学习到什么知识?
A. 中医药基本理论  {{two_0}}
B.中医药临床知识   {{two_1}}
C.针灸推拿技术     {{two_2}}
D.食疗养生知识     {{two_3}}
E.其他,请填写!     {{two_4}}  {{two_supplement}}11、之前是否学习过中医药文化?
A.是  {{three_0}}
B.否  {{three_1}}12、每天入睡时间是_-点,睡眠时长为_-小时
A.21:00-23:00,7-8小时  {{four_0}}
B.23:00-1:00,6-7小时   {{four_1}}
C.1:00-3:00,5-6小时    {{four_2}}
E.其他,请填写:      {{four_3}}  {{four_supplement}}13、认为自己健康吗?
A. 非常健康  {{five_0}}
B.一般       {{five_1}}
C.不健康     {{five_2}}14、对健康的期许(可多选)
A. 身体健康,不生病  {{six_0}}
B.精神健康,心情愉快  {{six_1}}
C.饮食健康,胃口好、吃饭香  {{six_2}}
D.运动健康,体能充沛  {{six_3}}
E.其他,请填写:  {{six_4}}  {{six_supplement}}

http://www.xdnf.cn/news/19198.html

相关文章:

  • 2025.8.29总结
  • 从Cloudflare到EdgeOne:我的个人站点加速之旅与性能对比实测
  • Ubuntu 搭建 Solana 区块链开发环境 + Anchor 智能合约完整教程
  • Linux-搭建DNS服务器
  • C++异常处理指南:构建健壮程序的错误处理机制
  • WebSocket功能完整解析
  • 疯狂星期四文案网第54天运营日记
  • 【web3】十分钟了解web3是什么?
  • golang接口详细解释
  • Maya绑定:连接编辑器的简单使用
  • HGDB全文检索/中文分词的使用
  • 机器人电源电感的认证和认证细节,知多少?
  • Web网络开发 -- 常见CSS属性
  • 使用Docker搭建StackEdit在线MarkDown编辑器
  • 【论文阅读】CLIP: 从自然语言监督中学习可迁移的视觉模型
  • 【Depth与RGB对齐算法(D2C)】
  • 首次创建Django项目初始化
  • 沙箱操作工具
  • 计算机组成原理3-3-1:无符号数乘法运算的硬件逻辑实现
  • 学习做动画6.瞄准偏移
  • JavaScript初识:给小白的第一堂编程课
  • 大数据毕业设计选题推荐-基于大数据的痴呆症预测数据可视化分析系统-Spark-Hadoop-Bigdata
  • openEuler常用操作指令
  • AT_abc407_e [ABC407E] Most Valuable Parentheses
  • 客户案例 | 国际知名内衣品牌x甄知科技,领航IT服务新征程
  • 算法题打卡力扣第15题:三数之和(mid)
  • 用 PyTorch 搭建 CNN 实现 MNIST 手写数字识别
  • QT:【第一个QT程序】【信号和槽】
  • 2025通用证书研究:方法论、岗位映射与四证对比
  • 腾讯云重保流程详解:从预案到复盘的全周期安全防护