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

news2024/11/24 5:37:30

日历格式输出

  • 日历数据列表
    • 导出封装日历格式
    • 实体类
    • 效果

日历数据列表

/***
     * 封装日历数据
     * @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;
    }

导出封装日历格式


          @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;
    }

实体类

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;

}

效果

日历列表图:
在这里插入图片描述
导出数据:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2210032.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos7 Oracle 11g rac 静默安装(NFS配置共享存储)

1.环境信息准备 注意&#xff1a; 在配置网络时&#xff0c;Oracle RAC的每个节点必须具有至少两个以上的网卡&#xff0c;一张网卡对外提供网络服务&#xff0c;另一张网卡用于各个节点间的通信和心跳检测等。在配置RAC集群的网卡时&#xff0c;如果节点1的公共接口是eth0&…

随机变量及其分布

定义 1.随机变量是一个从样本空间&#xff08;所有可能结果的集合&#xff09;到实数集的函数。样本空间中的每个结果都对应于随机变量的一个值。随机变量的值可以是离散的&#xff0c;也可以是连续的。随机变量通常用大写字母表示&#xff0c;如 X、Y 或 Z。 2.随机变量和事…

难点:Linux 死机定位(进程虚拟地址空间耗尽)

死机定位(进程虚拟地址空间耗尽) 一、死机现象 内存富裕,但内存申请失败。 死机时打印: 怀疑是: 1、内存碎片原因导致。 2、进程虚拟地址空间耗尽导致。 3、进程资源限制导致。 二、内存碎片分析 1、理论知识:如何分析内存碎片化情况 使用 /proc/buddyinfo: /proc/…

Java-sec-code学习2

Java-Sec-Code学习1-文件上传漏洞 case1 url: http://127.0.0.1:8080/file/any 这是一个典型的上传页面&#xff0c;我们尝试上传一个文件试试看。 直接上传一个jsp文件&#xff0c;发现可以直接上传&#xff0c;非常顺利。这意味这后端和前端都没有对文件类型进行任何限制。…

[旧日谈]关于Qt的刷新事件频率,以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。

[旧日谈]关于Qt的刷新事件频率&#xff0c;以及我们在Qt的框架上做实时的绘制操作时我们该关心什么。 最近在开发的时候&#xff0c;发现一个依赖事件来刷新渲染的控件会导致程序很容易异常和崩溃。 当程序在运行的时候&#xff0c;其实软件本身的负载并不高&#xff0c;所以…

【LeetCode每日一题】——724.寻找数组的中心下标

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目注意】六【题目示例】七【题目提示】八【解题思路】九【时间频度】十【代码实现】十一【提交结果】 一【题目类别】 前缀和 二【题目难度】 简单 三【题目编号】 724.寻找数组的中心下标 四【…

python基础路径的迁移

本人未安装anaconda或pycharm等&#xff0c;仅安装了某个python环境&#xff0c;因此以下方法仅针对基础python环境的迁移&#xff0c;不确保其他软件或插件正常运行 第一步将原python路径的整个文件夹剪切到新的路径下 第二步修改系统环境变量&#xff0c;将原来的python路径…

胤娲科技:AI绘梦师——一键复刻梵高《星空》

想象一下&#xff0c;你手中握有一张梵高的《星空》原图&#xff0c;只需轻轻一点&#xff0c;AI便能化身绘画大师&#xff0c;一步步在画布上重现那璀璨星河。 这不是科幻电影中的桥段&#xff0c;而是华盛顿大学科研团队带来的“Inverse Painting”项目&#xff0c;正悄然改变…

【软件工程】McCabe复杂度计算

文章目录 一、定义与公式二、计算步骤三、示例四、注意事项 McCabe复杂度&#xff0c;又称为环路复杂度&#xff08;Cyclomatic Complexity&#xff09;&#xff0c;是一种用来度量软件程序复杂度的经典方法。它通过计算程序中独立路径的数量&#xff0c;帮助开发人员理解代码的…

CMIP6数据处理 ▎单点降尺度、统计方法的区域降尺度、基于WRF模式的动力降尺度

CMIP6数据被广泛应用于全球和地区的气候变化研究、极端天气和气候事件研究、气候变化影响和风险评估、气候变化的不确定性研究、气候反馈和敏感性研究以及气候政策和决策支持等多个领域。这些数据为我们理解和预测气候变化&#xff0c;评估气候变化的影响和风险&#xff0c;以及…

【从感知机到神经网络】

感知机 什么是感知机 公式、框图表示 直观举例 根据身高体重判断胖瘦的感知机。 1、根据已知样本训练出一条直线&#xff0c;用于对非训练样本进行分类&#xff0c;这条直线就是感知机模型。 三维情况下感知机模型是一个平面 感知机的缺陷 缺陷原因 不能处理异或问题&…

【hot100-java】路径总和 III

二叉树篇。 灵神题解 ps: 完结 历时许久的hot100终于结束了&#xff0c;先是python&#xff0c;后是java。 学到了不少语法&#xff0c;也挺爽的&#xff0c;希望接下来几遍会更加熟悉哈哈哈。

解读《ARM Cortex-M3 与Cortex-M4 权威指南》——第1章 ARM Cortex-M处理器简介

1. 三级流水线设计 解释:三级流水线设计意味着处理器在执行指令时可以同时处理多个步骤。这些步骤通常包括取指(Fetch)、译码(Decode)和执行(Execute)。好处:这种设计提高了指令的执行效率,使得处理器能够在每个时钟周期内完成更多的工作,从而提升整体性能。2. 哈佛总…

linux 效率化 - zsh + tmux

文章目录 简介涉及的资料/代码仓库让我们开始吧1. Oh my Zsh!2. 终端主题 - powerlevel10k &#xff08;赋能优雅终端界面&#xff09;3. Oh my Tmux!安装完成&#xff0c;再加点料1. tmux2. zsh 结语参考资料 简介 来看一段操作演示&#xff08;全程键盘&#xff0c;没有鼠标…

Linux系统——RAID

Linux系统——RAID 一、RAID二、模拟RAID创建使用1、创建RAID 52、挂载使用3、模拟RAID 5故障 三、RAID操作方式 一、RAID 冗余磁盘阵列 作用&#xff1a; 1、加快数据读写速度 2、提升数据可靠性 使用原则&#xff1a; 使用同品牌、同型号、同容量的硬盘 RAID 0 至少两块硬盘…

【IEEE独立出版 | 厦门大学主办】第四届人工智能、机器人和通信国际会议(ICAIRC 2024)

【IEEE独立出版 | 厦门大学主办】 第四届人工智能、机器人和通信国际会议&#xff08;ICAIRC 2024&#xff09; 2024 4th International Conference on Artificial Intelligence, Robotics, and Communication 2024年12月27-29日 | 中国厦门 >>往届均已成功见刊检索…

harbor 如何做到物理删除镜像 harbor镜像清理脚本

一、背景 相比于nexus&#xff0c;harbor的一大优点是方便及时清理无用的docker镜像。本文就harbor怎么设置清理&#xff0c;梳理一下具体的操作办法。 harbor 版本是 v2.9.0 二、目标 随着我们推送至仓库的镜像越来越多&#xff0c;带来的一个最大运维问题就是存储空间的浪…

【Java IO流】对象与字节流的序列化和反序列化

哈喽&#xff0c;哈喽&#xff0c;大家好~ 我是你们的老朋友&#xff1a;保护小周ღ 今天给大家带来的是 【Java IO流】对象与字节流的序列化和反序列化&#xff0c;首先了解, 本次主题有啥实际应用, 学习 ByteArrayOutputStream / ByteArrayInputStream 字节数组流, ObjectO…

微信开发者工具:音乐小程序报错

报错信息 GET http://localhost:3000/1.mp3 net::ERR CONNECTION REFUSED (env: Windows,mp,1.06.2303220;lib:3.6.0) 原因&#xff1a;小程序没有直接获取本地文件&#xff0c;为了提高访问速度&#xff0c;而采用放到网络服务器中网络访问的方式获取文件内容 解决办法&#…

H7-TOOL的LUA小程序教程第14期:任意波形信号发生器,0-20mA输出和微型数控电源(2024-10-11,已更新)

LUA脚本的好处是用户可以根据自己注册的一批API&#xff08;当前TOOL已经提供了几百个函数供大家使用&#xff09;&#xff0c;实现各种小程序&#xff0c;不再限制Flash里面已经下载的程序&#xff0c;就跟手机安装APP差不多&#xff0c;所以在H7-TOOL里面被广泛使用&#xff…