C#加班统计次数

news2024/9/24 17:20:13

C#加班统计次数

运行环境:vs2022 .net 8.0 社区版
1、用C#语言;2、有界面上传Excel文件; 3、对Excel列(部门、人员姓名、人员编号、考勤时间 )处理:(1)按人员编号、考勤日期分组且保留原来字段,保留唯一最晚考勤时间记录,(2)按人员编号分组,统计分组员工加班次数:判断条件(1)周一至周五(2)打卡时间超过17:30 4、输出Excel在另一个sheet标签统计。

using System.Windows.Forms;
using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

namespace WinFormsApp1
{
    public partial class Form : System.Windows.Forms.Form
    {
        
        public Form()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            openFileDialog.Filter = "Excel Files|*.xls;*.xlsx;*.xlsm";

            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                // 用户选择了一个文件
                string selectedFilePath = openFileDialog.FileName;

                // 在这里可以编写上传文件的逻辑,例如将文件复制到指定位置、读取文件内容等
                // 这里只是简单的演示,可以根据实际需求进行扩展
                //MessageBox.Show($"已选择文件:{selectedFilePath}");
                txtUpload.Text = selectedFilePath;
                ProcessExcelFile(selectedFilePath);
                
            }
        }
      
        public void ProcessExcelFile(string filePath)
        {
            FileInfo fileInfo = new FileInfo(filePath);
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            using (ExcelPackage package = new ExcelPackage(fileInfo))
            {
                ExcelWorksheet worksheet = package.Workbook.Worksheets[0]; // 假设数据在第一个sheet中

                int rowCount = worksheet.Dimension.Rows;
                int colCount = worksheet.Dimension.Columns;

                // 数据处理
                List<EmployeeAttendance> attendanceList = new List<EmployeeAttendance>();
                try
                {
                    for (int row = 3; row <= rowCount; row++) // 假设第一行是标题行
                    {
                        string department = worksheet.Cells[row, 2].Value?.ToString();
                        string employeeName = worksheet.Cells[row, 3].Value?.ToString();
                        int employeeId = Convert.ToInt32(worksheet.Cells[row, 4].Value);
                        DateTime attendanceTime = DateTime.Parse(worksheet.Cells[row, 7].Value?.ToString());

                        attendanceList.Add(new EmployeeAttendance
                        {
                            Department = department,
                            EmployeeName = employeeName,
                            EmployeeId = employeeId,
                            AttendanceTime = attendanceTime
                        });
                    }
                }
                catch (Exception e)
                {
                    MessageBox.Show("提示:Excel文件格式不对!请重新选择\n错误信息:" + e.Message);
                    throw e;
                }


                // // 使用 LINQ 查询,按照人员编号、人员姓名、部门、考勤日期分组并保留最晚考勤时间记录,条件是在周一至周五
                var latestAttendanceRecords = attendanceList
                    .Where(a => a.AttendanceTime.DayOfWeek >= DayOfWeek.Monday && a.AttendanceTime.DayOfWeek <= DayOfWeek.Friday)
                    .GroupBy(a => new { a.EmployeeId,a.EmployeeName,a.Department, a.AttendanceTime.Date })
                    .Select(g => g.OrderByDescending(a => a.AttendanceTime).First())
                    .ToList();
                try
                {
                    Random random = new Random();
                    int randomNumber = random.Next(1000, 10000); // 生成1000到9999之间的随机整数
                                                                 // 输出统计结果到另一个sheet
                    ExcelWorksheet resultSheet = package.Workbook.Worksheets.Add($"最晚打卡记录{randomNumber}");

                    // 写入标题
                    resultSheet.Cells[1, 1].Value = "员工编号";
                    resultSheet.Cells[1, 2].Value = "员工姓名";
                    resultSheet.Cells[1, 3].Value = "员工部门";
                    resultSheet.Cells[1, 4].Value = "考勤时间";

                    // 写入数据
                    int rowIndex = 2;
                    foreach (var kvp in latestAttendanceRecords)
                    {
                        resultSheet.Cells[rowIndex, 1].Value = kvp.EmployeeId;
                        resultSheet.Cells[rowIndex, 2].Value = kvp.EmployeeName;
                        resultSheet.Cells[rowIndex, 3].Value = kvp.Department;
                        resultSheet.Cells[rowIndex, 4].Value = kvp.AttendanceTime;
                        rowIndex++;
                    }

                    // 保存文件
                    package.Save();
                    //MessageBox.Show($"统计结果输出成功");
                }
                catch (Exception)
                {

                    throw;
                }

                // 按照人员编号、人员姓名和部门分组,统计每个人的加班次数,并且考勤时间超过17点
                var overtimeCountByEmployee = latestAttendanceRecords.Where(a =>(a.AttendanceTime.Hour == 17 && a.AttendanceTime.Minute >= 30)||(a.AttendanceTime.Hour > 17 ))
                    .GroupBy(a => new { a.EmployeeId, a.EmployeeName, a.Department })
                    .Select(g => new
                    {
                        EmployeeId = g.Key.EmployeeId,
                        EmployeeName = g.Key.EmployeeName,
                        Department = g.Key.Department,
                        OvertimeCount = g.Count()
                    })
                    .ToList();
                try
                {
                    Random random = new Random();
                    int randomNumber = random.Next(1000, 10000); // 生成1000到9999之间的随机整数
                                                                 // 输出统计结果到另一个sheet
                    ExcelWorksheet resultSheet = package.Workbook.Worksheets.Add($"统计结果{randomNumber}");

                    // 写入标题
                    resultSheet.Cells[1, 1].Value = "员工编号";
                    resultSheet.Cells[1, 2].Value = "员工姓名";
                    resultSheet.Cells[1, 3].Value = "员工部门";
                    resultSheet.Cells[1, 4].Value = "加班次数";

                    // 写入数据
                    int rowIndex = 2;
                    foreach (var kvp in overtimeCountByEmployee)
                    {
                        resultSheet.Cells[rowIndex, 1].Value = kvp.EmployeeId;
                        resultSheet.Cells[rowIndex, 2].Value = kvp.EmployeeName;
                        resultSheet.Cells[rowIndex, 3].Value = kvp.Department;
                        resultSheet.Cells[rowIndex, 4].Value = kvp.OvertimeCount;
                        rowIndex++;
                    }

                    // 保存文件
                    package.Save();
                    MessageBox.Show($"统计结果输出成功");
                    this.Close();

                }
                catch (Exception e)
                {
                    MessageBox.Show("提示:输出失败,该文件被打开,请关闭文件后重试!\n错误信息:" + e.Message);
                    throw e;
                }

              
            }
        }
    

    }
    public class EmployeeAttendance
    {
        public string Department { get; set; }
        public string EmployeeName { get; set; }
        public int EmployeeId { get; set; }
        public DateTime AttendanceTime { get; set; }
    }
}

