java生成日历数据列表并按日历格式导出到excel

日历格式输出

日历数据列表

java 复制代码
/***
     * 封装日历数据
     * @param year 年份
     * @param month 月份
     */
    public List<InspectionDailyStaffPlanCalendarData> selectCalendarDataList(int year,int month,List<InspectionDailyStaffPlan> staffPlansList) {

        //根据日期创建对象,默认当月第一天
        LocalDate of = LocalDate.of(year, month, 1);
        //获取当月第一天是周几
        int valueOfWeek = of.getDayOfWeek().getValue();

        //判断是否闰年(闰年2月有29天)
        boolean leapYear = of.isLeapYear();
        //获取输入月份共有多少天
        int monthDay = of.getMonth().length(leapYear);

        List<InspectionDailyStaffPlanCalendarData> list = new ArrayList<>();
        int weekNum = valueOfWeek;
        LocalDate today = LocalDate.now(); // 获取今天的日期

        //打印每个月的日期数
        for (int i = 1; i <= monthDay; i++) {
            InspectionDailyStaffPlanCalendarData calendarData = new InspectionDailyStaffPlanCalendarData();
            calendarData.setDay(i);
            calendarData.setYear(year);
            calendarData.setMonth(month);
            String dateStr = year+"-"+month+"-"+(i<10?"0"+i:i);
            calendarData.setPlanDate(DateUtils.getDate(dateStr));

            LocalDate otherDate = LocalDate.of(year, month, i);
            //判断是否是今日
            if (today.equals(otherDate)) {
                calendarData.setToday(1);
            } else {
                calendarData.setToday(0);
            }
            calendarData.setWeek(WeekEnums.getName(weekNum));
            if ((i+valueOfWeek-1) % 7 == 0){
                System.out.println();
                weekNum = 1;
            }else{
                weekNum = weekNum+1;
            }

            if(CollUtil.isNotEmpty(staffPlansList)){
                //封装值班领导和值班人员
                for (InspectionDailyStaffPlan staffPlan:staffPlansList) {
                    if(staffPlan.getPlanDate().equals(calendarData.getPlanDate())){
                        calendarData.setId(staffPlan.getId());
                        calendarData.setStaffLeaderName(staffPlan.getStaffUserLNames());
                        calendarData.setStaffUserNames(staffPlan.getStaffUserMNames());
                    }
                }
            }

            list.add(calendarData);
        }

        return list;
    }

导出封装日历格式

