2025-11
19

随机应变,见招拆招

By xrspook @ 8:37:52 归类于: 烂日记

业务系统由从一期变成二期,摆在面前是两个格式化操作。当我做完第1个以后,我心里就很有底了,我知道第2个大概应该怎么做,也想清楚了输出的那些数据到底要放在哪里。一期的时候,我的原始数据从同事的Excel查询文件里获取,现在我需要做的就是多一步。首先得把数据从系统里导出,然后再执行我的VBA。

数据从系统导出,供VBA使用这里其实也是有个窍门的,一开始我也没想好,但是用了几天以后,我大概明白了。首先我得保证VBA跟源文件在同一个文件夹,这是我在脚本里写死的。其次,VBA文件只能是那个名字,只能是那个后缀,有一点不合适程序就会判定找不到那个文件,然后就会在那个文件夹里面建一个9KB大小的文件,名字是我需求的那个,实际上那个东西是打不开的,所以对新新手来说有迷惑性,但是当我一次又一次的遇到这个以后,我就习以为常了,看到那个9KB的东西我知道肯定因为我导出来的文件有些不对。

以前的浪潮系统我已经默认了只能用360极速打开,因为一期的时候他们只支持IE,而我用的浏览器是Firefox。不知道二期到底支持什么浏览器,反正我基本已经把360极速作为业务系统和OA系统的默认打开方式,其它东西基本不会通过那个打开。

因为导出的文件都是同样的名字,所以如果在某个文件夹里面不断保存,浏览器会很聪明地给第2个文件加个1,第3个文件加个2。我本想把那个文件覆盖掉,但360就是不让。因为我的电脑是默认显示文件后缀的,当我把那些有括号的1和2删除掉的时候,非常有可能就会删漏个空格,于是这就会导致VBA文件要读取源数据,实际上却找不到,接着就生成了那个9KB的玩意。怎么避免这个问题呢?这需要两个文件目录,我把浏览器下载的那个文件放在目录A。VBA文件放在目录B,目录B实际上也有一个以前的导出文件。把文件导出到目录A,然后再把目录A这个文件剪切到目录B。这种情况之下,windows允许我替换掉文件。那么我就能保证VBA能够找到适合的源,因为目录A已经没有了那个导出的文件,所以下一次下载的时候浏览器也不会给我自动添加后缀。虽然多了一个剪切粘贴的操作,但是整套流程下来非常顺畅,不会出现幺蛾子。在这种情况下,我的VBA依然无法正常运行,基本就意味着浪潮可能修改了那个查询,非常有可能是修改了字段名。比如切换系统的第1天,我很早就发现单据编号是错的,但是他们不能在我们作业的时候就上补丁,只能等我们作业完了才能修改,所以那天我只能用错的文件编号先做一波,然后第2天再重新来一次。当我第2天早上重新来的时候,发现又多了一些东西,单据编号改过来了。车船号本来在一列,终于分开了,但是当有车没船号或者有船没车,再或者车船号都没有的时候,没有在数据那写横杠。我还是得自己加工。一开始那里只有品种,补丁上去以后多了个二级品种,二级品种对我来说是毫无用处。最后一个修改的地方就是之前叫仓号的那个字段现在变成了货位。正是因为仓号变成了货位,车船号字段名没了,才让我的VBA读取数据的时候失败。他们每一次升级都不会告诉你,你也不知道他改动了什么,也就只有发现不对劲的时候再去见招拆招。

适应能力不强,还真的没法玩这些东西。

2025-11
17

汇总格式化

By xrspook @ 8:22:18 归类于: 烂日记

摆在我面前的格式化操作,从大的来说是两个格式化,从小的来说其实二者又有点区别。我自己的那个格式化是把明细数据整理好。因为导出的那些信息部分是完全缺失的,所以我需要建立新的字段,数据为空,后续手动录入,另外一些则属于没有直接给我数据,但是我可以根据已有的数据经过一系列的逻辑判断得出我需要的字段。相对来说,我的格式化需求要高一点,要慢慢来,因为字段的判定只要一急就会出错、不全面。另外的一个格式化则属于要做出一个汇总的数据。一开始我并不确定到底他们需要哪些信息,开会的时候我翻桌子了,他们意识到这个问题,也翻桌子了,我大概知道他们的用途是什么,因为好像那个东西我参与过,但具体内容是什么我不清楚。我需要他们给我一个截图,或者把已有的文件发给我,我自己去看到底是什么内容。