界面:
在这里插入图片描述

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

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

相关文章

矩阵快速幂优化dp

之前一直想找一个矩阵快速幂的专题&#xff0c;但是都没有题目来总结&#xff0c;今天就来水一下 这个题目的转移方程我们可以很快想出来&#xff0c;但是我们如何作为我们矩阵快速幂的敲门砖呢&#xff1f; 有一个问题要注意的是我们由于这题不是取模的&#xff0c;可能会溢出…

网络安全-渗透测试工具及插件介绍和使用方法

1、Burp Suite Burp Suite 是用于攻击web 应用程序的集成平台。 是一款广泛使用的网络安全工具套件&#xff0c;主要用于测试Web应用程序的安全性。它可以帮助安全研究人员、渗透测试人员和开发人员发现和利用Web应用程序中的安全漏洞。 &#xff08;1&#xff09;下载和安装&a…

QuanTide-weekly第1期

本周Po文 这周我们共发表5篇文章。《基于 XGBoost 的组合策略…》等两篇详细讲解了机器学习构建组合策略的框架和常见问题。 文章要点与结论&#xff1a; 通过两阶段式方案实现多因子、多资产的组合策略构建。第一阶段基于XGBoost构建多个多因子单标的模型&#xff0c;第二阶…

安卓基本布局(下)

TableLayout 常用属性描述collapseColumns设置需要被隐藏的列的列号。shrinkColumns设置允许被伸缩的列的列号。stretchColumns设置允许被拉伸的列的列号。 <TableLayout xmlns:android"http://schemas.android.com/apk/res/android"android:id"id/TableL…

yolov3 neck部分搭建,以及完整的网络搭建代码,可直接运行

目录 1. 用来实现共同的一些操作 common_module.py 2.1 使用到的通道配置 net_config.py 2.2 主干网络 darknet53.py 3. predict部分 neck.py 4. 拼凑成完整的yolov3网络 Yolov3.py 5. 网络结构如下 上次提到了搭建了主干网络&#xff0c;这个加上neck就可以构建…

内网穿透--meterpreter端口转发实验

实验背景 通过公司带有防火墙功能的路由器接入互联网&#xff0c;然后由于私网IP的缘故&#xff0c;公网无法直接访问内部主机&#xff0c;则需要通过已连接会话&#xff0c;代理穿透访问内网主机服务。 实验设备 1.路由器一台 2.内网 Win 7一台 3.公网 Kali 一台 4.网络 …

LeetCode面试150——238除自身以外数组的乘积

题目难度&#xff1a;中等 默认优化目标&#xff1a;最小化平均时间复杂度。 Python默认为Python3。 目录 1 题目描述 2 题目解析 3 算法原理及代码实现 3.1 左右乘积列表 参考文献 1 题目描述 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 an…

第十二节、人物下蹲

一、SuB-State Machine(子状态机) 1、创建一个子状态 2、可以选择退出的动画 二、人物下蹲 1、人物动画下蹲 2、人物碰撞体下蹲

