diff --git a/src/main/java/com/bonus/aqgqj/business/backstage/controller/plan/PlanApplyController.java b/src/main/java/com/bonus/aqgqj/business/backstage/controller/plan/PlanApplyController.java index 59bea9a..ba1ae8e 100644 --- a/src/main/java/com/bonus/aqgqj/business/backstage/controller/plan/PlanApplyController.java +++ b/src/main/java/com/bonus/aqgqj/business/backstage/controller/plan/PlanApplyController.java @@ -4,9 +4,11 @@ import cn.afterturn.easypoi.excel.ExcelExportUtil; import cn.afterturn.easypoi.excel.entity.ExportParams; import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import com.bonus.aqgqj.business.backstage.entity.MaTypeVo; +import com.bonus.aqgqj.business.backstage.entity.plan.ExportPlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanDetailVo; import com.bonus.aqgqj.business.backstage.service.plan.PlanApplyService; +import com.bonus.aqgqj.business.utils.ExcelBorderStyle; import com.bonus.aqgqj.manager.annotation.DecryptAndVerify; import com.bonus.aqgqj.manager.core.entity.EncryptedReq; import com.bonus.aqgqj.manager.webResult.AjaxResult; @@ -165,7 +167,7 @@ public class PlanApplyController { @PostMapping("exportApplyPlanList") public void exportApplyPlanList(HttpServletResponse response, @RequestBody PlanApplyVo dto) { try { - List list = service.getApplyPlanList(dto); + List list = service.exportApplyPlanList(dto); final int[] num = {1}; list.forEach(vo -> { vo.setId(num[0]); @@ -173,7 +175,8 @@ public class PlanApplyController { num[0]++; }); ExportParams exportParams = new ExportParams("需求计划申请", "需求计划申请", ExcelType.XSSF); - Workbook workbook = ExcelExportUtil.exportExcel(exportParams, PlanApplyVo.class, list); + exportParams.setStyle(ExcelBorderStyle.class); // 关键:设置自定义边框样式类 + Workbook workbook = ExcelExportUtil.exportExcel(exportParams, ExportPlanApplyVo.class, list); response.setContentType("application/vnd.ms-excel"); response.setHeader("content-disposition", "attachment;fileName=" + URLEncoder.encode("需求计划申请" + ".xlsx", "UTF-8")); ServletOutputStream outputStream = response.getOutputStream(); diff --git a/src/main/java/com/bonus/aqgqj/business/backstage/entity/plan/ExportPlanApplyVo.java b/src/main/java/com/bonus/aqgqj/business/backstage/entity/plan/ExportPlanApplyVo.java new file mode 100644 index 0000000..23e5bc9 --- /dev/null +++ b/src/main/java/com/bonus/aqgqj/business/backstage/entity/plan/ExportPlanApplyVo.java @@ -0,0 +1,54 @@ +package com.bonus.aqgqj.business.backstage.entity.plan; + +import cn.afterturn.easypoi.excel.annotation.Excel; + +import lombok.Data; + + +@Data +public class ExportPlanApplyVo { + /** + * id + */ + @Excel(name = "序号", width = 10.0, orderNum = "0") + private Integer id; + /** + * 计划编号 + */ + @Excel(name = "计划编号", width = 20.0,mergeVertical = true, orderNum = "1") + private String code; + + /** + * 工程名称 + */ + @Excel(name = "工程名称", width = 20.0,mergeVertical = true, orderNum = "2") + private String proName; + + @Excel(name = "类型", width = 20.0, orderNum = "2") + private String type; + + @Excel(name = "名称", width = 20.0, orderNum = "2") + private String name; + + @Excel(name = "规格", width = 20.0, orderNum = "2") + private String model; + + @Excel(name = "需用数量", width = 20.0, orderNum = "2") + private String needNum; + + + @Excel(name = "申请人", width = 20.0, orderNum = "2") + private String creator; + + + @Excel(name = "申请时间", width = 20.0, orderNum = "2") + private String createTime; + + @Excel(name = "备注", width = 20.0, orderNum = "2") + private String remark; + + @Excel(name = "审核状态", width = 20.0, orderNum = "2") + private String status; + + private String statusType; +} diff --git a/src/main/java/com/bonus/aqgqj/business/backstage/mapper/plan/PlanApplyMapper.java b/src/main/java/com/bonus/aqgqj/business/backstage/mapper/plan/PlanApplyMapper.java index 478ebc2..e3e86e3 100644 --- a/src/main/java/com/bonus/aqgqj/business/backstage/mapper/plan/PlanApplyMapper.java +++ b/src/main/java/com/bonus/aqgqj/business/backstage/mapper/plan/PlanApplyMapper.java @@ -1,6 +1,7 @@ package com.bonus.aqgqj.business.backstage.mapper.plan; import com.bonus.aqgqj.business.backstage.entity.MaTypeVo; +import com.bonus.aqgqj.business.backstage.entity.plan.ExportPlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanAuditRecordVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanDetailVo; @@ -192,4 +193,11 @@ public interface PlanApplyMapper { * @return */ List getProSelectAndCompanyName(PlanApplyVo data); + + /** + * 导出查询 + * @param dto + * @return + */ + List exportApplyPlanList(PlanApplyVo dto); } diff --git a/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyService.java b/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyService.java index 5e9544b..57e90fb 100644 --- a/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyService.java +++ b/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyService.java @@ -1,6 +1,7 @@ package com.bonus.aqgqj.business.backstage.service.plan; import com.bonus.aqgqj.business.backstage.entity.MaTypeVo; +import com.bonus.aqgqj.business.backstage.entity.plan.ExportPlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanDetailVo; import com.bonus.aqgqj.manager.webResult.AjaxResult; @@ -125,4 +126,11 @@ public interface PlanApplyService { * @return */ ServerResponse getProSelectAndCompanyName(PlanApplyVo data); + + /** + * 查询导出数据 + * @param dto + * @return + */ + List exportApplyPlanList(PlanApplyVo dto); } diff --git a/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyServiceImpl.java b/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyServiceImpl.java index bf33d56..be80318 100644 --- a/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyServiceImpl.java +++ b/src/main/java/com/bonus/aqgqj/business/backstage/service/plan/PlanApplyServiceImpl.java @@ -2,6 +2,7 @@ package com.bonus.aqgqj.business.backstage.service.plan; import com.alibaba.fastjson.JSON; import com.bonus.aqgqj.business.backstage.entity.MaTypeVo; +import com.bonus.aqgqj.business.backstage.entity.plan.ExportPlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanApplyVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanAuditRecordVo; import com.bonus.aqgqj.business.backstage.entity.plan.PlanDetailVo; @@ -280,6 +281,21 @@ public class PlanApplyServiceImpl implements PlanApplyService { } } + /** + * 查询导出信息 + * @param dto + * @return + */ + @Override + public List exportApplyPlanList(PlanApplyVo dto) { + try{ + return mapper.exportApplyPlanList(dto); + }catch (Exception e){ + log.error(e.toString(), e); + } + return Collections.emptyList(); + } + private String getCellStringValue(Cell cell) { if (cell == null) return ""; switch (cell.getCellType()) { diff --git a/src/main/java/com/bonus/aqgqj/business/utils/ExcelBorderStyle.java b/src/main/java/com/bonus/aqgqj/business/utils/ExcelBorderStyle.java new file mode 100644 index 0000000..92b1e18 --- /dev/null +++ b/src/main/java/com/bonus/aqgqj/business/utils/ExcelBorderStyle.java @@ -0,0 +1,134 @@ +package com.bonus.aqgqj.business.utils; + +import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity; +import cn.afterturn.easypoi.excel.entity.params.ExcelForEachParams; +import cn.afterturn.easypoi.excel.export.styler.ExcelExportStylerDefaultImpl; +import cn.afterturn.easypoi.excel.export.styler.IExcelExportStyler; +import org.apache.poi.ss.usermodel.*; + +/** + * EasyPoi Excel导出自定义边框样式类 + * 实现IExcelExportStyler,给单元格添加全边框+文字居中 + */ +public class ExcelBorderStyle implements IExcelExportStyler { + // 基础样式对象,复用EasyPoi默认样式,减少重复代码 + private final IExcelExportStyler baseStyle; + + /** + * 构造方法,传入Workbook初始化默认样式 + * EasyPoi会自动调用该构造方法,无需手动实例化 + */ + public ExcelBorderStyle(Workbook workbook) { + this.baseStyle = new ExcelExportStylerDefaultImpl(workbook); + } + + /** + * 表头样式:加边框+水平垂直居中 + */ + @Override + public CellStyle getHeaderStyle(short color) { + CellStyle headerStyle = baseStyle.getHeaderStyle(color); + headerStyle.setAlignment(HorizontalAlignment.CENTER); + headerStyle.setVerticalAlignment(VerticalAlignment.CENTER); + setCellBorder(headerStyle); // 给表头加全边框 + return headerStyle; + } + + /** + * Sheet标题样式:加边框+水平垂直居中 + */ + @Override + public CellStyle getTitleStyle(short color) { + CellStyle titleStyle = baseStyle.getTitleStyle(color); + titleStyle.setAlignment(HorizontalAlignment.CENTER); + titleStyle.setVerticalAlignment(VerticalAlignment.CENTER); + setCellBorder(titleStyle); // 给标题加全边框 + return titleStyle; + } + + /** + * 内容行基础样式(奇数行):加边框+水平垂直居中 + */ + @Override + public CellStyle getStyles(boolean isWarp, ExcelExportEntity entity) { + CellStyle style = baseStyle.getStyles(isWarp, entity); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + setCellBorder(style); // 给内容行加全边框 + return style; + } + + /** + * 【必须实现】单元格级样式(EasyPoi新版接口方法,不可返回null) + * 复用基础样式+加边框,避免样式失效 + */ + @Override + public CellStyle getStyles(Cell cell, int index, ExcelExportEntity entity, Object obj, Object data) { + CellStyle style = baseStyle.getStyles(cell, index, entity, obj, data); + setCellBorder(style); // 给单元格加全边框 + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + return style; + } + + /** + * 【必须实现】模板导出样式(不可返回null,普通导出也会调用) + * 复用基础样式+加边框,兼容模板导出场景 + */ + @Override + public CellStyle getTemplateStyles(boolean isWarp, ExcelForEachParams params) { + CellStyle style = baseStyle.getTemplateStyles(isWarp, params); + setCellBorder(style); // 给模板单元格加全边框 + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + return style; + } + + /** + * 内容行样式(按索引区分奇偶行):加边框+水平垂直居中 + * 可在此实现隔行变色效果 + */ + public CellStyle getStyles(boolean isWarp, ExcelExportEntity entity, int index) { + // 调用baseStyle中存在的2参数方法 + CellStyle style = baseStyle.getStyles(isWarp, entity); + style.setAlignment(HorizontalAlignment.CENTER); + style.setVerticalAlignment(VerticalAlignment.CENTER); + setCellBorder(style); + + // 自行实现隔行变色逻辑 + if (index % 2 == 0) { + style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex()); + style.setFillPattern(FillPatternType.SOLID_FOREGROUND); + } + return style; + } + + /** + * 合并单元格样式:加边框+水平垂直居中 + */ + public CellStyle getMergeStyle(boolean isWarp, ExcelExportEntity entity) { + // 1. 直接创建新的单元格样式,不依赖baseStyle + CellStyle mergeStyle = baseStyle.getStyles(isWarp, entity); + // 2. 应用边框和居中样式 + mergeStyle.setAlignment(HorizontalAlignment.CENTER); + mergeStyle.setVerticalAlignment(VerticalAlignment.CENTER); + setCellBorder(mergeStyle); + return mergeStyle; + } + /** + * 通用方法:给单元格设置【黑色细边框】(上、下、左、右) + * 抽离边框逻辑,统一复用 + */ + private void setCellBorder(CellStyle cellStyle) { + // 边框样式:细边框(BORDER_THIN),可改为粗边框BORDER_THICK + cellStyle.setBorderTop(BorderStyle.THIN); + cellStyle.setBorderBottom(BorderStyle.THIN); + cellStyle.setBorderLeft(BorderStyle.THIN); + cellStyle.setBorderRight(BorderStyle.THIN); + // 可选:显式设置边框颜色为黑色(默认黑色,可注释) + cellStyle.setTopBorderColor(IndexedColors.BLACK.getIndex()); + cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); + cellStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex()); + cellStyle.setRightBorderColor(IndexedColors.BLACK.getIndex()); + } +} \ No newline at end of file diff --git a/src/main/resources/mappers/business/backstage/PlanApplyMapper.xml b/src/main/resources/mappers/business/backstage/PlanApplyMapper.xml index 0df9ef5..b225dd0 100644 --- a/src/main/resources/mappers/business/backstage/PlanApplyMapper.xml +++ b/src/main/resources/mappers/business/backstage/PlanApplyMapper.xml @@ -315,4 +315,33 @@ WHERE bp.is_active = '1' +