在他们把那个版本发给我之前,实际上我已经在琢磨怎么整那个。一开始我想到的是选择某些列得出一个明细,然后根据那个明细自动生成一个透视表,透视表里面的内容肯定足够他们填写相关的信息,但关键是他们想要的不是数据表,因为数据表很难复制粘贴。平时他们需要把那些东西转化为了一段文字贴到群里,数据透视表看上去的确更直观也不会错,但关键是图片这个东西很占空间,如果你几天不保存图片就会失效,所以如果要长期保存数据,还是纯文字比较靠谱。

一开始我尝试的是数据透视表,数据透视表很简单,但关键是不同版本的Excel数据透视表出来的默认格式不一样。他们干的这种事需要数据数据透视表不显示分类汇总,同时得重复所有标签。手工操作的话,这个很简单,但是用VBA控制的时候却发现自动生成的那些脚本又长又臭。那些又长又臭的东西到底能不能简化一些呢?VBA这个玩意的确可以通过录制生成,但关键是通过录制生成的那些东西通常都速度很慢,有很多废话,有些时候可能不太精准。所以我折腾了半个晚上,到底怎么把那些自动录屏出来的宏简化一些。虽然已经很努力,但是有个数据透视表不做分类汇总的那个坎好像挺难迈过去。

后来当他们把正在使用的那套查询数据库表发给我以后,发现或许我根本不需要生成透视表,实际上一个SQL的分组合并就能实现他们想要的东西,从那个查询表的内容看来,我的那个同事也是为他们做了这个事情。所以,整个逻辑就很清晰了,首先要看他们需要的那些数据在哪几列,刚好导出的那个大表上面的数据就能满足他们的要求,只是字段名有些不一样而已。这个很简单。所以逻辑就是把数据导出,删除最后一行,因为那个是汇总没有任何效果,然后把有数据的列全部转化为数字格式。因为神经病的浪潮为了他们自己方便所有列都设置为了文本,文本分组合并求和会完全不会起效。思路很简单,首先从原数据那里选取我需要的列,然后进行一些字段的重命名以及一些数字的转化分组合并,最后输出到我想要的地方。

一开始我并没有想好到底要输出到导出那个文件还是我有查询脚本的那个文件。经过一番的纠结和尝试以后,我感觉直接在我查询的文件通过ADO的方式查询那个导出的数据表,然后在查询的那个地方直接输出最便捷。一开始我想到的是要他们把转化好的内容贴到目标的表格,然后刷新一下。后来发现既然我都用了ADO。我根本不需要他们打开导出的原始表格我就能获取数据。

思路清晰以后,接下来的就只是执行。

2025-11
12

分析数据本地引用

By xrspook @ 8:25:41 归类于: 烂日记

用了一个晚上的时间,把之前直接用Deepseek或者手动转化出来的Excel数据改为引用Excel文件。这个操作并不难,但因为东西比较多,所以比较烦。首先我需要在一个Excel文件里面建好几个工作表,把每一组数据贴在不同的工作表,这样的好处是读取的时候就不怕会搞混了。在做那些工作表的同时我搞了个目录,把工作表到底是什么内容都安顿好。因为没有最终版本,所以我还没有设置超连接。做目录和超连接都挺简单。接下来的事情就是在每一个直接引用数据的py文件里修改引用方式。

因为DS的神经,所以那些格式化过的数据有些是列表,有些是元组。之所以要用元组,因为这样就一定不会出现字段长度不一致。可以这么说,被DS处理过的数据如果用列表去表达,几乎每一次可视化分析的时候都会被告知字段长度不一致。因为这个,所以后来我在提要求告诉它要作什么图的时候,我直接它先把数据以元组方式格式化,用元组的方式格式化了以后保证字段长度一定是一样的,但关键是会不会少了几个不知道。幸亏几年前我是认真学过Python的,基础的字符串列表元组字典我还是有点懂。我感觉哪怕我不是自己手动把Excel里面的某列数据转化为列表,而是把它贴掉某个地方在线转化,也不至于在转化之后东西丢失。DS是怎么做到把我的数据弄丢了呢?

