当前位置: 首页 > news >正文

C#加班统计次数

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之间的随机整数// 输出统计结果到另一个sheetExcelWorksheet 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之间的随机整数// 输出统计结果到另一个sheetExcelWorksheet 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; }}
}

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

相关文章:

C#加班统计次数

C#加班统计次数 运行环境&#xff1a;vs2022 .net 8.0 社区版 1、用C#语言&#xff1b;2、有界面上传Excel文件; 3、对Excel列&#xff08;部门、人员姓名、人员编号、考勤时间 &#xff09;处理&#xff1a;&#xff08;1&#xff09;按人员编号、考勤日期分组且保留原来字段&…...

【资治通鉴】“ 将欲取之、必先予之 “ 策略 ① ( 魏桓子 割让土地 | 资治通鉴原文分析 | 道德经、周书、吕氏春秋、六韬 中的相似策略 )

文章目录 一、" 将欲取之、必先予之 " 策略1、魏桓子 割让土地2、资治通鉴原文分析 二、" 将欲取之、必先予之 " 类似的原理1、将欲败之&#xff0c;必姑辅之&#xff1b;将欲取之&#xff0c;必姑与之 - 周书2、将欲歙之&#xff0c;必固张之&#xff0c;…...

Spring5 的日志学习

我们在使用 Spring5 的过程中会出现这样的现像&#xff0c;就是 Spring5 内部代码打印的日志和我们自己的业务代码打印日志使用的不是统一日志实现&#xff0c;尤其是在项目启动的时候&#xff0c;Spring5 的内部日志使用的是 log4j2&#xff0c;但是业务代码打印使用的可能是 …...

python爬虫实践

两个python程序的小实验&#xff08;附带源码&#xff09; 题目1 爬取http://www.gaosan.com/gaokao/196075.html 中国大学排名&#xff0c;并输出。提示&#xff1a;使用requests库获取页面的基本操作获取该页面&#xff0c;运用BeautifulSoup解析该页面绑定对象soup&#x…...

【前端面试】七、算法-数组展平

目录 1.判断数组 2.二维数组展平 3.多维数组展平 1.判断数组 // 判断数组console.log([].constructor Array);console.log( Array.isArray([]));console.log( [] instanceof Array);console.log(Object.prototype.toString.call([]) [object Array]); 2.二维数组展平 const…...

Laravel php框架与Yii php 框架的优缺点

Laravel和Yii都是流行的PHP框架&#xff0c;它们各自具有独特的优点和缺点。以下是对这两个框架优缺点的详细分析&#xff1a; Laravel PHP框架的优缺点 优点 1、设计思想先进&#xff1a;Laravel的设计思想非常先进&#xff0c;非常适合应用各种开发模式&#xff0c;如TDD&…...

使用 addRouteMiddleware 动态添加中间

title: 使用 addRouteMiddleware 动态添加中间 date: 2024/8/4 updated: 2024/8/4 author: cmdragon excerpt: 摘要&#xff1a;文章介绍了Nuxt3中addRouteMiddleware的使用方法&#xff0c;该功能允许开发者动态添加路由中间件&#xff0c;以实现诸如权限检查、动态重定向及…...

Zookeeper未授权访问漏洞

Zookeeper未授权访问漏洞 Zookeeper是分布式协同管理工具&#xff0c;常用来管理系统配置信息&#xff0c;提供分布式协同服务。Zookeeper的默认开放端口是 2181。Zookeeper安装部署之后默认情况下不需要任何身份验证&#xff0c;造成攻击者可以远程利用Zookeeper&#xff0c;…...

【JavaEE】定时器

目录 前言 什么是定时器 如何使用java中的定时器 实现计时器 实现MyTimeTask类 Time类中存储任务的数据结构 实现Timer中的schedule方法 实现MyTimer中的构造方法 处理构造方法中出现的线程安全问题 完整代码 考虑在限时等待wait中能否用sleep替换 能否用PriorityBlo…...

2024带你轻松玩转Parallels Desktop19虚拟机!让你在Mac电脑上运行Windows系统

大家好&#xff0c;今天我要给大家安利一款神奇的软件——Parallels Desktop 19虚拟机。这款软件不仅可以让你在Mac电脑上运行Windows系统&#xff0c;还能轻松切换两个操作系统之间的文件和应用程序&#xff0c;让你的工作效率翻倍&#xff01; 让我来介绍一下Parallels Desk…...

【算法】递归实现二分查找(优化)以及非递归实现二分查找

