CourseTableExportQueryUtil.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. package com.xjrsoft.module.schedule.util;
  2. import com.xjrsoft.module.courseTable.entity.ClassTime;
  3. import com.xjrsoft.module.schedule.vo.CourseDetailVo;
  4. import com.xjrsoft.module.schedule.vo.CourseTableVo;
  5. import org.apache.poi.ss.usermodel.BorderStyle;
  6. import org.apache.poi.ss.usermodel.Cell;
  7. import org.apache.poi.ss.usermodel.CellStyle;
  8. import org.apache.poi.ss.usermodel.Font;
  9. import org.apache.poi.ss.usermodel.HorizontalAlignment;
  10. import org.apache.poi.ss.usermodel.Row;
  11. import org.apache.poi.ss.usermodel.Sheet;
  12. import org.apache.poi.ss.usermodel.VerticalAlignment;
  13. import org.apache.poi.ss.usermodel.Workbook;
  14. import org.apache.poi.ss.util.CellRangeAddress;
  15. import java.util.ArrayList;
  16. import java.util.Collections;
  17. import java.util.List;
  18. import java.util.Map;
  19. import java.util.Set;
  20. import java.util.stream.Collectors;
  21. /**
  22. * @author dzx
  23. * @date 2025/4/9
  24. */
  25. public class CourseTableExportQueryUtil {
  26. /**
  27. * 合并9列
  28. * @param rowNumber 写入的行号
  29. */
  30. public void createThirdTitle(Workbook workbook, Sheet sheet, int rowNumber, String leftTitle, String rightTitle){
  31. Font font = workbook.createFont();
  32. font.setBold(true);// 设置为粗体
  33. font.setFontName("宋体");
  34. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  35. font.setFontHeightInPoints((short) 14);
  36. //设置样式
  37. CellStyle cellStyle = workbook.createCellStyle();
  38. cellStyle.setFont(font); // 将字体应用到样式
  39. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  40. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  41. cellStyle.setBorderTop(BorderStyle.THIN);
  42. cellStyle.setBorderBottom(BorderStyle.THIN);
  43. cellStyle.setBorderLeft(BorderStyle.THIN);
  44. cellStyle.setBorderRight(BorderStyle.THIN);
  45. //创建一行
  46. Row row = sheet.createRow(rowNumber);
  47. Cell cell = row.createCell(0);
  48. cell.setCellValue(leftTitle);
  49. cell.setCellStyle(cellStyle);
  50. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 3));
  51. cell = row.createCell(1);
  52. cell.setCellValue(rightTitle);
  53. cell.setCellStyle(cellStyle);
  54. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 4, 8));
  55. }
  56. public void createContent(Workbook workbook, Sheet sheet, int rowNumber, CourseTableVo data, String courseType){
  57. Map<Integer, ClassTime> timeNumberMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, x -> x));
  58. Map<String, List<CourseDetailVo>> timeNumberDataMap = data.getCourseList().stream().collect(Collectors.groupingBy(CourseDetailVo::getTimeNumber));
  59. List<Integer> weekList = new ArrayList<>();
  60. weekList.add(1);
  61. weekList.add(2);
  62. weekList.add(3);
  63. weekList.add(4);
  64. weekList.add(5);
  65. weekList.add(6);
  66. weekList.add(7);
  67. Collections.sort(weekList);
  68. List<Integer> timeNumberList = data.getClassTimeList().stream().map(ClassTime::getNumber).collect(Collectors.toList());
  69. Collections.sort(timeNumberList);
  70. Map<Integer, Integer> timePeriodMap = data.getClassTimeList().stream().collect(Collectors.toMap(ClassTime::getNumber, ClassTime::getTimePeriod));
  71. ArrayList<ArrayList<String>> dataList = new ArrayList<>();
  72. for (Integer timeNumber : timeNumberList) {
  73. ArrayList<String> rowData = new ArrayList<>();
  74. Integer timePeriod = timePeriodMap.get(timeNumber);
  75. String timePeriodStr = "";
  76. if (timePeriod == 1) {
  77. timePeriodStr = "上午";
  78. } else if (timePeriod == 2) {
  79. timePeriodStr = "下午";
  80. } else if (timePeriod == 3) {
  81. timePeriodStr = "晚上";
  82. }
  83. rowData.add(timePeriodStr);
  84. ClassTime classTime = timeNumberMap.get(timeNumber);
  85. String timeNumberStr = classTime.getShortName() + "\r\n" + classTime.getSummerStartTime() + "-" + classTime.getSummerEndTime();
  86. rowData.add(timeNumberStr);
  87. List<CourseDetailVo> list1 = timeNumberDataMap.get(timeNumber.toString());
  88. if (list1 == null) {
  89. for (Integer week : weekList) {
  90. rowData.add("");
  91. }
  92. dataList.add(rowData);
  93. continue;
  94. }
  95. Map<Integer, List<CourseDetailVo>> weeksMap = list1.stream().collect(Collectors.groupingBy(CourseDetailVo::getWeeks));
  96. for (Integer week : weekList) {
  97. String content = "";
  98. List<CourseDetailVo> list = weeksMap.get(week);
  99. if (list != null && !list.isEmpty()) {
  100. if (list.size() == 1) {
  101. CourseDetailVo courseDetailVo = list.get(0);
  102. content += courseDetailVo.getCourseName() + "\r\n";
  103. if ("teacher".equals(courseType)) {
  104. content += courseDetailVo.getClassroomName() + "\r\n";
  105. content += courseDetailVo.getClassName();
  106. } else if ("class".equals(courseType)) {
  107. content += courseDetailVo.getClassroomName() + "\r\n";
  108. content += courseDetailVo.getTeacherName();
  109. } else if("classroom".equals(content)){
  110. }
  111. } else {
  112. CourseDetailVo courseDetailVo = list.get(0);
  113. content += courseDetailVo.getCourseName() + "\r\n";
  114. if ("teacher".equals(courseType)) {
  115. content += courseDetailVo.getClassroomName() + "\r\n";
  116. content += courseDetailVo.getClassName();
  117. } else if ("class".equals(courseType)) {
  118. content += courseDetailVo.getClassroomName() + "\r\n";
  119. Set<String> classNames = list.stream().map(CourseDetailVo::getTeacherName).collect(Collectors.toSet());
  120. content += classNames.toString().replace("]", "").replace("[", "").replace(" ", "");
  121. } else if("classroom".equals(content)){
  122. }
  123. }
  124. }
  125. rowData.add(content);
  126. }
  127. dataList.add(rowData);
  128. }
  129. Font font = workbook.createFont();
  130. font.setFontName("宋体");
  131. font.setFontHeightInPoints((short) 9);
  132. // 创建一个单元格样式对象
  133. CellStyle cellStyle = workbook.createCellStyle();
  134. cellStyle.setFont(font); // 将字体应用到样式
  135. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  136. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  137. cellStyle.setWrapText(true);
  138. cellStyle.setBorderTop(BorderStyle.THIN);
  139. cellStyle.setBorderBottom(BorderStyle.THIN);
  140. cellStyle.setBorderLeft(BorderStyle.THIN);
  141. cellStyle.setBorderRight(BorderStyle.THIN);
  142. for (ArrayList<String> strings : dataList) {
  143. Row row = sheet.createRow(rowNumber);
  144. int cellNumber = 0;
  145. for (String string : strings) {
  146. Cell row1cell1 = row.createCell(cellNumber);
  147. row1cell1.setCellValue(string);
  148. row1cell1.setCellStyle(cellStyle);
  149. cellNumber++;
  150. }
  151. rowNumber++;
  152. row.setHeightInPoints(48);
  153. }
  154. //合并
  155. Map<Integer, List<Integer>> collect = data.getClassTimeList().stream()
  156. .collect(Collectors.groupingBy(ClassTime::getTimePeriod, Collectors.mapping(ClassTime::getNumber, Collectors.toList())));
  157. int firstRow = 2;
  158. for (Integer i : collect.keySet()) {
  159. int lastRow = firstRow + collect.get(i).size() - 1;
  160. if (lastRow == firstRow) {
  161. continue;
  162. }
  163. sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, 0, 0));
  164. firstRow = firstRow + collect.get(i).size();
  165. }
  166. }
  167. public void createAllCourseTableTitle(Workbook workbook, Sheet sheet, List<ClassTime> classTimeList){
  168. // 创建一个字体对象
  169. Font font = workbook.createFont();
  170. font.setBold(true);// 设置为粗体
  171. font.setFontName("宋体");
  172. //font.setColor(IndexedColors.RED.getIndex()); // 设置字体颜色为红色
  173. font.setFontHeightInPoints((short) 12);
  174. // 创建一个单元格样式对象
  175. CellStyle cellStyle = workbook.createCellStyle();
  176. cellStyle.setFont(font); // 将字体应用到样式
  177. cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  178. cellStyle.setAlignment(HorizontalAlignment.CENTER);
  179. cellStyle.setBorderTop(BorderStyle.THIN);
  180. cellStyle.setBorderBottom(BorderStyle.THIN);
  181. cellStyle.setBorderLeft(BorderStyle.THIN);
  182. cellStyle.setBorderRight(BorderStyle.THIN);
  183. int rowNumber = 0;
  184. Row row = sheet.createRow(rowNumber);
  185. int cellNumber = 0;
  186. Cell row1cell1 = row.createCell(cellNumber);
  187. row1cell1.setCellValue("节次");
  188. row1cell1.setCellStyle(cellStyle);
  189. sheet.setColumnWidth(0, 4 * 256);
  190. cellNumber ++;
  191. row1cell1 = row.createCell(cellNumber);
  192. row1cell1.setCellValue("");
  193. row1cell1.setCellStyle(cellStyle);
  194. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 0, 1));
  195. sheet.setColumnWidth(1, 12 * 256);
  196. cellNumber = cellNumber + 12;
  197. row1cell1 = row.createCell(cellNumber);
  198. row1cell1.setCellValue("周一");
  199. row1cell1.setCellStyle(cellStyle);
  200. sheet.setColumnWidth(2, 16 * 256);
  201. cellNumber = cellNumber + 12;
  202. row1cell1 = row.createCell(cellNumber);
  203. row1cell1.setCellValue("周二");
  204. row1cell1.setCellStyle(cellStyle);
  205. sheet.setColumnWidth(cellNumber, 16 * 256);
  206. cellNumber = cellNumber + 12;
  207. row1cell1 = row.createCell(cellNumber);
  208. row1cell1.setCellValue("周三");
  209. row1cell1.setCellStyle(cellStyle);
  210. sheet.setColumnWidth(cellNumber, 16 * 256);
  211. cellNumber = cellNumber + 12;
  212. row1cell1 = row.createCell(cellNumber);
  213. row1cell1.setCellValue("周四");
  214. row1cell1.setCellStyle(cellStyle);
  215. sheet.setColumnWidth(cellNumber, 16 * 256);
  216. cellNumber = cellNumber + 12;
  217. row1cell1 = row.createCell(cellNumber);
  218. row1cell1.setCellValue("周五");
  219. row1cell1.setCellStyle(cellStyle);
  220. sheet.setColumnWidth(cellNumber, 16 * 256);
  221. cellNumber = cellNumber + 12;
  222. row1cell1 = row.createCell(cellNumber);
  223. row1cell1.setCellValue("周六");
  224. row1cell1.setCellStyle(cellStyle);
  225. sheet.setColumnWidth(cellNumber, 16 * 256);
  226. cellNumber = cellNumber + 12;
  227. row1cell1 = row.createCell(cellNumber);
  228. row1cell1.setCellValue("周日");
  229. row1cell1.setCellStyle(cellStyle);
  230. sheet.setColumnWidth(cellNumber, 16 * 256);
  231. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 1, 12));
  232. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 13, 24));
  233. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 25, 36));
  234. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 37, 48));
  235. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 49, 60));
  236. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 61, 72));
  237. sheet.addMergedRegion(new CellRangeAddress(rowNumber, rowNumber, 73, 84));
  238. rowNumber ++;
  239. row = sheet.createRow(rowNumber);
  240. cellNumber = 0;
  241. row1cell1 = row.createCell(cellNumber);
  242. row1cell1.setCellValue("班级");
  243. row1cell1.setCellStyle(cellStyle);
  244. sheet.setColumnWidth(2, 16 * 256);
  245. cellNumber ++;
  246. for (ClassTime classTime : classTimeList) {
  247. row1cell1 = row.createCell(cellNumber);
  248. row1cell1.setCellValue(classTime.getShortName() + "\r\n" + classTime.getSummerStartTime() + "-" + classTime.getSummerEndTime());
  249. row1cell1.setCellStyle(cellStyle);
  250. sheet.setColumnWidth(2, 16 * 256);
  251. cellNumber ++;
  252. }
  253. }
  254. }