客户要一个「能自动整理 Excel 的小工具」,我做了 5 天,他用了 3 年
那个 exe 在客户电脑上躺了三年,上周他给我打电话,我以为又出问题了,结果他开口是:「小周,你那个工具能不能再加一个导出按钮,我们新来的会计想自己再核一遍。」
我愣了一下。三年,一个外包小工具,客户主动打来的第一个电话不是报障,是加功能。这在外包行业里算稀罕事,所以我今天把这个案子翻出来讲讲。
需求是这么来的
客户是杭州一家做汽配贸易的公司,连会计带老板一共七八个人。他们进了一套进销存系统,系统本身没毛病,但每天导出的 Excel 对账表是「平铺」的——同一个供应商的进货记录散在十几行里,日期格式还不统一,有的行带「备注」,有的不带。会计每天下午要花一个多小时手工做三件事:按供应商归并、补齐格式、在每组后面加一行小计。
老板的原话是:「我不要求好看,也不要求快,你只要能把我会计每天这一个半小时的活替掉,这钱就花得值。」
报价 8000,工期谈的是一周内。最后我做了 5 天交付。
真正花时间的不是读 Excel
技术上这个东西不复杂:.NET + WinForms 界面,EPPlus 读表(客户电脑上没装 Office 的完整版,所以一开始就没打算走 COM Interop),按供应商编码分组、算小计、按模板写回一个新的 xlsx。核心逻辑两天就写完了。
真正花时间的是三件脏活。
第一件,表头不认。 客户说表头是固定的,我信了。第二天他发来新导出的文件,最后多了一列「业务员备注」——供应商那边的系统升级了。从那以后我不再按列名硬编码,改成了「模糊匹配 + 规则文件」:表头映射关系放在一个 JSON 里,客户可以自己加一条「'业务员备注' → '备注'」。识别不出的列不报错,而是整列搬进一个叫「待人工确认」的区域,界面上一目了然。
第二件,日期被 Excel 自己改了。 导出表里的「2026-09-03」有些单元格读出来是字符串,有些是数字序列号 46203——Excel 会根据单元格格式自动转换。刚开始我按字符串解析,遇到数字就崩。后来统一处理:数值列按 OADate 转,文本列按三种常见格式逐个试,都试不出来就原样保留并标黄。
第三件,文件占用。 会计有个习惯,一边开着整理结果一边让我重新跑。第一版隔三差五弹 IOException: 文件正由另一进程使用。我在保存前加了检测:目标文件被锁就自动另存成「文件名_新.xlsx」,并在界面上提示原文件被哪个进程占用,让她先关掉。就这么一个小兜底,售后量少了一大半。
早期版本我其实试过 Microsoft.Office.Interop.Excel,因为客户想要「跟 Excel 完全一样的打印效果」。结果测试第三天,任务管理器里挂了五个杀不掉的 Excel.exe 进程,把导出的文件全锁死了——COM 对象没一个个释放干净。那次之后我把 Interop 彻底扔了,打印效果用 NPOI 抄单元格格式硬还原,客户看了说「差不多就行」。
为什么它能用三年
复盘下来,这个工具能活三年,靠的不是代码写得多漂亮,是三个决定:
- 规则外置。表头会变、供应商会加,规则放在客户自己能改的 JSON 里,需求的小变化不用找我。
- 不崩。识别不了的数据进「待人工」,而不是抛异常给一个不会看日志的会计。
- 输出可核。每个小计旁边都保留了原始行数,客户随时能对回源表。
后来这个客户把他们的同行介绍给了我,单子比这个工具大四倍。小活做得靠谱,比大活做得勉强更来客户。
一点建议
如果你也是甲方,想找个开发做个 Excel 处理、报表归并之类的小工具,报价单上别只看总价,多问一句:「如果我下个月表头变了,要不要重新付钱?」规则可配置的工具和写死的工具,用起来的差别就是三年和三个月。
(有定制软件需求(.NET 桌面端 / 小程序 / APP),直接联系:微信/手机 17788568694)
手机 17788568694 | 微信 17788568694(与手机同号)| QQ 76656825

浙公网安备 33010602011771号