之前用Python操作Excel的时候,打开Excel文件用的是xlwings,之所以用那个是因为那本叫《超简单 用Python让Excel飞起来》的书主要用的就是那个。那个跟其它库相比我觉得差异主要在于支持打开的Excel文件的后缀比较多。这样我就不需要针对这个文件用这种打开方式那个文件用另外一款,但如果我用了xlwings,但是我的程序不通过,做到一半就卡住了,那么Excel文件就会处于一个打开的状态。我只能去任务管理器那里手动把已经打开的文件关闭,否则我没办法继续下去。之前我好像没有试过光是读取Excel文件里面的数据,不把加工后的东西写回到Excel里。如果要进行Excel文件的写入,我感觉有必要把Excel文件打开,但打开了以后程序卡住无法进行下去,难以避免得有一个关闭的过程,估计可以写一段代码,把Excel通通关闭掉。只是我当初没有干这个,只是很老实地手动操作。

如果我只是读取Excel文件的某些内容,不往那个文件里面写入数据,是不是意味着或许我可以用一种类似ADO的方式读取文件数据,不需要进行实际的打开和关闭呢?

这一次我需要用pandas读取Excel里面的数据,但我不需要把加工后的数据写入到Excel,因为只有两个结果,一个是生成png图,另外一个是一些相关分析的结论。相关分析的结论我可以直接在终端里拷贝,又或者我可以直接生成txt文件。这次我用pandas直接读取,发现的确可以,而且貌似也没有那种程序虽然被卡住,但是Excel没有被正常关闭的问题。据说用panda读取Excel数据,实际上panda是引用了其它库,所以如果要在pandas里实现这个功能,要安装其它库才行。我在一开始的时候只引用了panda,就可以做到读取Excel文件,不需要把pandas引用的那些库也都引用一遍,但可以肯定的是其它库估计我都已经安装过了。

一开始尝试阶段会比较慢,后来熟了之后速度加快了,但因为我是一个完美主义者,所以对一些细节的把控还是翻来覆去,纠结了好些时间,比如网格线到底要用半透明的还是直接不透明。

但总算用一个晚上的时间,我就实现了我想做的全部。

2025-11
9

又想起了Python

By xrspook @ 8:44:06 归类于: 烂日记

大概两年前,我买了一本叫《超简单 用Python让Excel飞起来》的书。那本书是怎么买的呢?我搜索关于Python跟Excel的书,然后就看到了它。说白了就是教你用Python去处理Excel。前面的部分是一些批处理,后面的那些是利用Excel的数据作图。批处理的部分我看得挺认真,也实际操作过。感觉基本上都是可以实现的,我在VSCode里写Python,然后引用Excel文件,最后把结果输出到Excel。的确,这样干可以批处理一些基本的问题,但关键是我是个完美主义者,所以我对输出格式有一定的要求,实际上这本书教你的东西不怎么包括具体调整格式本身。通常来说做法大概是读取文件,然后通过pandas处理,最后输出。在这里我学得比较认真的部分是批处理文件,无论是把一个工作簿的每个工作表分别另存为单独的工作簿还是把某个文件夹里面的工作簿全部都合并到一个工作簿里。这些翻来覆去的操作其中一个跑不掉的是要进行一定的循环,循环的思路搞清楚了以后一切都好说。学的时候很认真,也都全部尝试过了,但一段时间之后不用还是会全部都忘光光,最后剩下的只是知道一定可以通过批处理实现这些功能。

在电脑里面安装Python,然后通过这种方式的确是可以处理Excel文件,后来我也进一步对那些输出的文件进行了格式控制,但总的来说,还是有些不如人意的地方。就数据处理本身来说,Python没有任何问题,但关键是跟VBA这个原生的东西相比,在处理格式方面还是显得有点有心无力,又或者无法控制。一个很明显的地方就在于跟VBA相比,Python读取文件跟输出文件都得一定时间,可能数据处理本身不需要多少性能,但关键是打开文件关闭文件这都需要时间。后来机缘巧合之下,我知道了在VBA里可以通过ADO的方式用SQL解决数据的问题。ADO的方式意味着我并不需要真的打开文件,这样就节省了很多时间。以至于后来我用VBA取代了Python的功能,因为Python之所以好用是因为把Excel的数据传进去了以后,它对数据进行了一个类似数据库的标准化改造,然后用标准的语言实现某些功能。相比之下我觉得SQL更简单易懂。所以自从迷上了ADO+SQL以后,我基本上就没再用Python处理Excel了。我一直也没有进行太多高端的操作。可以肯定的是,如果我要做的话,实现同样的功能,我可以通过这两种途径分别得出方案。

回到一开始那本书,前面部分说的是一些批处理,后面部分说的是用Python作图,其实那个时候我并不明白为什么要用Python作图,因为Excel本来就可以作图,而且就控制来说Excel是可视化的,Python全部都得写上去,所以后面作图的部分我看得很潦草,直接快速掠过,只是知道能干这种事而已。

