From c9747cfbef87d401d9813ab9817d439d2e37eec7 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Tue, 26 Aug 2025 19:29:39 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../quality/mapper/QualityRegionMapper.java | 3 +- .../controller/RiskListPointController.java | 8 +- .../WorkerAttendanceController.java | 16 +- ...rityQualityInspectionRecordController.java | 181 +++++++++++++++++- .../XzSecurityQualityInspectionRecord.java | 4 + ...ityQualityInspectionRecordServiceImpl.java | 10 + .../java/com/zhgd/xmgl/util/ExcelUtils.java | 106 +++++++++- .../resources/excel/人员考勤记录导出.xlsx | Bin 9317 -> 9259 bytes .../excel/潮州项目隐患统计汇总表.xlsx | Bin 0 -> 11440 bytes 9 files changed, 307 insertions(+), 21 deletions(-) create mode 100644 src/main/resources/excel/潮州项目隐患统计汇总表.xlsx diff --git a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionMapper.java b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionMapper.java index 0b854affc..22b0c08c6 100644 --- a/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionMapper.java +++ b/src/main/java/com/zhgd/xmgl/modules/quality/mapper/QualityRegionMapper.java @@ -1,7 +1,6 @@ package com.zhgd.xmgl.modules.quality.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.zhgd.annotation.DataScope; import com.zhgd.xmgl.modules.quality.entity.QualityRegion; import com.zhgd.xmgl.modules.quality.entity.vo.QualityRegionVo; import org.apache.ibatis.annotations.Mapper; @@ -26,7 +25,7 @@ public interface QualityRegionMapper extends BaseMapper { * @param map * @return */ - @DataScope(includeTable = "enterprise_info") +// @DataScope(includeTable = "enterprise_info") List queryList(Map map); /** diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java index c66779b4e..6b439bf99 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListPointController.java @@ -6,6 +6,7 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.convert.Convert; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.gexin.fastjson.serializer.SerializerFeature; @@ -343,10 +344,9 @@ public class RiskListPointController { public Result delFromMonthlyBatch(@ApiIgnore @RequestBody HashMap param) { String ids = MapUtils.getString(param, "ids"); if (StrUtil.isNotBlank(ids)) { -// riskListSourceService.update(new LambdaUpdateWrapper() -// .set(RiskListSource::get,) -// .in(RiskListSource::getPointId, StrUtil.split(ids, ","))); - + riskListPointService.update(new LambdaUpdateWrapper() + .set(RiskListPoint::getMonthlyId, null) + .in(RiskListPoint::getId, StrUtil.split(ids, ","))); } return Result.ok(); } diff --git a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java index 88d2ebdb2..06f44e7dc 100644 --- a/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java +++ b/src/main/java/com/zhgd/xmgl/modules/worker/controller/WorkerAttendanceController.java @@ -31,10 +31,7 @@ import com.zhgd.xmgl.modules.worker.entity.vo.PresentDayByMonthVo; import com.zhgd.xmgl.modules.worker.entity.vo.SafetyPerformanceAnalysisVo; import com.zhgd.xmgl.modules.worker.service.*; import com.zhgd.xmgl.security.util.SecurityUtils; -import com.zhgd.xmgl.util.EasyPoiUtil; -import com.zhgd.xmgl.util.ExcelUtils; -import com.zhgd.xmgl.util.Fileutils; -import com.zhgd.xmgl.util.MapBuilder; +import com.zhgd.xmgl.util.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; @@ -563,6 +560,7 @@ public class WorkerAttendanceController { param.put("pageSize", -1); List records = workerAttendanceService.selectWorkerAttendancePage(param).getRecords(); List> listMap = new ArrayList<>(); + ArrayList imageBytesList = new ArrayList<>(); for (int i = 0; i < records.size(); i++) { Map objectMap = new HashMap<>(); WorkerAttendanceVo vo = records.get(i); @@ -573,7 +571,7 @@ public class WorkerAttendanceController { objectMap.put("createTime", vo.getCreateTime()); objectMap.put("projectSn", vo.getProjectSn()); objectMap.put("cardType", getType(vo.getCardType())); - objectMap.put("imageUrl", EasyPoiUtil.getImageEntityByXls(vo.getImageUrl())); +// objectMap.put("imageUrl", EasyPoiUtil.getImageEntityByXls(vo.getImageUrl())); objectMap.put("attendanceType", vo.getAttendanceType()); objectMap.put("passagewayName", vo.getPassagewayName()); objectMap.put("attendanceStatus", vo.getAttendanceStatus()); @@ -593,12 +591,20 @@ public class WorkerAttendanceController { objectMap.put("departmentTeamName", vo.getDepartmentTeamName()); objectMap.put("mockTime", vo.getMockTime()); objectMap.put("enterpriseName", vo.getEnterpriseName()); + byte[] bytes = new byte[0]; + try { + bytes = cn.hutool.core.io.FileUtil.readBytes(PathUtil.getBasePath() + "/" + vo.getImageUrl()); + } catch (Exception e) { + } finally { + imageBytesList.add(bytes); + } listMap.add(objectMap); } map.put("listMap", listMap); templateUrl = Fileutils.getExportTemplateFile("excel/人员考勤记录导出.xlsx").getAbsolutePath(); TemplateExportParams params = new TemplateExportParams(templateUrl); Workbook workbook = ExcelExportUtil.exportExcel(params, map); + ExcelUtils.exportPicture(workbook, 0, imageBytesList, 1, 8, 1); ExcelUtils.downLoadExcel("风险点清单导出模板.xlsx", response, workbook); } catch (IOException e) { log.error("", e); diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java index 7be9b7b52..74ce0471b 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityQualityInspectionRecordController.java @@ -1,15 +1,23 @@ package com.zhgd.xmgl.modules.xz.security.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zhgd.annotation.OperLog; +import com.zhgd.file.FileUtil; import com.zhgd.jeecg.common.api.vo.Result; +import com.zhgd.jeecg.common.execption.OpenAlertException; import com.zhgd.jeecg.common.mybatis.EntityMap; import com.zhgd.xmgl.base.entity.vo.SectorVo; import com.zhgd.xmgl.base.entity.vo.TrendOneVo; import com.zhgd.xmgl.constant.Cts; +import com.zhgd.xmgl.modules.basicdata.constant.DictionaryConstant; +import com.zhgd.xmgl.modules.basicdata.entity.DictionaryItem; +import com.zhgd.xmgl.modules.basicdata.service.impl.DictionaryItemServiceImpl; import com.zhgd.xmgl.modules.dangerous.service.IDangerousEngineeringRecordService; import com.zhgd.xmgl.modules.risk.entity.RiskListSource; import com.zhgd.xmgl.modules.risk.entity.vo.RiskListSourceVo; @@ -21,14 +29,14 @@ import com.zhgd.xmgl.modules.xz.security.entity.dto.XzSecurityDepartmentRectifie import com.zhgd.xmgl.modules.xz.security.entity.dto.XzSecurityQualityInspectionRecordSourceAddDto; import com.zhgd.xmgl.modules.xz.security.entity.vo.*; import com.zhgd.xmgl.modules.xz.security.service.IXzSecurityQualityInspectionRecordService; -import com.zhgd.xmgl.util.MapBuilder; -import com.zhgd.xmgl.util.MessageUtil; +import com.zhgd.xmgl.util.*; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; +import org.apache.poi.ss.usermodel.Workbook; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Lazy; @@ -37,12 +45,11 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /** @@ -68,6 +75,9 @@ public class XzSecurityQualityInspectionRecordController { @Lazy @Autowired private IRiskListSourceService riskListSourceService; + @Lazy + @Autowired + private DictionaryItemServiceImpl dictionaryItemService; /** * 分页列表查询 @@ -579,4 +589,163 @@ public class XzSecurityQualityInspectionRecordController { return Result.ok(); } + @ApiOperation(value = "导出潮州项目隐患统计汇总excel表", notes = "导出潮州项目隐患统计汇总excel表", httpMethod = "POST") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目sn", paramType = "body", required = true, dataType = "String"), + }) + @PostMapping(value = "/exportXls") + public void exportXls(HttpServletResponse response, @RequestBody HashMap param) { + String templateUrl = null; + String projectSn = MapUtils.getString(param, "projectSn"); + Map> root = new HashMap<>(4); + Map priorityNameDicNameMap = dictionaryItemService.getDictDataMapByProjectSn(DictionaryConstant.XZ_SECURITY_DANGER_ITEM_RECORD_PRIORITY_NAME_DIC, null); + Map dictDataMap = dictionaryItemService.getDictDataMapByProjectSn(DictionaryConstant.XZ_SECURITY_QUALITY_INSPECTION_RECORD_DUTY_MAJOR, projectSn); + try { + ArrayList imageBytesList = new ArrayList<>(); + ArrayList rectifyAfterImageBytesList = new ArrayList<>(); + Map map = new HashMap<>(); + param.put("pageNo", 1); + param.put("pageSize", -1); + List records = qualityInspectionRecordService.selectQualityInspectionRecordPage(param).getPage().getRecords(); + List> listMap = new ArrayList<>(); + for (int i = 0; i < records.size(); i++) { + Map objectMap = new HashMap<>(); + XzSecurityQualityInspectionRecordVo vo = records.get(i); + objectMap.put("inspectManName", vo.getInspectManName()); + objectMap.put("createEnterpriseName", vo.getCreateEnterpriseName()); + objectMap.put("verifyManName", vo.getVerifyManName()); + objectMap.put("notifyPersonName", vo.getNotifyPersonName()); + objectMap.put("enterpriseName", vo.getEnterpriseName()); + objectMap.put("fullName", vo.getFullName()); + objectMap.put("routineCheckName", vo.getRoutineCheckName()); + objectMap.put("changeName", vo.getChangeName()); + objectMap.put("reviewName", vo.getReviewName()); + objectMap.put("overTime", vo.getOverTime()); + objectMap.put("problemDescription", vo.getProblemDescription()); + objectMap.put("dangerName", vo.getDangerName()); + objectMap.put("dangerItemName", vo.getDangerItemName()); + objectMap.put("engineeringName", vo.getEngineeringName()); + objectMap.put("jobApplicationUnitName", vo.getJobApplicationUnitName()); + objectMap.put("workTicketCode", vo.getWorkTicketCode()); + objectMap.put("deductScore", vo.getDeductScore()); + objectMap.put("mainEnterpriseName", vo.getMainEnterpriseName()); + objectMap.put("id", vo.getId()); + objectMap.put("regionId", vo.getRegionId()); + objectMap.put("regionName", vo.getRegionName()); + objectMap.put("remark", vo.getRemark()); + objectMap.put("dangerDesc", vo.getDangerDesc()); + objectMap.put("dangerItemContent", vo.getDangerItemContent()); + objectMap.put("dangerItemId", vo.getDangerItemId()); + objectMap.put("dangerTypeId", vo.getDangerTypeId()); + objectMap.put("level", vo.getLevel()); + objectMap.put("measurePoints", vo.getMeasurePoints()); + objectMap.put("urgentLevel", vo.getUrgentLevel()); + //状态,2待整改,3待复查,4待核验,5合格,6已撤回 + objectMap.put("status", getStatusText(vo.getStatus())); + objectMap.put("notifyPerson", vo.getNotifyPerson()); + objectMap.put("creatorId", vo.getCreatorId()); + objectMap.put("createTime", DateUtil.format(DateUtil.parseDateTime(vo.getCreateTime()), "yyyy.MM.dd")); + objectMap.put("changeId", vo.getChangeId()); + objectMap.put("changeLimitTime", vo.getChangeLimitTime()); + objectMap.put("inspectManId", vo.getInspectManId()); + objectMap.put("inspectTime", vo.getInspectTime()); + objectMap.put("recordType", vo.getRecordType()); + objectMap.put("fileUrl", vo.getFileUrl()); + objectMap.put("routineId", vo.getRoutineId()); + objectMap.put("completeTime", vo.getCompleteTime()); + objectMap.put("isDele", vo.getIsDele()); + objectMap.put("projectSn", vo.getProjectSn()); + objectMap.put("taskId", vo.getTaskId()); + objectMap.put("itemId", vo.getItemId()); + objectMap.put("subsectionId", vo.getSubsectionId()); + objectMap.put("subentryId", vo.getSubentryId()); + objectMap.put("floor", vo.getFloor()); + objectMap.put("addedDescription", vo.getAddedDescription()); + objectMap.put("engineeringId", vo.getEngineeringId()); + objectMap.put("type", vo.getType()); + objectMap.put("dutyMajor", Optional.ofNullable(dictDataMap.get(vo.getDutyMajor())).map(m -> m.getName()).orElse(null)); + objectMap.put("detailPlace", vo.getDetailPlace()); + objectMap.put("priorityNameDic", Optional.ofNullable(priorityNameDicNameMap.get(vo.getPriorityNameDic())).map(m -> m.getName()).orElse(null)); + objectMap.put("subsectionName", vo.getSubsectionName()); + objectMap.put("subentryName", vo.getSubentryName()); + objectMap.put("safeWatchAlarmExceedMinute", vo.getSafeWatchAlarmExceedMinute()); + objectMap.put("zgRectifyTime", vo.getZgRectifyTime()); + objectMap.put("zgFileUrl", vo.getZgFileUrl()); + objectMap.put("zgAdditionalRemarks", vo.getZgAdditionalRemarks()); + objectMap.put("fcRectifyTime", vo.getFcRectifyTime()); + objectMap.put("fcFileUrl", vo.getFcFileUrl()); + objectMap.put("fcAdditionalRemarks", vo.getFcAdditionalRemarks()); + objectMap.put("hyRectifyTime", vo.getHyRectifyTime()); + objectMap.put("hyFileUrl", vo.getHyFileUrl()); + objectMap.put("hyAdditionalRemarks", vo.getHyAdditionalRemarks()); + objectMap.put("violatorId", vo.getViolatorId()); + objectMap.put("regionIds", vo.getRegionIds()); + objectMap.put("reviewIds", vo.getReviewIds()); + objectMap.put("verifyManIds", vo.getVerifyManIds()); + objectMap.put("enterpriseIds", vo.getEnterpriseIds()); + objectMap.put("enterpriseSns", vo.getEnterpriseSns()); + objectMap.put("regionNames", vo.getRegionNames()); + objectMap.put("reviewNames", vo.getReviewNames()); + objectMap.put("verifyManNames", vo.getVerifyManNames()); + objectMap.put("enterpriseNames", vo.getEnterpriseNames()); + objectMap.put("no", i + 1); + byte[] bytes = new byte[0]; + try { + bytes = cn.hutool.core.io.FileUtil.readBytes(PathUtil.getBasePath() + "/" + vo.getImageUrl()); + } catch (Exception e) { + } finally { + imageBytesList.add(bytes); + } + bytes = new byte[0]; + try { + bytes = cn.hutool.core.io.FileUtil.readBytes(PathUtil.getBasePath() + "/" + vo.getRectifyAfterImage()); + } catch (Exception e) { + } finally { + rectifyAfterImageBytesList.add(bytes); + } +// objectMap.put("imageUrl", EasyPoiUtil.getImageEntityByXls(vo.getImageUrl())); +// objectMap.put("rectifyAfterImage", EasyPoiUtil.getImageEntityByXls(vo.getRectifyAfterImage())); + List split = StrUtil.split(vo.getDangerItemContent(), "/"); + objectMap.put("yhdl", CollUtil.get(split, 0)); + objectMap.put("yhxl", CollUtil.get(split, 1)); + listMap.add(objectMap); + } + map.put("listMap", listMap); + templateUrl = Fileutils.getExportTemplateFile("excel/潮州项目隐患统计汇总表.xlsx").getAbsolutePath(); + root.put(0, map); + TemplateExportParams params = new TemplateExportParams(templateUrl, true); + Workbook workbook = ExcelExportUtil.exportExcel(root, params); + //隐患图片 + ExcelUtils.exportPicture(workbook, 0, imageBytesList, 1, 3, 1); + //整改图片 + ExcelUtils.exportPicture(workbook, 0, rectifyAfterImageBytesList, 1, 9, 1); + ExcelUtils.downLoadExcel("潮州项目隐患统计汇总表.xlsx", response, workbook); + } catch (IOException e) { + log.error("", e); + throw new OpenAlertException("系统错误"); + } finally { + if (templateUrl != null) { + FileUtil.deleteFile(templateUrl); + } + } + } + + public String getStatusText(Integer status) { + if (status == null) { + return ""; + } + if (status == 2) { + return "待整改"; + } else if (status == 3) { + return "待复查"; + } else if (status == 4) { + return "待核验"; + } else if (status == 5) { + return "合格"; + } else if (status == 6) { + return "已撤回"; + } else { + return "未知状态"; + } + } } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityInspectionRecord.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityInspectionRecord.java index f41b90f9a..d620c0528 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityInspectionRecord.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/entity/XzSecurityQualityInspectionRecord.java @@ -352,4 +352,8 @@ public class XzSecurityQualityInspectionRecord implements Serializable { @TableField(exist = false) @ApiModelProperty(value = "合作单位名称s(多个,分隔)") private String enterpriseNames; + @TableField(exist = false) + @ApiModelProperty(value = "草稿id") + private String draftId; + } diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityInspectionRecordServiceImpl.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityInspectionRecordServiceImpl.java index a3d9f3347..bf989ed4e 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityInspectionRecordServiceImpl.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/service/impl/XzSecurityQualityInspectionRecordServiceImpl.java @@ -7,6 +7,7 @@ import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -181,6 +182,9 @@ public class XzSecurityQualityInspectionRecordServiceImpl extends ServiceImpl getChildrenByQualityRegionId(Long regionId, List all) { ArrayList list = new ArrayList<>(); @@ -490,6 +494,12 @@ public class XzSecurityQualityInspectionRecordServiceImpl extends ServiceImpl() + .set(XzSecurityQualityInspectionRecordDraft::getIsGenerate, 1) + .eq(XzSecurityQualityInspectionRecordDraft::getId, record.getDraftId()) + ); + } saveBindData(record); if (Objects.equals(record.getRecordType(), XzSecurityQualityInspectionRecordRecordTypeEnum.DANGER.getValue()) && Objects.equals(record.getStatus(), XzSecurityQualityInspectionRecordStatusEnum.NOT_RECTIFIED.getValue())) { noticeService.addUserNoticeAndApp(record.getChangeId(), "安全管理待整改", "您有一条安全检查待整改,问题:" + record.getDangerItemContent(), "10", diff --git a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java index 604b327ca..7707dfe60 100644 --- a/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java +++ b/src/main/java/com/zhgd/xmgl/util/ExcelUtils.java @@ -12,13 +12,12 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.time.DateFormatUtils; +import org.apache.poi.hssf.usermodel.HSSFClientAnchor; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.util.IOUtils; -import org.apache.poi.xssf.usermodel.XSSFCell; -import org.apache.poi.xssf.usermodel.XSSFRow; -import org.apache.poi.xssf.usermodel.XSSFSheet; -import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.poi.xssf.usermodel.*; import org.springframework.core.io.ClassPathResource; import javax.servlet.http.HttpServletResponse; @@ -871,6 +870,105 @@ public class ExcelUtils { } } + /** + * 导出图片到excel + * + * @param workbook 工作簿 + * @param sheetIndex 工作表索引 + * @param bytesList 导出的图片字节数组列表 + * @param startRow 开始行 + * @param startCol 开始列 + * @param direction 方向:1纵向2横向 + */ + public static void exportPicture(Workbook workbook, int sheetIndex, List bytesList, + int startRow, int startCol, int direction) { + if (workbook == null || bytesList == null || bytesList.isEmpty()) { + return; + } + + Sheet sheet = workbook.getSheetAt(sheetIndex); + if (sheet == null) { + return; + } + + Drawing drawing = sheet.createDrawingPatriarch(); + int rowIndex = startRow; + int colIndex = startCol; + + for (byte[] bytes : bytesList) { + if (bytes == null || bytes.length == 0) { + continue; + } + + try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes)) { + // 获取图片格式(简单判断,实际可能需要更复杂的检测) + int pictureType = getPictureType(bytes); + + // 添加图片到工作簿 + int pictureIndex = workbook.addPicture(bytes, pictureType); + + // 创建锚点定位图片 + ClientAnchor anchor; + if (workbook instanceof XSSFWorkbook) { + anchor = new XSSFClientAnchor(); + } else if (workbook instanceof HSSFWorkbook) { + anchor = new HSSFClientAnchor(); + } else { + anchor = workbook.getCreationHelper().createClientAnchor(); + } + + // 设置图片位置 + anchor.setCol1(colIndex); + anchor.setRow1(rowIndex); + anchor.setCol2(colIndex + 1); // 默认占1列宽度 + anchor.setRow2(rowIndex + 1); // 默认占1行高度 + + // 插入图片 + drawing.createPicture(anchor, pictureIndex); + + // 根据方向调整下一个图片的位置 + if (direction == 1) { + // 纵向排列:向下移动一行 + rowIndex++; + } else { + // 横向排列:向右移动一列 + colIndex++; + } + + } catch (Exception e) { + log.error("", e); + } + } + } + + /** + * 根据图片字节数组判断图片类型 + */ + private static int getPictureType(byte[] bytes) { + if (bytes.length < 4) { + return Workbook.PICTURE_TYPE_PNG; + } + + // 检查文件头标识 + if (bytes[0] == (byte) 0xFF && bytes[1] == (byte) 0xD8) { + return Workbook.PICTURE_TYPE_JPEG; + } else if (bytes[0] == (byte) 0x89 && bytes[1] == (byte) 0x50 && + bytes[2] == (byte) 0x4E && bytes[3] == (byte) 0x47) { + return Workbook.PICTURE_TYPE_PNG; + } else if (bytes[0] == (byte) 0x42 && bytes[1] == (byte) 0x4D) { + return Workbook.PICTURE_TYPE_DIB; + } else if (bytes[0] == (byte) 0x00 && bytes[1] == (byte) 0x00 && + bytes[2] == (byte) 0x01 && bytes[3] == (byte) 0x00) { + return Workbook.PICTURE_TYPE_EMF; + } else if (bytes[0] == (byte) 0x00 && bytes[1] == (byte) 0x00 && + bytes[2] == (byte) 0x02 && bytes[3] == (byte) 0x00) { + return Workbook.PICTURE_TYPE_WMF; + } + + // 默认返回PNG类型 + return Workbook.PICTURE_TYPE_PNG; + } + // // 示例用法 // public static void main(String[] args) { // try { diff --git a/src/main/resources/excel/人员考勤记录导出.xlsx b/src/main/resources/excel/人员考勤记录导出.xlsx index e080fd9f033970e6682537ffe945271cdd8593d8..e3abe1f88f3707383792e99c596954ef6a0f0b38 100644 GIT binary patch delta 1973 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 Z000000RSKX007LB`Xeg_NFV?J002WZnRfsH diff --git a/src/main/resources/excel/潮州项目隐患统计汇总表.xlsx b/src/main/resources/excel/潮州项目隐患统计汇总表.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..915c61074c7c832c1d639d6ed03c707c8b3e4bd4 GIT binary patch literal 11440 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 kq>cP#g$VSj{}(I2NF)lPx# literal 0 HcmV?d00001