最近想统计自己的工时,于是按条目记录每天,每项工作的分类和时间,最后再统计到一起。
按目前流行的做法,应该是弄个APP输入数据,然后服务器做大数据分析。不过我就一个人,工作思路还有可能变,老板还有可能经常提要求,还是做个柔性一点的吧。
最后方法是Excel+VSTO(C#),其实纯C#我更熟,Excel+VBA更亲民,不过从开发的目的来讲,就是为了自己方便的玩意,输入数据还要开VS,或者在Excel带的IDE里敲vba还是太自虐了。
数据页很简单,日期,地点,起始时间,终止时间,包含的旅途时间,具体的分类等,在Excel里面每天输入少则再三项,多则十来项,还算方便。
2018/10/8 | Beijing | 7:30 | 12:00 | 2.5 | 3.2 | 模具自动化 |
然后就是VSTO部分。
主要几个功能:在Ribbon添加一个按钮。参考
https://docs.microsoft.com/en-us/visualstudio/vsto/ribbon-overview?view=vs-2017
通常自定义Ribbon都是Plug-in级别的,针对某个文档操作的话,开始没有成功,后来注意到有个叫OfficeId的属性,是自定义Ribbon所在的标签从属,修改成TabHome就显示,怀疑是我没有管理员权限的问题。
在Ribbon里添加了一个按钮,后来想想其实自定义一个Panel更简单。点击按钮,会遍历所有项目,并建立一个数据表。
然后在新的标签页里将数据表按照自己的需求,筛选汇总。
节选一部分代码吧。
private void FillSummarySheet() { var worksheet = Globals.Sheet10; //汇总页 worksheet.WorkingHourArea.ClearContents(); //提前定义好的数据区域 NamedRange int start_index = 1; //Workinghour table worksheet.Cells[start_index, 1].Value = "The Working hours"; worksheet.Cells[start_index + 1, 1].Value = "Date"; worksheet.Cells[start_index + 1, 2].Value = "BU Sulution"; worksheet.Cells[start_index + 1, 3].Value = "NEV"; worksheet.Cells[start_index + 1, 4].Value = "Bridge CMM"; worksheet.Cells[start_index + 1, 5].Value = "Software"; worksheet.Cells[start_index + 1, 6].Value = "Digital"; worksheet.Cells[start_index + 1, 7].Value = "new PSE"; worksheet.Cells[start_index + 1, 8].Value = "Admin"; //我自己工作的分类项目 for(int i=1;i<=12;i++) { int current_month = (10 + i - 1) % 12; if (current_month == 0) current_month = 12; string month_str = (new DateTime(2018, current_month, 1)).ToString("MMM"); //土办法,遍历月份,应该有更好办法吧 worksheet.Cells[start_index + 1 + i, 1].Value = month_str; for(int j=1;j<=7;j++) { worksheet.Cells[start_index + 1 + i, 1+j].Value = Datas.Where(n => n.Type.StartsWith(j.ToString())).Where(n => n.Date.Month == current_month).Sum(n => n.WorkingTime); //筛选——某种分类下(例如3 & 3.1 & 3.2)对应月份的工时求和 } } }
后面就简单了,有什么新的需求就添加几行,然后在表里面直接用Excel的功能做图表。
这么玩不太好复现,更“合理”的办法应该是分成三部分:
- 一个Excel文件专门用来做数据输入
- 用C#或者另外一个Excel表(vba或者透视表)来处理数据
- 最后的Excel文件将数据生成图表
不过我个人的目的就是试试VSTO,然后尽快用起来,这个月的报告有漂亮的图表用了,笔芯。