diff --git a/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsColumnWidthHandler.java b/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsColumnWidthHandler.java index 2917d64..3c48c7e 100644 --- a/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsColumnWidthHandler.java +++ b/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsColumnWidthHandler.java @@ -21,34 +21,39 @@ public class ProjectManagementItemsColumnWidthHandler extends AbstractRowWriteHa Sheet sheet = writeSheetHolder.getSheet(); - // 设置列宽 - // 序号列 - 较窄 - sheet.setColumnWidth(0, 8 * 256); - - // 内容列 - 较宽 - sheet.setColumnWidth(1, 25 * 256); - - // 时间(天)列 - 较窄 - sheet.setColumnWidth(2, 10 * 256); - - // 计划完成日期列 - 中等 - sheet.setColumnWidth(3, 15 * 256); - - // 完成进度子列(10%-100%)- 很窄 - for (int i = 4; i <= 13; i++) { - sheet.setColumnWidth(i, 4 * 256); + // 只在第一行设置列宽,避免重复设置 + if (row.getRowNum() == 0) { + // 序号列 - 较窄 + sheet.setColumnWidth(0, 6 * 256); + + // 内容列 - 较宽 + sheet.setColumnWidth(1, 30 * 256); + + // 时间(天)列 - 较窄 + sheet.setColumnWidth(2, 8 * 256); + + // 计划完成日期列 - 中等 + sheet.setColumnWidth(3, 12 * 256); + + // 完成进度子列(10%-100%)- 很窄,用于显示颜色块 + for (int i = 4; i <= 13; i++) { + sheet.setColumnWidth(i, 4 * 256); + } + + // 完成进度%列 - 较窄 + sheet.setColumnWidth(14, 10 * 256); + + // 实际完成日期列 - 中等 + sheet.setColumnWidth(15, 12 * 256); + + // 负责人列 - 较窄 + sheet.setColumnWidth(16, 8 * 256); + + // 完成状况列 - 较窄 + sheet.setColumnWidth(17, 10 * 256); + + // 设置行高 + sheet.setDefaultRowHeight((short) (20 * 20)); // 设置默认行高 } - - // 完成进度%列 - 较窄 - sheet.setColumnWidth(14, 10 * 256); - - // 实际完成日期列 - 中等 - sheet.setColumnWidth(15, 15 * 256); - - // 负责人列 - 较窄 - sheet.setColumnWidth(16, 10 * 256); - - // 完成状况列 - 较窄 - sheet.setColumnWidth(17, 10 * 256); } } \ No newline at end of file diff --git a/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsRowHandler.java b/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsRowHandler.java index 571a51b..6a1e22f 100644 --- a/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsRowHandler.java +++ b/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsRowHandler.java @@ -21,17 +21,48 @@ public class ProjectManagementItemsRowHandler extends AbstractRowWriteHandler { // 处理标题行(第1行,索引为0) if (row.getRowNum() == 0) { - // 合并标题行(跨越所有列) - CellRangeAddress titleRegion = new CellRangeAddress(0, 0, 0, 17); + // 合并主标题(前16列) + CellRangeAddress titleRegion = new CellRangeAddress(0, 0, 0, 15); writeSheetHolder.getSheet().addMergedRegion(titleRegion); + + // 合并ZFTRW启动(第17-18列) + CellRangeAddress zftrwRegion = new CellRangeAddress(0, 1, 16, 17); + writeSheetHolder.getSheet().addMergedRegion(zftrwRegion); } - - // 处理表头行(第8行,索引为7) - // 合并完成进度列的表头(第5列到第14列,索引为4-13) - /*if (row.getRowNum() == 7) { - CellRangeAddress progressRegion = new CellRangeAddress(7, 7, 4, 13); + // 处理表头行合并 + if (row.getRowNum() == 6) { + // 合并序号列(第1-2行表头) + CellRangeAddress seqRegion = new CellRangeAddress(6, 7, 0, 0); + writeSheetHolder.getSheet().addMergedRegion(seqRegion); + + // 合并内容列(第1-2行表头) + CellRangeAddress contentRegion = new CellRangeAddress(6, 7, 1, 1); + writeSheetHolder.getSheet().addMergedRegion(contentRegion); + + // 合并时间列(第1-2行表头) + CellRangeAddress timeRegion = new CellRangeAddress(6, 6, 2, 3); + writeSheetHolder.getSheet().addMergedRegion(timeRegion); + + // 合并完成进度列(第1行表头,跨越10个子列) + CellRangeAddress progressRegion = new CellRangeAddress(6, 6, 4, 13); writeSheetHolder.getSheet().addMergedRegion(progressRegion); - }*/ + + // 合并完成进度%列(第1-2行表头) + CellRangeAddress progressPercentRegion = new CellRangeAddress(6, 7, 14, 14); + writeSheetHolder.getSheet().addMergedRegion(progressPercentRegion); + + // 合并实际完成日期列(第1-2行表头) + CellRangeAddress actualDateRegion = new CellRangeAddress(6, 7, 15, 15); + writeSheetHolder.getSheet().addMergedRegion(actualDateRegion); + + // 合并负责人列(第1-2行表头) + CellRangeAddress leaderRegion = new CellRangeAddress(6, 7, 16, 16); + writeSheetHolder.getSheet().addMergedRegion(leaderRegion); + + // 合并完成状况列(第1-2行表头) + CellRangeAddress statusRegion = new CellRangeAddress(6, 7, 17, 17); + writeSheetHolder.getSheet().addMergedRegion(statusRegion); + } } } \ No newline at end of file diff --git a/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsStyleHandler.java b/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsStyleHandler.java index e9c214b..d4f8025 100644 --- a/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsStyleHandler.java +++ b/src/main/java/com/gaotao/common/easyexcel/ProjectManagementItemsStyleHandler.java @@ -19,9 +19,6 @@ public class ProjectManagementItemsStyleHandler implements CellWriteHandler { Workbook workbook = context.getWriteWorkbookHolder().getWorkbook(); CellStyle cellStyle = workbook.createCellStyle(); - // 复制原有样式 - cellStyle.cloneStyleFrom(cell.getCellStyle()); - // 设置边框 cellStyle.setBorderTop(BorderStyle.THIN); cellStyle.setBorderBottom(BorderStyle.THIN); @@ -30,43 +27,76 @@ public class ProjectManagementItemsStyleHandler implements CellWriteHandler { // 处理标题行(第1行,索引为0) if (rowIndex == 0) { - // 标题行样式 - cellStyle.setAlignment(HorizontalAlignment.CENTER); - cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); - - Font titleFont = workbook.createFont(); - titleFont.setFontHeightInPoints((short) 16); - titleFont.setBold(true); - cellStyle.setFont(titleFont); + if (columnIndex <= 15) { + // 主标题样式 + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + + Font titleFont = workbook.createFont(); + titleFont.setFontHeightInPoints((short) 14); + titleFont.setBold(true); + cellStyle.setFont(titleFont); + } else { + // 右上角ZFTRW启动样式 + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + Font font = workbook.createFont(); + font.setFontHeightInPoints((short) 10); + font.setBold(true); + cellStyle.setFont(font); + } } - // 处理项目信息行(第2-6行,索引为1-5) - else if (rowIndex >= 1 && rowIndex <= 5) { - // 项目信息行样式 + // 处理项目信息行(第2-5行,索引为1-4) + else if (rowIndex >= 1 && rowIndex <= 4) { cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); - // 标签列(第1列、第3列)左对齐 - if (columnIndex == 0 || columnIndex == 2) { - cellStyle.setAlignment(HorizontalAlignment.LEFT); - Font labelFont = workbook.createFont(); - labelFont.setBold(true); - cellStyle.setFont(labelFont); - } - // 值列(第2列、第4列)居中对齐 - else if (columnIndex == 1 || columnIndex == 3) { + // 右上角日期区域样式 + if (columnIndex >= 16) { cellStyle.setAlignment(HorizontalAlignment.CENTER); - Font valueFont = workbook.createFont(); - valueFont.setBold(true); - cellStyle.setFont(valueFont); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + Font font = workbook.createFont(); + font.setFontHeightInPoints((short) 10); + font.setBold(true); + cellStyle.setFont(font); + } + // 项目信息区域 + else { + // 标签列样式 + if (columnIndex == 0 || columnIndex == 2 || columnIndex == 14) { + cellStyle.setAlignment(HorizontalAlignment.CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + Font labelFont = workbook.createFont(); + labelFont.setFontHeightInPoints((short) 10); + labelFont.setBold(true); + cellStyle.setFont(labelFont); + } + // 值列样式 + else { + cellStyle.setAlignment(HorizontalAlignment.CENTER); + Font valueFont = workbook.createFont(); + valueFont.setFontHeightInPoints((short) 10); + valueFont.setBold(true); + cellStyle.setFont(valueFont); + } } } - // 处理表头行(第8行,索引为7) - else if (rowIndex == 7) { + // 处理表头行(第7-8行,索引为6-7) + else if (rowIndex == 6 || rowIndex == 7) { // 表头样式 cellStyle.setAlignment(HorizontalAlignment.CENTER); cellStyle.setVerticalAlignment(VerticalAlignment.CENTER); + cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); Font headerFont = workbook.createFont(); - headerFont.setFontHeightInPoints((short) 11); + headerFont.setFontHeightInPoints((short) 10); headerFont.setBold(true); cellStyle.setFont(headerFont); } @@ -79,16 +109,23 @@ public class ProjectManagementItemsStyleHandler implements CellWriteHandler { if (columnIndex == 0) { cellStyle.setAlignment(HorizontalAlignment.CENTER); Font font = workbook.createFont(); + font.setFontHeightInPoints((short) 10); font.setBold(true); cellStyle.setFont(font); } // 内容列左对齐 else if (columnIndex == 1) { cellStyle.setAlignment(HorizontalAlignment.LEFT); + Font font = workbook.createFont(); + font.setFontHeightInPoints((short) 10); + cellStyle.setFont(font); } // 其他列居中对齐 else { cellStyle.setAlignment(HorizontalAlignment.CENTER); + Font font = workbook.createFont(); + font.setFontHeightInPoints((short) 10); + cellStyle.setFont(font); } // 处理完成状况列(最后一列,索引为17) @@ -102,6 +139,27 @@ public class ProjectManagementItemsStyleHandler implements CellWriteHandler { Font font = workbook.createFont(); font.setColor(IndexedColors.WHITE.getIndex()); font.setBold(true); + font.setFontHeightInPoints((short) 10); + cellStyle.setFont(font); + } else if ("延期完成".equals(cellValue)) { + // 黄色背景 + cellStyle.setFillForegroundColor(IndexedColors.DARK_YELLOW.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + Font font = workbook.createFont(); + font.setColor(IndexedColors.WHITE.getIndex()); + font.setBold(true); + font.setFontHeightInPoints((short) 10); + cellStyle.setFont(font); + }else if ("正常".equals(cellValue)) { + // 绿色背景 + cellStyle.setFillForegroundColor(IndexedColors.DARK_GREEN.getIndex()); + cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); + + Font font = workbook.createFont(); + font.setColor(IndexedColors.WHITE.getIndex()); + font.setBold(true); + font.setFontHeightInPoints((short) 10); cellStyle.setFont(font); } } @@ -111,9 +169,9 @@ public class ProjectManagementItemsStyleHandler implements CellWriteHandler { String cellValue = getCellValueAsString(cell); if ("■".equals(cellValue)) { // 绿色背景 - cellStyle.setFillForegroundColor(IndexedColors.GREEN.getIndex()); + cellStyle.setFillForegroundColor(IndexedColors.BRIGHT_GREEN.getIndex()); cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND); - // 清空内容 + // 清空内容,只显示颜色 cell.setCellValue(""); } } @@ -122,20 +180,7 @@ public class ProjectManagementItemsStyleHandler implements CellWriteHandler { if (columnIndex == 14) { Font font = workbook.createFont(); font.setBold(true); - cellStyle.setFont(font); - } - - // 处理计划完成日期和实际完成日期列(索引为3和15) - if (columnIndex == 3 || columnIndex == 15) { - Font font = workbook.createFont(); - font.setBold(true); - cellStyle.setFont(font); - } - - // 处理负责人列(索引为16) - if (columnIndex == 16) { - Font font = workbook.createFont(); - font.setBold(true); + font.setFontHeightInPoints((short) 10); cellStyle.setFont(font); } } diff --git a/src/main/java/com/gaotao/modules/project/service/impl/PmProjectManagePartModelServiceImpl.java b/src/main/java/com/gaotao/modules/project/service/impl/PmProjectManagePartModelServiceImpl.java index 930b646..9286745 100644 --- a/src/main/java/com/gaotao/modules/project/service/impl/PmProjectManagePartModelServiceImpl.java +++ b/src/main/java/com/gaotao/modules/project/service/impl/PmProjectManagePartModelServiceImpl.java @@ -373,6 +373,13 @@ public class PmProjectManagePartModelServiceImpl extends ServiceImpl partModelList = baseMapper.selectList(queryWrapper); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); + String qidongDate = ""; + if (partModelList!=null && partModelList.size()>0) { + if(partModelList.get(0).getPlanEndDate() != null){ + qidongDate = sdf.format(partModelList.get(0).getPlanEndDate()); + } + } QueryWrapper queryWrapper1 = new QueryWrapper<>(); queryWrapper1.eq("project_part_id", projectPartId); @@ -381,11 +388,12 @@ public class PmProjectManagePartModelServiceImpl extends ServiceImpl list = pmProjectPartModelDetailService.list(queryWrapper1); String tOneTime = ""; String OTSTime = ""; + for (PmProjectPartModelDetail detail : list) { - if ("T1".equals(detail.getDetailItemDesc())) { - tOneTime = detail.getDetailExcalCompletionDate().toString(); - } else if ("OTS".equals(detail.getModelHeaderCode())) { - OTSTime = detail.getDetailExcalCompletionDate().toString(); + if ("T1试模".equals(detail.getDetailItemDesc()) && detail.getDetailExcalCompletionDate() != null) { + tOneTime = sdf.format(detail.getDetailExcalCompletionDate()); + } else if ("OTS试模".equals(detail.getDetailItemDesc()) && detail.getDetailExcalCompletionDate() != null) { + OTSTime = sdf.format(detail.getDetailExcalCompletionDate()); } } @@ -405,31 +413,41 @@ public class PmProjectManagePartModelServiceImpl extends ServiceImpl> titleData = Arrays.asList( - Arrays.asList("新项目零件质量开发工作计划进度表") + Arrays.asList("新项目零件质量开发工作计划进度表", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "启动"+qidongDate, "") ); excelWriter.write(titleData, sheet); // 写入项目基本信息(左上角)和关键日期(右上角) + String startDate = partModelList != null && !partModelList.isEmpty() && partModelList.get(0).getPlanEndDate() != null ? + new SimpleDateFormat("yyyy/M/d").format(partModelList.get(0).getPlanEndDate()) : ""; + String ppapDate = partModelList != null && !partModelList.isEmpty() && partModelList.get(partModelList.size()-1).getPlanEndDate() != null ? + new SimpleDateFormat("yyyy/M/d").format(partModelList.get(partModelList.size()-1).getPlanEndDate()) : ""; + List> projectInfo = Arrays.asList( - Arrays.asList("物料名称:", projectPart.getPartName(), "ZFTRW启动会日期:",partModelList!=null&&partModelList.get(0).getPlanEndDate()!=null? new SimpleDateFormat("yyyy/MM/dd").format(partModelList.get(0).getPlanEndDate()):"", "", "", "", "", "", "", "", "", "", "", "", "", "", "" ), - Arrays.asList("物料号:", projectPart.getPartCode(), "T1:", tOneTime,"", "", "", "", "", "", "", "", "", "", "", "", "", ""), - Arrays.asList("项目名称:", projectPart.getProjectName(), "OTS:", OTSTime, "", "", "", "", "", "", "", "", "", "", "", "", "", ""), - Arrays.asList("项目管理责任人:", projectPart.getPartLeader(), "PPAP:", partModelList!=null&&partModelList.get(partModelList.size()-1).getPlanEndDate()!=null?new SimpleDateFormat("yyyy/MM/dd").format(partModelList.get(partModelList.size()-1).getPlanEndDate()):"", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), - Arrays.asList("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "更新日期:", new SimpleDateFormat("yyyy/MM/dd").format(new Date())) + Arrays.asList("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "会日期", ""), + Arrays.asList("零件名", projectPart.getPartName()!= null ? projectPart.getPartName(): "", "项目名称", projectPart.getProjectName()!= null?projectPart.getProjectName():"","", "", "", "", "", "", "", "", "","","T1", tOneTime, "OTS", OTSTime), + Arrays.asList("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""), + Arrays.asList("零件号", projectPart.getPartCode() != null ? projectPart.getPartCode() : "", "责任人", projectPart.getPartLeader() != null ? projectPart.getPartLeader() : "","", "", "", "", "", "", "", "", "","", "PPAP", ppapDate, "更新日期", new SimpleDateFormat("yyyy/M/d").format(new Date())) ); excelWriter.write(projectInfo, sheet); // 空行 - excelWriter.write(Collections.singletonList(Arrays.asList("")), sheet); + excelWriter.write(Collections.singletonList(Arrays.asList("", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "")), sheet); - // 写入表头 - 根据图片中的列结构,完成进度分为10个子列 - List> headerData = Arrays.asList( - Arrays.asList("序号", "内容", "时间(天)", "计划完成日期", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%", "完成进度%", "实际完成日期", "负责人", "完成状况") + // 写入表头 - 第一行表头(合并单元格) + List> headerData1 = Arrays.asList( + Arrays.asList("序号", "内容", "时间", "", "完成进度", "", "", "", "", "", "", "", "", "", "完成进度%", "实际完成日期", "负责人", "完成状况") + ); + excelWriter.write(headerData1, sheet); + + // 写入表头 - 第二行表头(进度细分) + List> headerData2 = Arrays.asList( + Arrays.asList("", "", "(天)", "计划完成日期", "10%", "20%", "30%", "40%", "50%", "60%", "70%", "80%", "90%", "100%", "", "", "", "") ); - excelWriter.write(headerData, sheet); + excelWriter.write(headerData2, sheet); // 写入数据 - SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd"); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/M/d"); List> dataList = new ArrayList<>(); for (int i = 0; i < partModelList.size(); i++) { @@ -445,7 +463,9 @@ public class PmProjectManagePartModelServiceImpl extends ServiceImpl