buhuazhen
2026-03-20 ba6eba202110af165366377168d0561d5d222d7c
fix(staff): 解决导出数据列数不一致问题

- 计算导出列表中最大列数
- 补充每行数据不足列数时填充占位符 "-"
- 保证导出表格列对齐一致性

fix(personalShift): 修复导出Excel流及处理班次时间格式异常

- 优化导出接口,使用ServletOutputStream输出Excel文件,设置正确响应头
- 统一导出文件命名,支持UTF-8编码中文文件名
- 调整EasyExcel写入逻辑,注册自适应列宽和单元格样式处理器
- 添加输出流刷新,避免输出内容丢失
- 处理排班时间数据,跳过格式不符合预期的条目,防止异常发生
已修改2个文件
55 ■■■■ 文件已修改
src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/PersonalShiftServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/PersonalShiftController.java
@@ -17,6 +17,7 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import java.util.Collection;
@@ -67,31 +68,42 @@
    @ApiOperation(value = "导出")
    @GetMapping("export")
    public void exportToExcel(@NotNull(message = "时间不能为空!") String time, String userName, Integer sysDeptId, Boolean isMonth, HttpServletResponse response) throws Exception {
        Map<Object, Object> data;
        ServletOutputStream out = response.getOutputStream();
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        response.setHeader("requestType","excel");
        response.setHeader("Access-Control-Expose-Headers", "requestType");
        response.setCharacterEncoding("utf-8");
        response.setHeader("Content-Disposition", "attachment;filename*=UTF-8''" + time + ".xlsx");
        if (!isMonth) {
            data = personalShiftService.exportToYearExcel(time, userName, sysDeptId);
            // 设置单元格样式
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(StyleYearUtils.getHeadStyle(), StyleYearUtils.getContentStyle());
            // 保存到第一个sheet中
            EasyExcel.write(response.getOutputStream())
            Map<Object, Object> data = personalShiftService.exportToYearExcel(time, userName, sysDeptId);
            HorizontalCellStyleStrategy style = new HorizontalCellStyleStrategy(
                    StyleYearUtils.getHeadStyle(),
                    StyleYearUtils.getContentStyle()
            );
            EasyExcel.write(out)
                    .head((List<List<String>>) data.get("header"))
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy()) // 自适应列宽
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
                    .registerWriteHandler(style)
                    .sheet("年度")
                    .doWrite((Collection<?>) data.get("data"));
        } else {
            data = personalShiftService.exportToMonthExcel(time, userName, sysDeptId);
            // 设置单元格样式
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(StyleMonthUtils.getHeadStyle(), StyleMonthUtils.getContentStyle());
            EasyExcel.write(response.getOutputStream())
            Map<Object, Object> data = personalShiftService.exportToMonthExcel(time, userName, sysDeptId);
            HorizontalCellStyleStrategy style = new HorizontalCellStyleStrategy(
                    StyleMonthUtils.getHeadStyle(),
                    StyleMonthUtils.getContentStyle()
            );
            EasyExcel.write(out)
                    .head((List<List<String>>) data.get("header"))
                    .registerWriteHandler(horizontalCellStyleStrategy)
                    .registerWriteHandler(style)
                    .sheet("月度")
                    .doWrite((Collection<?>) data.get("data"));
        }
        out.flush();
    }
src/main/java/com/ruoyi/staff/service/impl/PersonalShiftServiceImpl.java
@@ -228,6 +228,9 @@
            for (String shiftTime : shiftTimes) {
                Map<String, Object> hashMap = new HashMap<>();
                String[] shiftTimeAndShift = shiftTime.split(":");
                if(shiftTimeAndShift.length != 3){
                    continue;
                }
                for (PersonalAttendanceLocationConfig personalAttendanceLocationConfig : personalAttendanceLocationConfigs) {
                    if (!i.getMonthlyAttendance().containsKey(personalAttendanceLocationConfig.getShift())) {
                        i.getMonthlyAttendance().put(personalAttendanceLocationConfig.getShift(), 0);
@@ -258,6 +261,16 @@
        LocalDateTime localDateTime = LocalDateTime.parse(time, formatters);
        map.put("header", getMonthHeader(localDateTime));
        List<List<Object>> lists = dataRequiredForProcessingIntoExcelMonth(mapIPage, personalAttendanceLocationConfigs);
        int maxSize = lists.stream()
                .mapToInt(List::size)
                .max()
                .orElse(0);
        for (List<Object> row : lists) {
            while (row.size() < maxSize) {
                row.add("-");
            }
        }
        map.put("data", lists);
        return map;
    }