Merge remote-tracking branch 'xnjz/master'

This commit is contained in:
zhangtao 2025-01-04 16:30:15 +08:00
commit e20d5c8c8b
8 changed files with 230 additions and 16 deletions

View File

@ -10,6 +10,7 @@ import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.bind.annotation.*;
@ -75,11 +76,14 @@ public class DatasetQuestionController {
// 创建样式并设置垂直居中
HSSFCellStyle cellStyle = template.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
int count = 0;
List<Integer> id = new ArrayList<>();
HSSFRow row = sheet.createRow(count);
row.createCell(0).setCellValue("问题内容");
row.getCell(0).setCellStyle(cellStyle);
row.createCell(1).setCellValue("标注内容");
row.getCell(1).setCellStyle(cellStyle);
id.add(count);
count++;
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
@ -91,14 +95,18 @@ public class DatasetQuestionController {
if (collect.size() == 0){
row = sheet.createRow(count);
row.createCell(0).setCellValue(question);
row.getCell(0).setCellStyle(cellStyle);
row.createCell(1).setCellValue("");
row.getCell(1).setCellStyle(cellStyle);
id.add(count);
count++;
}else {
for (String s : collect) {
row = sheet.createRow(count);
row.createCell(0).setCellValue(question);
row.getCell(0).setCellStyle(cellStyle);
row.createCell(1).setCellValue(s);
row.getCell(1).setCellStyle(cellStyle);
count++;
}
id.add(count-1);

View File

@ -1,11 +1,16 @@
package cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.manualAnnoVo.ManualModelAnswerPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.manualAnnoVo.ManualModelAnswerSaveReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualAssessmentPageRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskManualPageReqVO;
import cn.iocoder.yudao.module.llm.service.modelassesstaskmanual.ManualModelAnswerService;
import cn.iocoder.yudao.module.llm.utils.ManalExcelExportUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -13,11 +18,14 @@ import org.springframework.security.access.prepost.PreAuthorize;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Operation;
import javax.servlet.http.HttpServletResponse;
import javax.validation.*;
import java.io.IOException;
import java.util.*;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import static cn.iocoder.yudao.framework.apilog.core.enums.OperateTypeEnum.EXPORT;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -45,6 +53,17 @@ public class ManualModelAnswerController {
return success(true);
}
@GetMapping("/export-excel")
@Operation(summary = "导出模型评估人工标注 模型回答 Excel")
@PreAuthorize("@ss.hasPermission('llm:manual-model-answer:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportManualModelAnswerExcel(@Valid ManualModelAnswerPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ManualAssessmentPageRespVO> list = manualModelAnswerService.getManualAssessment(pageReqVO).getList();
// 导出 Excel
ManalExcelExportUtils.write(response, "模型评估人工标注 模型回答.xls", "数据",ManualAssessmentPageRespVO.class,list);
}
/* @PostMapping("/create")
@Operation(summary = "创建模型评估人工标注 模型回答")
@PreAuthorize("@ss.hasPermission('llm:manual-model-answer:create')")

View File

@ -10,6 +10,7 @@ import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.manual
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ManualModelAnswerDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ModelAssessTaskDimensionDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanual.ModelAssessTaskManualDO;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -23,11 +24,9 @@ import java.util.List;
@Data
public class ManualAssessmentPageRespVO {
@Schema(description = "评估任务ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16493")
@ExcelProperty("评估任务ID")
private Long id;
@Schema(description = "模型服务")
@ExcelProperty("模型服务")
private Long modelService;
@Schema(description = "数据集")
@ -44,25 +43,32 @@ public class ManualAssessmentPageRespVO {
private Integer progress;
@Schema(description = "模型服务名称")
@ExcelProperty("模型名称")
private String modelServiceName;
@Schema(description = "数据集名称")
@ExcelProperty("数据集名称")
private String datasetName;
@Schema(description = "数据集问题")
@ExcelProperty("Prompt")
private String question;
@Schema(description = "数据集答案")
// @ExcelProperty("Response(参考回答)")
private List<DatasetAnswerRespVO> answers;
@Schema(description = "人工标注主表id")
private Long manalTaskId;
@Schema(description = "模型回答答案")
@ExcelProperty("Completion(模型回答)")
private String modelAnswer;
/* @Schema(description = "人工评估信息返回")
private List<ManualModelAnnoRespVO> reqRespVos;*/
@Schema(description = "人工评估信息ListMap返回")
@ExcelIgnore
private List<HashMap<String, Object>> reqRespVos;
@Schema(description = "系统信息")

View File

@ -2,8 +2,10 @@ package cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanualbackup
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualAssessmentPageRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualEvaluationReportRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskManualRespVO;
import cn.iocoder.yudao.module.llm.utils.ManalExcelExportUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -104,13 +106,13 @@ public class ModelAssessTaskManualBackupController {
@Operation(summary = "导出人工评估备份 Excel")
@PreAuthorize("@ss.hasPermission('llm:model-assess-task-manual-backup:export')")
@ApiAccessLog(operateType = EXPORT)
public void exportModelAssessTaskManualBackupExcel(@Valid ModelAssessTaskManualBackupPageReqVO pageReqVO,
public void exportModelAssessTaskManualBackupExcel(@Valid ManualModelAnswerBackupPageReqVO pageReqVO,
HttpServletResponse response) throws IOException {
pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
List<ModelAssessTaskManualBackupDO> list = modelAssessTaskManualBackupService.getModelAssessTaskManualBackupPage(pageReqVO).getList();
List<ManualAssessmentPageRespVO> list = modelAssessTaskManualBackupService.getManualAssessment(pageReqVO).getList();
// 导出 Excel
ExcelUtils.write(response, "人工评估备份.xls", "数据", ModelAssessTaskManualBackupRespVO.class,
BeanUtils.toBean(list, ModelAssessTaskManualBackupRespVO.class));
ManalExcelExportUtils.write(response, "人工评估备份.xls", "人工评估导出备份", ModelAssessTaskManualBackupRespVO.class,
list);
}
@GetMapping("/gitReport")
@Operation(summary = "查看报告详情")

View File

@ -14,7 +14,8 @@ import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class ModelAssessTaskManualBackupPageReqVO extends PageParam {
@Schema(description = "导出id 主表id")
private Long id;
@Schema(description = "原评估信息Id", example = "8848")
private Long srcId;

View File

@ -5,6 +5,8 @@ import javax.validation.*;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.manualAnnoVo.ManualModelAnswerPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualAssessmentPageRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualEvaluationReportRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanualbackup.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanualbackup.ModelAssessTaskManualBackupDO;
@ -69,5 +71,9 @@ public interface ModelAssessTaskManualBackupService {
ModelAssessTaskAutoRespVO getModelAssessTaskAuto(Long id);
PageResult<ModelAssessTaskManualBackupRespVO> getModelAssessTaskManualPage1(ModelAssessTaskManualBackupPageReqVO pageReqVO);
// 备份导出列表查询
PageResult<ManualAssessmentPageRespVO> getManualAssessment(ManualModelAnswerBackupPageReqVO pageReqVO);
}

View File

@ -1,14 +1,15 @@
package cn.iocoder.yudao.module.llm.service.modelassesstaskmanualbackup;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetAnswerRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskAutoRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskauto.vo.ModelAssessTaskStoplistRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.LabelInformationVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualEvaluationReportRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskDimensionRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ModelAssessTaskManualRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.manualAnnoVo.ManualModelAnswerPageReqVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.*;
import cn.iocoder.yudao.module.llm.dal.dataobject.basemodel.BaseModelDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetAnswerDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.dataset.DatasetQuestionDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassessstoplist.ModelAssessStoplistDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskAutoBackupDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskauto.ModelAssessTaskAutoDO;
@ -22,7 +23,9 @@ import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanualbackup.Ma
import cn.iocoder.yudao.module.llm.dal.dataobject.modelassesstaskmanualbackup.ModelAssessTaskDimensionBackupDO;
import cn.iocoder.yudao.module.llm.dal.dataobject.modelservice.ModelServiceDO;
import cn.iocoder.yudao.module.llm.dal.mysql.basemodel.BaseModelMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetAnswerMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.dataset.DatasetQuestionMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.modelassessstoplist.ModelAssessStoplistMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto.ModelAssessTaskAutoBackupMapper;
import cn.iocoder.yudao.module.llm.dal.mysql.modelassesstaskauto.ModelAssessTaskStoplistBackupMapper;
@ -84,6 +87,10 @@ public class ModelAssessTaskManualBackupServiceImpl implements ModelAssessTaskMa
private ModelAssessTaskStoplistBackupMapper modelAssessTaskStoplistBackupMapper;
@Resource
private ModelAssessStoplistMapper modelAssessStoplistMapper;
@Resource
private DatasetQuestionMapper datasetQuestionMapper;
@Resource
private DatasetAnswerMapper datasetAnswerMapper;
@Override
public Long createModelAssessTaskManualBackup(ModelAssessTaskManualBackupSaveReqVO createReqVO) {
@ -332,16 +339,22 @@ public class ModelAssessTaskManualBackupServiceImpl implements ModelAssessTaskMa
List<Long> serviceMyIds = modelAssessTaskManualDOPageResult.getList().stream().
filter(modelAssessTaskManualDO -> modelAssessTaskManualDO.getModelType() == 0)
.map(ModelAssessTaskManualBackupDO::getModelService).collect(Collectors.toList());
List<ModelServiceDO> modelServiceDOS = modelServiceMapper.selectList(new LambdaQueryWrapper<ModelServiceDO>()
.in(ModelServiceDO::getId,serviceMyIds));
List<ModelServiceDO> modelServiceDOS = new ArrayList<>();
if (CollectionUtils.isNotEmpty(serviceMyIds)){
modelServiceDOS = modelServiceMapper.selectList(new LambdaQueryWrapper<ModelServiceDO>()
.in(ModelServiceDO::getId,serviceMyIds));
}
Map<Long, ModelServiceDO> serviceMyMaps = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(modelServiceDOS, ModelServiceDO::getId);
// 人工模型获取校验
List<Long> serviceForeseeIds = modelAssessTaskManualDOPageResult.getList().stream().
filter(modelAssessTaskManualDO -> modelAssessTaskManualDO.getModelType() == 1)
.map(ModelAssessTaskManualBackupDO::getModelService).collect(Collectors.toList());
List<BaseModelDO> baseModelDOS = baseModelMapper.selectList(new LambdaQueryWrapper<BaseModelDO>()
.in(BaseModelDO::getId, serviceForeseeIds));
List<BaseModelDO> baseModelDOS = new ArrayList<>();
if (CollectionUtils.isNotEmpty(serviceForeseeIds)){
baseModelDOS = baseModelMapper.selectList(new LambdaQueryWrapper<BaseModelDO>()
.in(BaseModelDO::getId, serviceForeseeIds));
}
Map<Long, BaseModelDO> serviceForeseeMaps = cn.iocoder.yudao.framework.common.util.collection.
CollectionUtils.convertMap(baseModelDOS, BaseModelDO::getId);
result.getList().stream().forEach(modelAssessTaskManualRespVO -> {
@ -361,6 +374,44 @@ public class ModelAssessTaskManualBackupServiceImpl implements ModelAssessTaskMa
}
return result;
}
@Override
public PageResult<ManualAssessmentPageRespVO> getManualAssessment(ManualModelAnswerBackupPageReqVO pageReqVO) {
ModelAssessTaskManualBackupRespVO modelAssessTaskManual = getModelAssessTaskManualBackup1(pageReqVO.getManalTaskId());
PageResult<ManualAssessmentPageRespVO> result = new PageResult<>();
PageResult<ManualModelAnswerBackupDO> modelAnswerDOPageResult = manualModelAnswerBackupMapper.selectPage(pageReqVO);
List<ManualAssessmentPageRespVO> res = new ArrayList<>();
if(!cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.isAnyEmpty(modelAnswerDOPageResult.getList())){
modelAnswerDOPageResult.getList().forEach(modelAnswerDO -> {
ManualAssessmentPageRespVO resp = BeanUtils.toBean(modelAssessTaskManual, ManualAssessmentPageRespVO.class);
DatasetQuestionDO datasetQuestionDO = datasetQuestionMapper.selectById(modelAnswerDO.getQuestionId());
List<DatasetAnswerDO> datasetAnswerDOS = datasetAnswerMapper.selectList(new LambdaQueryWrapper<>(DatasetAnswerDO.class).eq(DatasetAnswerDO::getQuestionId, modelAnswerDO.getQuestionId()));
resp.setQuestion(datasetQuestionDO.getQuestion());
resp.setSystem(datasetQuestionDO.getSystem());
resp.setAnswers(BeanUtils.toBean(datasetAnswerDOS, DatasetAnswerRespVO.class));
resp.setModelAnswer(modelAnswerDO.getModelAnswer());
resp.setId(modelAnswerDO.getId());
resp.setStatus(modelAnswerDO.getStatus());
resp.setManalTaskId(modelAnswerDO.getManalTaskId());
if (!cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.isAnyEmpty(modelAnswerDO.getReqRespVos())){
resp.setReqRespVos(modelAnswerDO.getReqRespVos());
}else {
if (!cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.isAnyEmpty(modelAssessTaskManual.getDimensions())){
List<HashMap<String, Object>> map = new ArrayList<>();
modelAssessTaskManual.getDimensions().forEach(dimension -> {
HashMap<String, Object> map1 = new HashMap<>();
map1.put("label", dimension.getDimensionName());
map1.put("score", 0);
map.add(map1);
});
resp.setReqRespVos(map);
}
}
res.add(resp);
});
}
result.setList(res);
result.setTotal(modelAnswerDOPageResult.getTotal());
return result;
}
}

View File

@ -0,0 +1,121 @@
package cn.iocoder.yudao.module.llm.utils;
import cn.iocoder.yudao.framework.common.util.collection.CollectionUtils;
import cn.iocoder.yudao.module.llm.controller.admin.dataset.vo.DatasetAnswerRespVO;
import cn.iocoder.yudao.module.llm.controller.admin.modelassesstaskmanual.vo.ManualAssessmentPageRespVO;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;
public class ManalExcelExportUtils {
public static <T> void write(HttpServletResponse response, String filename, String sheetName,
Class<T> head, List<ManualAssessmentPageRespVO> data) throws IOException {
HSSFWorkbook template = new HSSFWorkbook();
HSSFSheet sheet = template.createSheet(sheetName);
HSSFCellStyle cellStyle = template.createCellStyle();
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 创建样式并设置垂直居中
int count = 0;
HSSFRow row = sheet.createRow(count);
row.createCell(0).setCellValue("模型名称");
row.createCell(1).setCellValue("结果集名称");
row.createCell(2).setCellValue("System(人设信息)");
row.createCell(3).setCellValue("Prompt");
row.createCell(4).setCellValue("Response(参考回答)");
row.createCell(5).setCellValue("Completion(模型回答)");
List<ManualAssessmentPageRespVO> collect1 = data.stream().filter(item -> item.getStatus() == 2).collect(Collectors.toList());
HashMap<String, Integer> rowMap = new HashMap<>();
if (collect1.size() != 0) {
int num = 6;
List<HashMap<String, Object>> reqRespVos = collect1.get(0).getReqRespVos();
for (HashMap<String, Object> map : reqRespVos) {
row.createCell(num).setCellValue(String.valueOf(map.get("label")));
rowMap.put(String.valueOf(map.get("label")), Integer.valueOf(num));
num++;
}
}
count++;
List<Integer> id = new ArrayList<>();
for (ManualAssessmentPageRespVO item : data) {
List<DatasetAnswerRespVO> datasetAnswerRespVO = item.getAnswers();
List<String> collect = datasetAnswerRespVO.stream().map(DatasetAnswerRespVO::getAnswer).collect(Collectors.toList());
int start = count;
row = sheet.createRow(count);
row.createCell(0).setCellValue(item.getModelServiceName() == null ? "" : item.getModelServiceName());
row.getCell(0).setCellStyle(cellStyle);
row.createCell(1).setCellValue(item.getDatasetName() == null ? "" : item.getDatasetName());
row.getCell(1).setCellStyle(cellStyle);
row.createCell(2).setCellValue("-");
row.getCell(2).setCellStyle(cellStyle);
row.createCell(3).setCellValue(item.getQuestion() == null ? "" : item.getQuestion());
row.getCell(3).setCellStyle(cellStyle);
row.createCell(4).setCellValue(collect.get(0) == null ? "" : collect.get(0));
row.getCell(4).setCellStyle(cellStyle);
row.createCell(5).setCellValue(item.getModelAnswer() == null ? "" : item.getModelAnswer());
row.getCell(5).setCellStyle(cellStyle);
if (!CollectionUtils.isAnyEmpty(item.getReqRespVos())) {
for (HashMap<String, Object> map : item.getReqRespVos()) {
int num = rowMap.get(String.valueOf(map.get("label")));
row.createCell(num).setCellValue(String.valueOf(map.get("score")) == null ? "" : String.valueOf(map.get("score")));
row.getCell(num).setCellStyle(cellStyle);
}
}
count++;
if (collect.size() > 1) {
for (int i = 1; i < collect.size(); i++) {
row = sheet.createRow(count);
row.createCell(4).setCellValue(collect.get(i));
row.getCell(4).setCellStyle(cellStyle);
count++;
}
}
int end = count - 1;
if (start != end) {
sheet.addMergedRegion(new CellRangeAddress(start, end, 0, 0));
sheet.addMergedRegion(new CellRangeAddress(start, end, 1, 1));
sheet.addMergedRegion(new CellRangeAddress(start, end, 2, 2));
sheet.addMergedRegion(new CellRangeAddress(start, end, 3, 3));
sheet.addMergedRegion(new CellRangeAddress(start, end, 5, 5));
if (!CollectionUtils.isAnyEmpty(item.getReqRespVos())) {
for (HashMap<String, Object> map : item.getReqRespVos()) {
int num = rowMap.get(String.valueOf(map.get("label")));
sheet.addMergedRegion(new CellRangeAddress(start, end, num, num));
}
}
}
}
// 导出 Excel
try {
response.setCharacterEncoding("UTF-8");
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
template.write(response.getOutputStream());
response.getOutputStream().close();
template.close();
} catch (IOException e) {
e.printStackTrace();
}
/* // 设置 header contentType写在最后的原因是避免报错时响应 contentType 已经被修改了
response.addHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, StandardCharsets.UTF_8.name()));
response.setContentType("application/vnd.ms-excel;charset=UTF-8");*/
}
}