结果导出
This commit is contained in:
parent
5093d978b4
commit
67739f8a7c
@ -4,10 +4,18 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.yfd.business.css.domain.ScenarioResult;
|
import com.yfd.business.css.domain.ScenarioResult;
|
||||||
import com.yfd.business.css.service.ScenarioResultService;
|
import com.yfd.business.css.service.ScenarioResultService;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import org.apache.poi.ss.usermodel.*;
|
||||||
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/scenario-results")
|
@RequestMapping("/scenario-results")
|
||||||
@ -54,4 +62,129 @@ public class ScenarioResultController {
|
|||||||
"data", data
|
"data", data
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出指定条件下的情景结果为Excel文件
|
||||||
|
*
|
||||||
|
* @param response HTTP响应对象
|
||||||
|
* @param scenarioId 场景ID
|
||||||
|
* @param deviceId 设备ID(可选)
|
||||||
|
* @param stepFrom 步骤起始范围(可选)
|
||||||
|
* @param stepTo 步骤结束范围(可选)
|
||||||
|
* @throws IOException 写入流异常
|
||||||
|
*/
|
||||||
|
@GetMapping("/export/by-scenario")
|
||||||
|
public void exportResultsAsExcel(HttpServletResponse response,
|
||||||
|
@RequestParam String scenarioId,
|
||||||
|
@RequestParam(required = false) String deviceId,
|
||||||
|
@RequestParam(required = false) Integer stepFrom,
|
||||||
|
@RequestParam(required = false) Integer stepTo) throws IOException {
|
||||||
|
|
||||||
|
// 设置响应头信息以便浏览器识别并触发下载行为
|
||||||
|
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||||
|
response.setHeader("Content-Disposition", "attachment;filename=\"scenario_results.xlsx\"");
|
||||||
|
|
||||||
|
try {
|
||||||
|
// 查询全部符合过滤条件的数据(不分页)
|
||||||
|
QueryWrapper<ScenarioResult> queryWrapper = new QueryWrapper<>();
|
||||||
|
queryWrapper.eq("scenario_id", scenarioId);
|
||||||
|
|
||||||
|
if (deviceId != null && !deviceId.isEmpty()) {
|
||||||
|
queryWrapper.eq("device_id", deviceId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stepFrom != null) {
|
||||||
|
queryWrapper.ge("step", stepFrom);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (stepTo != null) {
|
||||||
|
queryWrapper.le("step", stepTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
List<ScenarioResult> results = scenarioResultService.list(queryWrapper.orderByAsc("step"));
|
||||||
|
|
||||||
|
// 创建Excel工作簿
|
||||||
|
Workbook workbook = new XSSFWorkbook();
|
||||||
|
Sheet sheet = workbook.createSheet("情景结果数据");
|
||||||
|
|
||||||
|
// 创建表头样式
|
||||||
|
CellStyle headerStyle = workbook.createCellStyle();
|
||||||
|
Font headerFont = workbook.createFont();
|
||||||
|
headerFont.setBold(true);
|
||||||
|
headerFont.setFontHeightInPoints((short) 12);
|
||||||
|
headerStyle.setFont(headerFont);
|
||||||
|
headerStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
|
||||||
|
headerStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
|
||||||
|
headerStyle.setBorderBottom(BorderStyle.THIN);
|
||||||
|
headerStyle.setBorderTop(BorderStyle.THIN);
|
||||||
|
headerStyle.setBorderRight(BorderStyle.THIN);
|
||||||
|
headerStyle.setBorderLeft(BorderStyle.THIN);
|
||||||
|
headerStyle.setAlignment(HorizontalAlignment.CENTER);
|
||||||
|
|
||||||
|
// 创建数据样式
|
||||||
|
CellStyle dataStyle = workbook.createCellStyle();
|
||||||
|
dataStyle.setBorderBottom(BorderStyle.THIN);
|
||||||
|
dataStyle.setBorderTop(BorderStyle.THIN);
|
||||||
|
dataStyle.setBorderRight(BorderStyle.THIN);
|
||||||
|
dataStyle.setBorderLeft(BorderStyle.THIN);
|
||||||
|
dataStyle.setWrapText(true);
|
||||||
|
|
||||||
|
// 创建表头
|
||||||
|
Row headerRow = sheet.createRow(0);
|
||||||
|
String[] headers = {"场景ID", "设备ID", "时点", "属性值", "Keff值"};
|
||||||
|
for (int i = 0; i < headers.length; i++) {
|
||||||
|
Cell cell = headerRow.createCell(i);
|
||||||
|
cell.setCellValue(headers[i]);
|
||||||
|
cell.setCellStyle(headerStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 填充数据
|
||||||
|
int rowNum = 1;
|
||||||
|
for (ScenarioResult result : results) {
|
||||||
|
Row row = sheet.createRow(rowNum++);
|
||||||
|
|
||||||
|
Cell cell0 = row.createCell(0);
|
||||||
|
cell0.setCellValue(result.getScenarioId());
|
||||||
|
cell0.setCellStyle(dataStyle);
|
||||||
|
|
||||||
|
Cell cell1 = row.createCell(1);
|
||||||
|
cell1.setCellValue(result.getDeviceId());
|
||||||
|
cell1.setCellStyle(dataStyle);
|
||||||
|
|
||||||
|
Cell cell2 = row.createCell(2);
|
||||||
|
cell2.setCellValue(result.getStep());
|
||||||
|
cell2.setCellStyle(dataStyle);
|
||||||
|
|
||||||
|
Cell cell3 = row.createCell(3);
|
||||||
|
cell3.setCellValue(result.getAttrState().toString());
|
||||||
|
cell3.setCellStyle(dataStyle);
|
||||||
|
|
||||||
|
Cell cell4 = row.createCell(4);
|
||||||
|
cell4.setCellValue(result.getKeffValue().doubleValue());
|
||||||
|
cell4.setCellStyle(dataStyle);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 自动调整列宽
|
||||||
|
for (int i = 0; i < headers.length; i++) {
|
||||||
|
sheet.autoSizeColumn(i);
|
||||||
|
// 设置最小列宽
|
||||||
|
if (sheet.getColumnWidth(i) < 20 * 256) {
|
||||||
|
sheet.setColumnWidth(i, 20 * 256);
|
||||||
|
}
|
||||||
|
// 设置最大列宽
|
||||||
|
if (sheet.getColumnWidth(i) > 50 * 256) {
|
||||||
|
sheet.setColumnWidth(i, 50 * 256);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 写入响应输出流
|
||||||
|
workbook.write(response.getOutputStream());
|
||||||
|
workbook.close();
|
||||||
|
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException("导出失败:" + e.getMessage(), e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user