日志远程同步实验

目录 一.实验环境 二.实验配置 1.node1发送方配置 &#xff08;1&#xff09;node1写udp协议 &#xff08;2&#xff09;重启服务并清空日志 2.node2接收方配置 &#xff08;1&#xff09;node2打开接受日志的插件&#xff0c;指定插件用的端口 &#xff08;2&#xff…

C#和S7-1200PLC S7.NET通信

1、一步步建立一个C#项目 一步步建立一个C#项目(连续读取S7-1200PLC数据)_s7协议批量读取-CSDN博客文章浏览阅读1.7k次,点赞2次,收藏4次。这篇博客作为C#的基础系列,和大家分享如何一步步建立一个C#项目完成对S7-1200PLC数据的连续读取。首先创建一个窗体应用。_s7协议批量…

技术方案/建设方案/可研报告/实施方案怎么写?3000份WORD全学会

解决方案是针对客户某些已经出现的或者可以预期的问题(技术、业务、管理等)&#xff0c;不足&#xff0c;缺陷&#xff0c;需求等&#xff0c;所提出的一个解决问题的方案&#xff0c;同时能够确保加以有效执行。 解决方案不只是一篇文档&#xff0c;而是一整套的行动计划&…

论文翻译 | Is a Question Decomposition Unit All We Need? 我们是否只需要一个‘问题分解单元’?

摘要 大型语言模型(LMs)已经在许多自然语言处理(NLP)基准测试中取得了最先进的性能。 随着新基准数量的增加&#xff0c;我们构建了更大、更复杂的LM。然而&#xff0c;由于与之相关的成本、时间和环境影响&#xff0c;构建新的LM可能不是一个理想的选择。我们探索了另…

Midjourney咒语之油画风格纸雕艺术3D剪纸

油画风格 Captain America painting in the style of Vincent Van Gogh, Vincent Van Gogh style oil painting, oil painting, Van Gogh, Impasto, impasto style, lots of paint --v 5.1 --style raw --ar 3:2 lion king painting in the style of Vincent Van Gogh, Vincent…

【多模态LLM】多模态理解评测标准(图生文)

note 评测图片识别、理解、分析、推理能力&#xff1b;评测多轮对话&#xff1b;扩大评测场景&#xff08;日常生活、教育娱乐等&#xff09;SuperClue-V采用6个标准&#xff0c;即正确性、相关性、流畅性、知识延伸、输出样式多样化、多感官信息融合&#xff0c;来定量的评价…

一键生成专业PPT:2024年AI技术在PPT软件中的应用

不知道你毕业答辩的时候有没有做过PPT&#xff0c;是不是也被这个工具折磨过。没想到现在都有AI生成PPT的工具了吧&#xff1f;这次我就介绍几款可以轻松生成PPT的AI工具吧。 1.笔灵AIPPT 连接直达&#xff1a;https://ibiling.cn/ppt-zone 这个工具我最早是用它来写一些专…

Selenium自动化测试入门:浏览器多窗口切换【建议收藏】

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 有时web应用会打开多个浏览器窗口&#xff0c;当我们要定位新窗口中的元素时&#xff0c;我们需要将webDriver的handle&#xff08;句柄&#xff09;指定到新窗口…

一篇了解:性能测试工具——JMeter的安装

一、下载 环境要求&#xff1a;Java版本在8及以上。 安装链接&#xff1a;JMeter安装链接 下载压缩包之后解压即可。 二、配置 解压之后进入到bin目录下&#xff0c;双击jmeter.bat即可进入到该软件。 但是有一种更方便的方式进入jmeter软件&#xff1a; 复制该文件的bin文件…

MySQL操作表

文章目录 1.增加表2.查看表3.修改表修改表名&#xff1a;插入数据&#xff1a;新增一列&#xff1a;修改一列类型&#xff1a;修改列名&#xff1a;删掉一列&#xff1a; 4.删除表 1.增加表 创建表语法&#xff1a; CREATE TABLE table_name ( field1 datatype, field2 datat…

深入理解Kubernetes中的Pod:为什么需要Pause Pod及其核心作用

引言 在Kubernetes这一强大的容器编排系统中&#xff0c;Pod作为最小的部署和管理单位&#xff0c;扮演着至关重要的角色。本文将进一步深入探讨Pod的定义、基本概念&#xff0c;特别是为什么需要Pause Pod&#xff0c;以及Pod内部容器如何共享资源&#xff0c;同时解释Kubern…

从核心到边界:六边形、洋葱与COLA架构的深度解析

文章目录 1 引言2 软件架构3 架构分类4 典型的应用架构4.1 分层架构4.2 CQRS4.3 六边形架构4.4 洋葱架构4.5 DDD 5 COLA架构设计5.1 分层设计5.2 扩展设计5.3 规范设计5.3.1 组件规范5.3.2 包规范5.3.3 命名规范 6 COLA架构总览7 小结 1 引言 软件的首要技术使命&#xff1a;管…