工作中的小玩意——Excel数据汇总

最近想统计自己的工时,于是按条目记录每天,每项工作的分类和时间,最后再统计到一起。

按目前流行的做法,应该是弄个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的功能做图表。

这么玩不太好复现,更“合理”的办法应该是分成三部分:

  1. 一个Excel文件专门用来做数据输入
  2. 用C#或者另外一个Excel表(vba或者透视表)来处理数据
  3. 最后的Excel文件将数据生成图表

不过我个人的目的就是试试VSTO,然后尽快用起来,这个月的报告有漂亮的图表用了,笔芯。

Oct,24 2018,小雨,上海

最近出差并不多,于是这次连续三天离开家,老婆又开始念叨起来。我无法断定她的真实想法,或者说哪种都是真实的想法,只是时间不同罢了。

换个角度来想,只是程度不同罢了。对生活的期望程度,对现状不满意的程度,理性与感性之间的摇摆。

其实我们俩个都是永远对现状不满,对未来充满要求的。只是程度不同罢了。

其实家里的事情能处理好,工作上的事情恐怕都能平A过去吧。

2018 Oct,12th 多云,北京

新财年的第一周,给自己加了一些压力。

体力上有些透支,不过精神状态还好,由于工作和生活计划执行得不错,反而有种轻松的感觉。

最近晚上多了一个习惯,会在心情向沉重的方向滑去时,喝一瓶啤酒。20天喝了10瓶,看来我的心理并没有相像中的坚强。

看心理医生这件事还是要提上日程了。

体检报告也出来了,减肥的效果得到了证实,脂肪肝和胆固醇回归到了正常范围,虽然还是几乎超差,甘油三酯1.73mmol/L,比参考值上限多了0.03,好可惜,继续保持体重和饮食习惯,明年应该就能正常了吧。

脾厚,有可能是肝引起的,需要抽空去医院验肝功能。

前列腺钙化灶,这个原因比较多,也要去医院再复查。

颈椎韧带钙化,这也是意料之中的问题了。

保持身体健康的前提下,保持给自己的压力吧。

Oct, 8th 2018, 晴,风,北京 to 上海

8月底同样是在动车上,曾经气到爆炸,主要原因是去出差的理由无聊到极致,而且被扰民的邻居搞得家里鸡犬不宁。

两个事情其实本质上是有点相似的,就是因为人,某些相关人员的行为,对其他的人带来了困扰,相对的为其带来了好处。而且要量化其他人的困扰,与他自己的好处的话, 困扰是远远大于好处的。

所以要解决的话,貌似方法很简单,就是让肇事者感觉到他得到的便利,不足以抵消受害者反抗对他带来的不便。当然这种反抗有合理的方式,也有过分的方式。

但是从其他层面上看,这种解决办法是否是最好的呢?旁观者是如何看待这些冲突的呢?

如果从人生长跑的角度来看,对于一些小事,可能什么也不做就是最好的办法了吧,其实做这些事的人已经得到惩罚了。

如果是公司管理的角度,如果我有两个下属因为一些事情争执,我首先关心的恐怕不是谁对谁错,也不是犯错的人我是否要惩罚,而是这事有什么结果,是否严重,能否解决。了解完事情以及如何处理后,恐怕才是责任与处罚,而这时候的决定,已经不单纯的和起因有关了,而是包括了处理方式。比如B投诉A惹了祸,然后A说这是他手底下干的,出了什么状况,现在事情已经解决了,问题也澄清了,客户也满意了。这时我应该不会觉得A有什么错误,而是觉得A处理得挺好的;对B呢,可能有看法,可能没有看法。

想通了这点,其实有些事已经无所谓了,首先保护好自己的利益(广义上的),然后才是追究其他人,甚至没必要追究。这条也当作明年工作的指导思想吧。

 

Oct, 7th 2018, 晴,北京

明天就是新财年第一个工作日了,关于工作,方向其实已经想得很明白了,但是细节还是一团乱麻。

一个原因是无法静心下来,在家办公的问题就是无法很好的将状态调整到完全工作状态,尤其在小孩还是几个月的状态。

另外一个原因,就是自己很久没有投入的工作过了,并不是不想,是很难达到那种注意力集中做一件事的感觉中。

明天晚上到酒店,争取找一找这种状态。

一是把工作的细节理清,二是思考一下生活方面的规划,特别是改善住房的资金。