递归实现二分查找 思路分析 1.首先确定该数组中间的下标 mid (left right) / 2; 2.然后让需要查找的数 findVal 和 arr[mid] 比较 findVal > arr[mid]&#xff0c;说明要查找的数在 arr[mid] 右边&#xff0c;需要向右递归findVal < arr[mid]&#xff0c;说明要查…...

CDN 是什么?

CDN是一种分布式网络服务&#xff0c;通过将内容存储在分布式的服务器上&#xff0c;使用户可以从距离较近的服务器获取所需的内容&#xff0c;从而加速互联网上的内容传输。 就近访问&#xff1a;CDN 在全球范围内部署了多个服务器节点&#xff0c;用户的请求会被路由到距离最…...

索引:SpringCloudAlibaba分布式组件全部框架笔记

索引&#xff1a;SpringCloudAlibaba分布式组件全部框架笔记 一推荐一套分布式微服务的版本管理父工程pom模板&#xff1a;Springcloud、SpringCloudAlibaba、Springboot二SpringBoot、SpringCloud、SpringCloudAlibaba等各种组件的版本匹配图&#xff1a;三SpringBoot 3.x.x版…...

2024第五届华数杯数学建模竞赛C题思路+代码

目录 原题背景背景分析 问题一原题思路Step1:数据读取与处理Step2:计算最高评分&#xff08;Best Score, BS&#xff09;Step3:统计各城市的最高评分&#xff08;BS&#xff09;景点数量 程序读取数据数据预处理 问题二原题思路Step1: 定义评价指标Step2: 收集数据Step3: 标准化…...

FFmpeg源码:av_reduce函数分析

AVRational结构体和其相关的函数分析&#xff1a; FFmpeg有理数相关的源码&#xff1a;AVRational结构体和其相关的函数分析 FFmpeg源码&#xff1a;av_reduce函数分析 一、av_reduce函数的声明 av_reduce函数声明在FFmpeg源码&#xff08;本文演示用的FFmpeg源码版本为7.0…...

nginx: [error] open() “/run/nginx.pid“ failed (2: No such file or directory)

今天 准备访问下Nginx服务&#xff0c;但是 启动时出现如下报错&#xff1a;&#xff08;80端口被占用&#xff0c;没有找到nginx.pid文件&#xff09; 解决思路&#xff1a; 1、 查看下排查下nginx服务 #确认下nginx状态 ps -ef|grep nginx systemctl status nginx#查看端口…...

<数据集>BDD100K人车识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;15807张 标注数量(xml文件个数)&#xff1a;15807 标注数量(txt文件个数)&#xff1a;15807 标注类别数&#xff1a;7 标注类别名称&#xff1a; [pedestrian, car, bus, rider, motorcycle, truck, bicycle] 序号…...

利用SSE打造极简web聊天室

在B/S场景中&#xff0c;通常我们前端主动访问后端可以使用axios&#xff0c;效果很理想&#xff0c;而后端要访问前端则不能这样操作了&#xff0c;可以考虑SSE、websocket等方式&#xff0c;实时和性能均有保障。 下面给出一个简单的SSE例子&#xff0c;后端是nodeexpress&am…...

代码随想录第二十天|动态规划(4)

目录 LeetCode 322. 零钱兑换 LeetCode 279. 完全平方数 LeetCode 139. 单词拆分 总结 LeetCode 322. 零钱兑换 题目链接&#xff1a;LeetCode 322. 零钱兑换 思想&#xff1a;首先定义dp数组的含义&#xff0c;dp[j]即总金额为j的情况下所需的最少的硬币个数。接下来确定…...

TreeSize:免费的磁盘清理与管理神器,解决C盘爆满的燃眉之急

目录 TreeSize&#xff1a;免费的磁盘清理与管理神器&#xff0c;解决C盘爆满的燃眉之急 一、TreeSize介绍 二、下载安装TreeSize 2.1、下载地址 2.2、下载步骤 ​2.3、安装步骤 三、professional版的TreeSize试用 3.1、分析磁盘空间 3.2、显示拓展名统计信息 3.3、显…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする

日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...

Java - Mysql数据类型对应

Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案

JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停​​ 1. ​​安全点(Safepoint)阻塞​​ ​​现象​​:JVM暂停但无GC日志,日志显示No GCs detected。​​原因​​:JVM等待所有线程进入安全点(如…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Python ROS2【机器人中间件框架】 简介

销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...

腾讯云V3签名

想要接入腾讯云的Api&#xff0c;必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口&#xff0c;但总是卡在签名这一步&#xff0c;最后放弃选择SDK&#xff0c;这次终于自己代码实现。 可能腾讯云翻新了接口文档&#xff0c;现在阅读起来&#xff0c;清晰了很多&…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

android13 app的触摸问题定位分析流程

一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...