EvaluateResultServiceImpl.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. package com.xjrsoft.module.evaluate.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.mybatisplus.core.metadata.IPage;
  5. import com.github.yulichang.base.MPJBaseServiceImpl;
  6. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  7. import com.xjrsoft.common.enums.DeleteMark;
  8. import com.xjrsoft.common.enums.EnabledMark;
  9. import com.xjrsoft.common.exception.MyException;
  10. import com.xjrsoft.common.mybatis.SqlRunnerAdapter;
  11. import com.xjrsoft.common.page.ConventPage;
  12. import com.xjrsoft.common.utils.VoToColumnUtil;
  13. import com.xjrsoft.module.base.entity.BaseClass;
  14. import com.xjrsoft.module.evaluate.dto.AddEvaluateResultDto;
  15. import com.xjrsoft.module.evaluate.dto.EvaluateResultDetailPageDetailDto;
  16. import com.xjrsoft.module.evaluate.dto.EvaluateResultDetailPageDto;
  17. import com.xjrsoft.module.evaluate.dto.EvaluateResultIndexPageDto;
  18. import com.xjrsoft.module.evaluate.dto.EvaluateResultSaveDto;
  19. import com.xjrsoft.module.evaluate.dto.ResultViewingPageDto;
  20. import com.xjrsoft.module.evaluate.entity.EvaluateExecuter;
  21. import com.xjrsoft.module.evaluate.entity.EvaluateManage;
  22. import com.xjrsoft.module.evaluate.entity.EvaluateManageItem;
  23. import com.xjrsoft.module.evaluate.entity.EvaluateObject;
  24. import com.xjrsoft.module.evaluate.entity.EvaluateResult;
  25. import com.xjrsoft.module.evaluate.entity.EvaluateSubmitRecord;
  26. import com.xjrsoft.module.evaluate.mapper.EvaluateExecuterMapper;
  27. import com.xjrsoft.module.evaluate.mapper.EvaluateManageItemMapper;
  28. import com.xjrsoft.module.evaluate.mapper.EvaluateObjectMapper;
  29. import com.xjrsoft.module.evaluate.mapper.EvaluateResultMapper;
  30. import com.xjrsoft.module.evaluate.mapper.EvaluateSubmitRecordMapper;
  31. import com.xjrsoft.module.evaluate.service.IEvaluateResultService;
  32. import com.xjrsoft.module.evaluate.vo.EvaluateResultDetailPageDetailVo;
  33. import com.xjrsoft.module.evaluate.vo.EvaluateResultDetailPageVo;
  34. import com.xjrsoft.module.evaluate.vo.EvaluateResultIndexPageVo;
  35. import com.xjrsoft.module.evaluate.vo.MobileResultPageVo;
  36. import com.xjrsoft.module.evaluate.vo.ResultViewingListVo;
  37. import com.xjrsoft.module.evaluate.vo.ResultViewingPageVo;
  38. import com.xjrsoft.module.teacher.entity.XjrUser;
  39. import lombok.AllArgsConstructor;
  40. import me.zhyd.oauth.log.Log;
  41. import org.apache.poi.ss.usermodel.BorderStyle;
  42. import org.apache.poi.ss.usermodel.Cell;
  43. import org.apache.poi.ss.usermodel.CellStyle;
  44. import org.apache.poi.ss.usermodel.Font;
  45. import org.apache.poi.ss.usermodel.Row;
  46. import org.apache.poi.ss.usermodel.Sheet;
  47. import org.apache.poi.ss.usermodel.Workbook;
  48. import org.apache.poi.ss.util.CellRangeAddress;
  49. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  50. import org.springframework.stereotype.Service;
  51. import org.springframework.transaction.annotation.Transactional;
  52. import java.io.ByteArrayOutputStream;
  53. import java.math.BigDecimal;
  54. import java.math.RoundingMode;
  55. import java.util.ArrayList;
  56. import java.util.Date;
  57. import java.util.HashMap;
  58. import java.util.List;
  59. import java.util.Map;
  60. import java.util.Set;
  61. import java.util.stream.Collectors;
  62. /**
  63. * @title: 评价结果
  64. * @Author szs
  65. * @Date: 2024-01-16
  66. * @Version 1.0
  67. */
  68. @Service
  69. @AllArgsConstructor
  70. public class EvaluateResultServiceImpl extends MPJBaseServiceImpl<EvaluateResultMapper, EvaluateResult> implements IEvaluateResultService {
  71. private EvaluateObjectMapper evaluateObjectMapper;
  72. private EvaluateResultMapper evaluateResultMapper;
  73. private EvaluateManageItemMapper evaluateManageItemMapper;
  74. private EvaluateSubmitRecordMapper evaluateSubmitRecordMapper;
  75. private EvaluateExecuterMapper evaluateExecuterMapper;
  76. @Override
  77. public IPage<EvaluateResultIndexPageVo> getIndexPage(EvaluateResultIndexPageDto dto) {
  78. IPage<EvaluateResultIndexPageVo> page = evaluateResultMapper.getIndexPage(ConventPage.getPage(dto), dto);
  79. return page;
  80. }
  81. @Override
  82. public IPage<EvaluateResultDetailPageVo> getDetailPage(EvaluateResultDetailPageDto dto) {
  83. //获取当前评价管理下的所有记录的page
  84. IPage<EvaluateResultDetailPageVo> page = evaluateResultMapper.getDetailPage(ConventPage.getPage(dto), dto);
  85. return page;
  86. }
  87. @Override
  88. public EvaluateResultDetailPageDetailVo getDetailPageDetail(EvaluateResultDetailPageDetailDto dto) {
  89. //根据评价管理主键编号,被评对象id,执行人id获取总得分,被评对象名字,执行人名字,评价管理名字,题目满分
  90. EvaluateResultDetailPageDetailVo evaluateResultDetailPageDetailVo = evaluateResultMapper.getDetailPageDetail(dto);
  91. if (evaluateResultDetailPageDetailVo == null) {
  92. return evaluateResultDetailPageDetailVo;
  93. }
  94. //获取list
  95. evaluateResultDetailPageDetailVo.setEvaluateResultDetailPageDetailList(evaluateResultMapper.getDetailPageDetailList(dto));
  96. return evaluateResultDetailPageDetailVo;
  97. }
  98. @Override
  99. public List<ResultViewingPageVo> pageResultViewing(ResultViewingPageDto dto) {
  100. List<ResultViewingPageVo> resultData = new ArrayList<>();
  101. //获取该评价管理下的被评对象-分页
  102. MPJLambdaWrapper<EvaluateObject> evaluateObjectMPJLambdaWrapper = new MPJLambdaWrapper<>();
  103. evaluateObjectMPJLambdaWrapper
  104. .distinct()
  105. .selectAs(EvaluateObject::getObjectId, ResultViewingPageVo::getObjectId)
  106. .select("ifnull(t1.name, t2.name) as objectIdCN")
  107. .leftJoin(XjrUser.class, XjrUser::getId, EvaluateObject::getObjectId)
  108. .leftJoin(BaseClass.class, BaseClass::getId, EvaluateObject::getObjectId)
  109. .eq(EvaluateObject::getEvaluateManageId, dto.getEvaluateManageId())
  110. .eq((dto.getBaseGradeId() != null && dto.getBaseGradeId() > 0), BaseClass::getGradeId, dto.getBaseGradeId())
  111. .eq((dto.getClassId() != null && dto.getClassId() > 0), BaseClass::getId, dto.getClassId())
  112. .eq(ObjectUtil.isNotNull(dto.getTeacherId()), EvaluateObject::getObjectId, dto.getTeacherId())
  113. .like((dto.getName() != null && !("").equals(dto.getName())), XjrUser::getName, dto.getName())
  114. .disableSubLogicDel();
  115. List<ResultViewingPageVo> list = evaluateObjectMapper.selectJoinList(ResultViewingPageVo.class, evaluateObjectMPJLambdaWrapper);
  116. //被评对象的id集合
  117. List<Long> evaluateObjectIdList = new ArrayList<>();
  118. for (ResultViewingPageVo resultViewingPageVo : list) {
  119. evaluateObjectIdList.add(resultViewingPageVo.getObjectId());
  120. }
  121. //获取该评价管理下的所有题目-多个
  122. MPJLambdaWrapper<EvaluateManageItem> evaluateManageItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
  123. evaluateManageItemMPJLambdaWrapper
  124. .eq(EvaluateManageItem::getEvaluateManageId, dto.getEvaluateManageId());
  125. List<EvaluateManageItem> evaluateManageItemList = evaluateManageItemMapper.selectList(evaluateManageItemMPJLambdaWrapper);
  126. //题目的id集合
  127. //将题目处理成Map
  128. List<Long> evaluateManageItemIdList = new ArrayList<>();
  129. Map<Long, EvaluateManageItem> evaluateManageItemMap = new HashMap<>();
  130. for (EvaluateManageItem evaluateManageItem : evaluateManageItemList) {
  131. evaluateManageItemIdList.add(evaluateManageItem.getId());
  132. evaluateManageItemMap.put(evaluateManageItem.getId(), evaluateManageItem);
  133. }
  134. //获取该评价管理下的被评对象的应打分人数,实际打分人数
  135. MPJLambdaWrapper<EvaluateExecuter> evaluateExecuterMPJLambdaWrapper = new MPJLambdaWrapper<>();
  136. evaluateExecuterMPJLambdaWrapper
  137. .select(EvaluateExecuter::getId)
  138. .selectAs(EvaluateObject::getObjectId, ResultViewingPageVo::getObjectId)
  139. .select(EvaluateExecuter::getStatus)//这里值得推敲
  140. .leftJoin(EvaluateObject.class, EvaluateObject::getId, EvaluateExecuter::getEvaluateObjectId)
  141. .eq(EvaluateExecuter::getEvaluateManageId, dto.getEvaluateManageId())
  142. .in(!evaluateObjectIdList.isEmpty(), EvaluateObject::getObjectId, evaluateObjectIdList)
  143. .disableSubLogicDel();
  144. List<ResultViewingPageVo> planAndActualExecuterNum = evaluateExecuterMapper.selectJoinList(ResultViewingPageVo.class, evaluateExecuterMPJLambdaWrapper);
  145. //将应打分人数,实际打分人数处理成Map
  146. Map<Long, List<ResultViewingPageVo>> planAndActualExecuterNumMap = planAndActualExecuterNum.stream().filter(x -> x.getStatus() == 2).collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId));
  147. Map<Long, List<ResultViewingPageVo>> planAndShouldExecuterNumMap = planAndActualExecuterNum.stream().collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId));
  148. Map<Long, List<ResultViewingPageVo>> groupedByObjectIdList = new HashMap<>();
  149. //获取该评价管理下的所有被评对象的所有题的总得分
  150. if (!evaluateManageItemIdList.isEmpty()) {
  151. List<ResultViewingPageVo> listByObjectIdAndEvaluateItemId = evaluateResultMapper.listByObjectIdAndEvaluateItemId(evaluateObjectIdList, evaluateManageItemIdList);
  152. //将所有被评对象的所有题的总得分处理成Map
  153. groupedByObjectIdList = listByObjectIdAndEvaluateItemId.stream()
  154. .collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId));
  155. }
  156. List<ResultViewingListVo> resultViewingList = evaluateResultMapper.getResultViewingList(dto);
  157. //遍历分页记录
  158. for (ResultViewingPageVo resultViewingPageVo : list) {
  159. List<ResultViewingPageVo> resultViewingPageVoList = groupedByObjectIdList.get(resultViewingPageVo.getObjectId());
  160. Map<Long, List<ResultViewingListVo>> itemMaps = resultViewingList.stream().filter(x -> x.getObjectId().equals(resultViewingPageVo.getObjectId()))
  161. .collect(Collectors.groupingBy(ResultViewingListVo::getEvaluateManageItemId));
  162. if(itemMaps.isEmpty()){
  163. continue;
  164. }
  165. if(resultViewingPageVoList != null && !resultViewingPageVoList.isEmpty()){
  166. for (ResultViewingPageVo r : resultViewingPageVoList) {
  167. double v = itemMaps.get(r.getEvaluateManageItemId()).stream().mapToDouble(ResultViewingListVo::getScore).average().orElse(0.0);
  168. resultData.add(new ResultViewingPageVo(){{
  169. setObjectId(resultViewingPageVo.getObjectId());
  170. setObjectIdCN(resultViewingPageVo.getObjectIdCN());
  171. setEvaluateManageItemId(r.getEvaluateManageItemId());
  172. setProblem(evaluateManageItemMap.get(r.getEvaluateManageItemId()).getProblem());
  173. setTopic(evaluateManageItemMap.get(r.getEvaluateManageItemId()).getTopic());
  174. setPlanExecuterNum(planAndShouldExecuterNumMap.get(resultViewingPageVo.getObjectId()).size());
  175. int actualExecuterNum = planAndActualExecuterNumMap.get(resultViewingPageVo.getObjectId()).size();
  176. setActualExecuterNum(actualExecuterNum);
  177. setSumScore(BigDecimal.valueOf(v).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  178. }});
  179. }
  180. }
  181. }
  182. Map<Long, Double> synthesisScoreMap = resultData.stream().collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId, Collectors.summingDouble(ResultViewingPageVo::getScore)));
  183. Map<String, Double> itemListMaps = new HashMap<>();
  184. Map<Long, List<ResultViewingPageVo>> personListMap = resultData.stream().collect(Collectors.groupingBy(ResultViewingPageVo::getObjectId));
  185. for (Long objectId : personListMap.keySet()) {
  186. List<ResultViewingPageVo> itemList = personListMap.get(objectId);
  187. Map<String, Double> itemListMap = itemList.stream().collect(Collectors.groupingBy(ResultViewingPageVo::getTopic, Collectors.summingDouble(ResultViewingPageVo::getScore)));
  188. for (String topic : itemListMap.keySet()) {
  189. itemListMaps.put(objectId + "" + topic, itemListMap.get(topic));
  190. }
  191. }
  192. for (ResultViewingPageVo pageVo : resultData) {
  193. pageVo.setSynthesisScore(BigDecimal .valueOf(synthesisScoreMap.get(pageVo.getObjectId())).setScale(2, RoundingMode.HALF_UP).doubleValue() + "");
  194. Double itemScore = itemListMaps.get(pageVo.getObjectId() + "" + pageVo.getTopic());
  195. pageVo.setTopicScore(BigDecimal .valueOf(itemScore).setScale(2, RoundingMode.HALF_UP).doubleValue()+ "");
  196. }
  197. return resultData;
  198. }
  199. @Override
  200. @Transactional
  201. public String saveBatch(EvaluateResultSaveDto dto) {
  202. Date createDate = new Date();
  203. //获取当前评价管理的相关信息
  204. MPJLambdaWrapper<EvaluateSubmitRecord> evaluateSubmitRecordMPJLambdaWrapper = new MPJLambdaWrapper<>();
  205. evaluateSubmitRecordMPJLambdaWrapper
  206. .selectAs(EvaluateSubmitRecord::getId, MobileResultPageVo::getEvaluateSubmitRecordId)
  207. .selectAs(EvaluateSubmitRecord::getEvaluateManageId, MobileResultPageVo::getEvaluateManageId)
  208. .selectAs(EvaluateSubmitRecord::getEvaluatedObjectId, MobileResultPageVo::getEvaluateObjectId)
  209. .selectAs(EvaluateSubmitRecord::getEvaluateExecuterId, MobileResultPageVo::getEvaluateUserId)
  210. .selectAs(EvaluateSubmitRecord::getStatus, MobileResultPageVo::getEvaluateStatus)
  211. .selectAs(EvaluateSubmitRecord::getEvaluatedObject, MobileResultPageVo::getEvaluateType)
  212. .selectAs(EvaluateManage::getIsAutoCreate, MobileResultPageVo::getIsAutoCreate)
  213. .leftJoin(EvaluateManage.class, EvaluateManage::getId, EvaluateSubmitRecord::getEvaluateManageId)
  214. .eq(EvaluateSubmitRecord::getId, dto.getEvaluateSubmitRecordId());
  215. MobileResultPageVo mobileResultPageVo = evaluateSubmitRecordMapper.selectJoinOne(MobileResultPageVo.class, evaluateSubmitRecordMPJLambdaWrapper);
  216. if(mobileResultPageVo == null){
  217. return "该评价已失效!";
  218. }
  219. // if(mobileResultPageVo.getEvaluateStatus() == 2){
  220. // return "已经评价,请勿重复评价";
  221. // }
  222. //评价结果保存
  223. String delSql = "DELETE FROM evaluate_result WHERE submit_record_id = '" + mobileResultPageVo.getEvaluateSubmitRecordId() + "'";
  224. SqlRunnerAdapter.db().delete(delSql);
  225. List<AddEvaluateResultDto> resultList = dto.getResultList();
  226. for (AddEvaluateResultDto addEvaluateResultDto : resultList) {
  227. EvaluateResult evaluateResult = BeanUtil.toBean(addEvaluateResultDto, EvaluateResult.class);
  228. evaluateResult.setEvaluatedObject(mobileResultPageVo.getEvaluateType());
  229. evaluateResult.setUserId(Long.parseLong(mobileResultPageVo.getEvaluateUserId()));
  230. evaluateResult.setEvaluatedObjectId(Long.parseLong(mobileResultPageVo.getEvaluateObjectId()));
  231. evaluateResult.setDeleteMark(DeleteMark.NODELETE.getCode());
  232. evaluateResult.setEnabledMark(EnabledMark.ENABLED.getCode());
  233. evaluateResult.setCreateDate(createDate);
  234. evaluateResult.setSubmitRecordId(mobileResultPageVo.getEvaluateSubmitRecordId());
  235. evaluateResultMapper.insert(evaluateResult);
  236. }
  237. //修改答题人状态
  238. evaluateExecuterMapper.updateById(new EvaluateExecuter(){{
  239. setId(Long.parseLong(mobileResultPageVo.getEvaluateUserId()));
  240. if(dto.getSubmitType() != null && dto.getSubmitType() == 1){
  241. setStatus(1);
  242. } else {
  243. setStatus(2);
  244. }
  245. }});
  246. //修改提交记录状态
  247. evaluateSubmitRecordMapper.updateById(new EvaluateSubmitRecord(){{
  248. setId(mobileResultPageVo.getEvaluateSubmitRecordId());
  249. if(dto.getSubmitType() != null && dto.getSubmitType() == 1){
  250. setStatus(1);
  251. } else {
  252. setStatus(2);
  253. }
  254. }});
  255. return "ok";
  256. }
  257. @Override
  258. public byte[] getList(ResultViewingPageDto dto) {
  259. try {
  260. List<ResultViewingPageVo> list = this.pageResultViewing(dto);
  261. //查询有多少个题目
  262. MPJLambdaWrapper<EvaluateManageItem> evaluateManageItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
  263. evaluateManageItemMPJLambdaWrapper
  264. .select(EvaluateManageItem::getId)
  265. .select(EvaluateManageItem.class, x -> VoToColumnUtil.fieldsToColumns(EvaluateManageItem.class).contains(x.getProperty()))
  266. .eq(EvaluateManageItem::getEvaluateManageId, dto.getEvaluateManageId());
  267. List<EvaluateManageItem> itemList = evaluateManageItemMapper.selectList(evaluateManageItemMPJLambdaWrapper);
  268. //大题个数
  269. Map<String, List<EvaluateManageItem>> topicMap = itemList.stream().collect(Collectors.groupingBy(EvaluateManageItem::getTopic));
  270. // int startRow = 1;
  271. // List<Map<Integer, Integer>> mergeList = new ArrayList<>();
  272. Set<Long> objectList = list.stream().map(ResultViewingPageVo::getObjectId).collect(Collectors.toSet());
  273. Map<Long, Integer> sortCodeMap = new HashMap<>();
  274. int sortCode = 1;
  275. for (Long objectId : objectList) {
  276. sortCodeMap.put(objectId, sortCode);
  277. sortCode ++;
  278. }
  279. Workbook workbook = new XSSFWorkbook();
  280. Sheet sheet = workbook.createSheet("数据");
  281. Font font = workbook.createFont();
  282. font.setFontName("宋体");
  283. font.setFontHeightInPoints((short)12);
  284. CellStyle contentCellStyle = workbook.createCellStyle();
  285. contentCellStyle.setFont(font);
  286. contentCellStyle.setWrapText(true);
  287. contentCellStyle.setBorderTop(BorderStyle.THIN);
  288. contentCellStyle.setBorderBottom(BorderStyle.THIN);
  289. contentCellStyle.setBorderLeft(BorderStyle.THIN);
  290. contentCellStyle.setBorderRight(BorderStyle.THIN);
  291. Row headerRow = sheet.createRow(0);
  292. String[] headers = {"序号", "被评人", "应打分人数", "实际打分人数", "题目", "得分", "标题", "得分", "综合得分"};
  293. for (int i = 0; i < headers.length; i++) {
  294. Cell cell = headerRow.createCell(i);
  295. cell.setCellValue(headers[i]);
  296. cell.setCellStyle(contentCellStyle);
  297. }
  298. // 填充数据并记录合并的行
  299. int rowCount = 1;
  300. Map<Long, Integer> classStartRows = new HashMap<>();
  301. Map<Long, Integer> classEndRows = new HashMap<>();
  302. Map<String, Integer> itemStartRows = new HashMap<>();
  303. Map<String, Integer> itemEndRows = new HashMap<>();
  304. for (ResultViewingPageVo el : list) {
  305. Row row = sheet.createRow(rowCount ++);
  306. Cell cell = row.createCell(0);
  307. cell.setCellValue(sortCodeMap.get(el.getObjectId()));
  308. cell.setCellStyle(contentCellStyle);
  309. cell = row.createCell(1);
  310. cell.setCellValue(el.getObjectIdCN());
  311. cell.setCellStyle(contentCellStyle);
  312. cell = row.createCell(2);
  313. cell.setCellValue(el.getPlanExecuterNum());
  314. cell.setCellStyle(contentCellStyle);
  315. cell = row.createCell(3);
  316. cell.setCellValue(el.getActualExecuterNum());
  317. cell.setCellStyle(contentCellStyle);
  318. cell = row.createCell(4);
  319. cell.setCellValue(el.getProblem());
  320. cell.setCellStyle(contentCellStyle);
  321. cell = row.createCell(5);
  322. cell.setCellValue(el.getSumScore());
  323. cell.setCellStyle(contentCellStyle);
  324. cell = row.createCell(6);
  325. cell.setCellValue(el.getTopic());
  326. cell.setCellStyle(contentCellStyle);
  327. cell = row.createCell(7);
  328. cell.setCellValue(el.getTopicScore());
  329. cell.setCellStyle(contentCellStyle);
  330. cell = row.createCell(8);
  331. cell.setCellValue(el.getSynthesisScore());
  332. cell.setCellStyle(contentCellStyle);
  333. Long objectId = el.getObjectId();
  334. if (!classStartRows.containsKey(objectId)) {
  335. classStartRows.put(objectId, rowCount - 1);
  336. }
  337. classEndRows.put(objectId, rowCount - 1);
  338. String itemInfo = el.getObjectId() + el.getTopic();
  339. if (!itemStartRows.containsKey(itemInfo)) {
  340. itemStartRows.put(itemInfo, rowCount - 1);
  341. }
  342. itemEndRows.put(itemInfo, rowCount - 1);
  343. }
  344. // 合并相同的人
  345. for (Map.Entry<Long, Integer> entry : classStartRows.entrySet()) {
  346. Long className = entry.getKey();
  347. int startRow = entry.getValue();
  348. int endRow = classEndRows.get(className);
  349. if (startRow != endRow) {
  350. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 0, 0));
  351. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 1, 1));
  352. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 2, 2));
  353. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 3, 3));
  354. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 8, 8));
  355. }
  356. }
  357. // 合并相同的题目
  358. for (Map.Entry<String, Integer> entry : itemStartRows.entrySet()) {
  359. String itemInfo = entry.getKey();
  360. int startRow = entry.getValue();
  361. int endRow = itemEndRows.get(itemInfo);
  362. if (startRow != endRow) {
  363. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 6, 6));
  364. sheet.addMergedRegion(new CellRangeAddress(startRow, endRow, 7, 7));
  365. }
  366. }
  367. // 自动调整列宽
  368. for (int i = 0; i < headers.length; i++) {
  369. sheet.autoSizeColumn(i);
  370. }
  371. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  372. workbook.write(bot);
  373. // 关闭工作簿
  374. workbook.close();
  375. return bot.toByteArray();
  376. }catch (Exception e){
  377. Log.error(e.getMessage(), e);
  378. throw new MyException("导出报错,请联系管理员");
  379. }
  380. }
  381. }