java 复制代码
          @Override
    @SneakyThrows
    public void exportCalendarData(InspectionDailyStaffPlan query) {
        Date planDate = query.getPlanDate();
        List<InspectionDailyStaffPlanCalendarData> list = selectCalendarDataList(query);
        if(CollUtil.isEmpty(list)){
            throw new BusinessException("导出数据为空.");
        }
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = requestAttributes.getResponse();
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码 当然和easyexcel没有关系
        String fileName = URLEncoder.encode("每月排班记录" + DateUtil.today(), StandardCharsets.UTF_8.toString());
        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

        EasyExcel.write(response.getOutputStream()).head(StaffPlanCalendarExcelData.head()).sheet().doWrite(StaffPlanCalendarExcelData.getCalendarData(planDate,list));

    }

  /***
     * 导出表头封装
     * @param
     * @return
     */
    public static List<List<String>> head() {
        List<List<String>> headTitles = ListUtils.newArrayList();
        headTitles.add(ListUtils.newArrayList("星期一"));
        headTitles.add(ListUtils.newArrayList("星期二"));
        headTitles.add(ListUtils.newArrayList("星期三"));
        headTitles.add(ListUtils.newArrayList("星期四"));
        headTitles.add(ListUtils.newArrayList("星期五"));
        headTitles.add(ListUtils.newArrayList("星期六"));
        headTitles.add(ListUtils.newArrayList("星期日"));
        return headTitles;
    }
    
    /***
     * 封装日历数据
     * dataList 封装好的日历列表
     */
    public static List<List<Object>> getCalendarData(Date planDate, List<InspectionDailyStaffPlanCalendarData> dataList) {
        LocalDate localDate = planDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        int year = localDate.getYear();
        int month = localDate.getMonthValue();

        List<List<Object>> contentList = ListUtils.newArrayList();
        if (CollUtil.isEmpty(dataList)) {
            return contentList;
        }
        //根据日期创建对象,默认当月第一天
        LocalDate of = LocalDate.of(year, month, 1);
        //获取当月第一天是周几
        int valueOfWeek = of.getDayOfWeek().getValue();

        List<Object> data = new ArrayList<>();
        for (int i = 1; i < valueOfWeek; i++) {
            data.add("");
        }

        //判断是否闰年(闰年2月有29天)
        boolean leapYear = of.isLeapYear();
        //获取输入月份共有多少天
        int monthDay = of.getMonth().length(leapYear);

        //打印每个月的日期数
        int weekNum = 1;
        for (int i = 1; i <= monthDay; i++) {
            if ((i+valueOfWeek-1) % 7 == 0){
                weekNum++;
            }
        }

        //周
        int dayOfWeek = 7-valueOfWeek;
        int val = 0;
        for (int y = 1; y <= weekNum; y++) {

            List<Object> obj = new ArrayList<>();
            for (int i = 1; i <=7; i++) {
                String str = "";
                if(dataList.size()>0){
                    InspectionDailyStaffPlanCalendarData calendarData = dataList.get(0);
                    str = "\t\t"+ calendarData.getDay()+"\n";
                    String lNames = StringUtils.isNoneBlank(calendarData.getStaffLeaderName())?"值班领导:"+calendarData.getStaffLeaderName()+"\n":"";
                    String mNames = StringUtils.isNoneBlank(calendarData.getStaffUserNames())?"值班人员:"+calendarData.getStaffUserNames():"";
                    str = "\t\t"+ calendarData.getDay()+"\n"+lNames+mNames;
                    dataList.remove(calendarData);
                }
                if(dayOfWeek>=0){
                    dayOfWeek--;
                    data.add(str);
                }else{
                    obj.add(str);
                }
                val++;
                if ((val+valueOfWeek-1) % 7 == 0){
                    break;
                }

            }

            if(y == 1){
                contentList.add(data);
            }else{
                contentList.add(obj);
            }

        }

        return contentList;
    }

实体类

java 复制代码
public class InspectionDailyStaffPlanCalendarData
{
    private static final long serialVersionUID = 1L;

    /** 主键id */
    private Long id;

    private int year;

    private int month;

    private int day;

    /** 值班计划日期 */
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date planDate;

    /** 星期 */
    private String week;

    /** 值班领导 */
    private String staffLeaderName;

    /** 值班人员 */
    private String staffUserNames;

    /** 是否今日 1:是 */
    private int today;

}

效果

日历列表图:

导出数据:

相关推荐
努力努力再努力wz2 分钟前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
敲代码的嘎仔17 分钟前
JavaWeb零基础学习Day2——JS & Vue
java·开发语言·前端·javascript·数据结构·学习·算法
夜晚中的人海29 分钟前
【C++】智能指针介绍
android·java·c++
正在走向自律1 小时前
RSA加密从原理到实践:Java后端与Vue前端全栈案例解析
java·前端·vue.js·密钥管理·rsa加密·密钥对·aes+rsa
咯哦哦哦哦1 小时前
关于QT 打印中文 乱码问题
java·数据库·qt
爱读源码的大都督1 小时前
天下苦@NonNull久矣,JSpecify总算来了,Spring 7率先支持!
java·后端·架构
木头没有瓜1 小时前
Slf4j 接口文档左侧菜单有显示,但是点击后空白
java
野犬寒鸦1 小时前
从零起步学习Redis || 第十二章:Redis Cluster集群如何解决Redis单机模式的性能瓶颈及高可用分布式部署方案详解
java·数据库·redis·后端·缓存
cxyxiaokui0012 小时前
还在用 @Autowired 字段注入?你可能正在写出“脆弱”的 Java 代码
java·后端·spring
珹洺2 小时前
Java-Spring入门指南(二十二)SSM整合前置基础
java·开发语言·spring