package com.ruoyi.system.service.impl; import cn.hutool.core.io.resource.ClassPathResource; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.support.ExcelTypeEnum; import com.alibaba.excel.util.MapUtils; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.system.domain.TaskResult; import com.ruoyi.system.domain.WaterLevel; import com.ruoyi.system.mapper.TaskResultMapper; import com.ruoyi.system.mapper.WaterLevelMapper; import com.ruoyi.system.paramet.AchievementQuery; import com.ruoyi.system.paramet.WaterLevelQuery; import com.ruoyi.system.service.AchievementService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * classname: 站点信息 * description 服务实现类 */ @Service @Slf4j public class AchievementServiceImpl implements AchievementService { @Resource private TaskResultMapper taskResultMapper; @Resource private WaterLevelMapper waterLevelMapper; @Override public Page queryAchievement(AchievementQuery achievementQuery){ if (achievementQuery.getPage() == null || achievementQuery.getSize() == null) { achievementQuery.setPage(1L); achievementQuery.setSize(10L); } return taskResultMapper.queryAllByLimit(achievementQuery ,new Page(achievementQuery.getPage(),achievementQuery.getSize())); } @Override public Page getWaterLevelList(WaterLevelQuery waterLevelQuery){ if (waterLevelQuery.getType() == null){ waterLevelQuery.setType(1L); } if (waterLevelQuery.getPage() == null || waterLevelQuery.getSize() == null) { waterLevelQuery.setPage(1L); waterLevelQuery.setSize(10L); } return waterLevelMapper.queryAllByTime(waterLevelQuery,new Page(waterLevelQuery.getPage(),waterLevelQuery.getSize())); } @Override public boolean downAchievement(Long siteId, HttpServletResponse response) { ExcelWriter excelWriter = null; try { OutputStream outputStream = response.getOutputStream(); // 模版文件 ClassPathResource classPathResource = new ClassPathResource("excel/test.xlsx"); String templateFileName = classPathResource.getFile().getPath(); excelWriter = EasyExcel.write(outputStream).withTemplate(templateFileName).excelType(ExcelTypeEnum.XLSX).autoCloseStream(Boolean.FALSE).build(); WriteSheet writeSheet = EasyExcel.writerSheet().build(); //新插入行 //FillConfig fillConfig = FillConfig.builder().forceNewRow(Boolean.TRUE).build(); //单数据 Map map = MapUtils.newHashMap(); map.put("stieName", "水文站"); excelWriter.fill(map, writeSheet); //列表 List> dataList = new ArrayList<>(); //列表 List> pgList = new ArrayList<>(); for (int i = 0; i < 3; i++) { Map data = MapUtils.newHashMap(); data.put("index", i); data.put("a", "a" + i); data.put("b", "b" + i); data.put("c", "c" + i); data.put("d", "d" + i); data.put("e", "e" + i); data.put("f", "f" + i); data.put("g", "g" + i); data.put("h", "h" + i); data.put("i", "i" + i); data.put("j", "j" + i); data.put("k", "k" + i); data.put("l", "l" + i); data.put("m", "m" + i); data.put("n", "n" + i); data.put("o", "o" + i); dataList.add(data); } for (int i = 0; i < 2; i++) { Map data = MapUtils.newHashMap(); data.put("a", "a" + i); data.put("b", "b" + i); data.put("c", "c" + i); data.put("d", "d" + i); data.put("e", "e" + i); data.put("f", "f" + i); pgList.add(data); } Map data = MapUtils.newHashMap(); data.put("index", "index"); data.put("a", "a"); data.put("b", "b"); data.put("c", "c"); data.put("d", "d"); data.put("e", "e"); data.put("f", "f"); data.put("g", "g"); data.put("h", "h"); data.put("i", "i"); data.put("j", "j"); data.put("k", "k"); data.put("l", "l"); data.put("m", "m"); data.put("n", "n"); data.put("o", "o"); dataList = insertEmptyDataOnEvenRows(dataList, data); pgList = insertEmptyDataOnEvenRows(pgList, data); excelWriter.fill(new FillWrapper("details", dataList), writeSheet); excelWriter.fill(new FillWrapper("pg", pgList), writeSheet); // 设置输出流格式以及文件名: response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); String fileName = URLEncoder.encode("质检任务", StandardCharsets.UTF_8).replaceAll("\\+", "%20"); response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx"); return true; } catch (Exception e) { log.error("下载失败", e); return true; } finally { if (excelWriter != null) { excelWriter.close(); } } } public static List insertEmptyDataOnEvenRows(List list, T emptyValue) { List modifiedList = new ArrayList<>(list.size() * 2 - 1); // 预估新列表的大小 for (int i = 0; i < list.size(); i++) { modifiedList.add(list.get(i)); // 添加原始元素 if (i < list.size() - 1) { // 避免在最后一个元素后插入 modifiedList.add(emptyValue); // 在每个元素后插入空白数据 } } return modifiedList; } }