直到这一次数据分析需要做箱形图。Excel可以做箱形图,但对箱形图的控制不如人意,我想到了Python,也想到了R语言。我知道这两个东西通过某些包就可以轻松做出我想得到或者想不到的图。

R语言被我放下了太远,以至于我已经基本不知道该如何操作了,所以我选择先用Python探索一下作图。

2025-11
8

Excel里的箱形图

By xrspook @ 8:17:33 归类于: 烂日记

不知道哪一次Microsoft 365升级以后,Excel的图表里面就多了一个箱形图。在做一些我一开始没什么头绪的图之前,我都会选择数据,然后让Excel给我推荐一下图表,我从来没有试过被推荐箱形图。我只是知道那个东西的存在。同时我也没有在Excel相关的公众号的推送里面看到过箱形图的使用方式。或许他们是有推送的,只是我越来越懒惰,忽略掉了,但我之所以会忽略掉另外一个很重要的原因,可能是他们有推送,但是推送的频率不高,而那些不高的频率又刚刚被我因为这样那样的错过了,所以我一直没看到。这个忽略掉其实也不完全怪我,微信也是一个很重要的因素,因为现在的公众号的信息不会全部展开,除了第1篇会展示以外,余下的那些就只会说还有一篇还有两篇,不手动点开根本看不到,所以万一箱形图的推送出现在那个地方,当然就很容易被我忽略掉。不知道为什么微信要做这样的设置,其实手指多划两下没什么问题,又或者我觉得微信可以让用户自行选择到底要不要展开。更精细化的管理可能是对这个公众号不折叠,对那个公众号只显示首篇。这种分类方讨论的方式就像是正常的群显示聊天条数和那些忽略的群只给一个红点。

只要你有一组数据,你就可以做出箱形图,因为它是根据最小值两个四分位数中位数以及最大值组成的。简单来说这个可以把一组数据浓缩成万物皆有的几个数,然后你就可以把它们放在一起作图或者分析,我感觉无论是箱形图还是小提琴图,都是一个可视化分析数据的工具,能更直观地看到数据的情况。跟箱形图相比,小提琴图还多了一个数据密度的展示。如果离散性很好的话,小提琴图显然更妙,但如果本来就不怎么符合正态分布,也就没必要做小提琴图了。

以前的Excel不能直接做出箱形图,大家只能做堆积柱状图,然后进行加工,得出类似箱形图的东西,但据说从Office 2021开始就有了这个功能,但是有些人说他们的版本里有,但有些人说他们的版本里没有,我猜这会不会跟家庭版和专业版的区别有关,又或者有些人进行了更新,但有些人选择永不更新?

虽然现在的Microsoft 365里面可以做箱形图,制图方式也很简单,但是跟其他图表比起来,箱形图的各种设置感觉都是怪怪的。无论是字体、字体大小、标题、坐标轴等等对其它图来说很好控制很容易实现的功能搞箱形图的时候都很奇怪感觉很别扭。其中一个让无数通过Excel直接做这个图的人感到很无奈的是理论上做箱形图的时候,第一行是标题,余下的那些行是数据,数据可以是同样大小的也可以是不同大小的。按照大家的理解,数据是通过箱体现的,第一行的标题应该就是X轴上的标签,但实际上无论你怎么操作。现在直接出来的箱形图那里的X轴标签都是1。搜索一下就发现很多人都遇到这个问题,貌似我只在一个地方看到了可能的解决方案,首先你把那个1去掉,然后插入图例,选择在底部展示。这样的话,上面的那些箱算是终于有了标签,虽然那个标签估计不会跟那个箱体完全对位。这个思路太诡异了,设计Excel箱形图的人怎么会想出这么离谱的事情。为什么在Excel里这个图可以直接生成,但实际上效果却这么的糟糕呢?同样让我无法理解的就是我无法控制几个箱之间的距离或者是箱体的宽度。高度是由数据本身决定的,但箱体的宽度,理论上用户可以自行设定。但貌似就没有一个直观的方式让你好好操控。那种感觉跟浪潮开发的软件有异曲同工之妙,功能有了,但好不好用我不管。

箱形图是数据分析里一个非常经典的可视化表达方式。Excel不能很好满足我的要求,我只能用其它方式实现。

© 2004 - 2026 我的天 | Theme by xrspook | Power by WordPress