我用华为云码道 CodeArts 做了个报表合并工具
我用华为云码道 CodeArts 做了个报表合并工具一键开通华为云码道 CodeArts 代码智能体https://developer.huaweicloud.com/codeartsco.html?sourcedmzntgwatomgit1sourceaddmzntgwatomgithd在线体验https://excel-merge-tool-88500.app.workbuddy.host/开源仓库AtomGithttps://atomgit.com/qq_40202349/excel-merge-tool同一个订单一份报表写 5800另一份写 5850。月底汇总时这两行该保留哪一行删掉其中一行差额的线索就没了全部留着再求和又可能把同一笔订单算两遍。连把数据放到同一列都未必顺利。一份叫“金额”另一份叫“销售额”系统导出的 CSV 用的是amt。有的表还多了一列备注按位置复制粘贴很容易放错列。这次我用华为云码道 CodeArts 做了一个报表合并工具想先把这些麻烦摆到页面上确认列名怎么对应找出冲突和重复再带着来源文件、行号回原表核对。文件的解析、合并和导出都在浏览器本地完成。先看做出来的效果。从上传五份表到拿到合并报告整个操作过程不到 20 秒图1从上传报表到导出报告的操作演示。用五份分公司销售报表做测试四份 Excel 加一份 CSV一共 21 行。里面埋了几个坑各表列名不一样、一笔订单有两个金额、一条完全重复的记录还有几个空着的日期。合并后勾选“只看异常行”那笔对不上的订单就自己冒出来了图2筛选出合并结果中的异常记录。一、把五份表里的麻烦写进需求先在 AtomGit 网页端通过 CodeArts Agent 创建excel-merge-tool仓库再把需求交给它。技术栈选了 Vue 3、TypeScript 和 Vite表格解析用 SheetJS核心逻辑用 Vitest 测试。“把几份表合成一份”还不够具体。列名不同怎么办同一个订单出现两次能不能直接删这些都要提前交代。需求里要求先给出字段映射建议让使用者选主键和去重策略发生金额冲突时保留记录导出时另附一张合并报告写清输入、输出和跳过的行。页面按上传、字段映射、合并预览、导出分成四步。解析和合并放进 Web Worker核心函数单独放在core/不引用 Vue 或 DOM。这样后面发现一条数据不对就能直接给函数喂一个小样例不用每次都从页面点起。图3码道检查主键、空值等边界情况。执行中有个小细节它修正了报告测试里的行号断言。数据下标是 1加上表头对应的却是 Excel 第 3 行。这个差别会影响使用者回原表找记录不能只让程序内部的下标对得上。图4码道修正行号断言后94 项测试通过。到这里四步界面、核心代码和测试都有了。接下来要检查的是这些代码遇到实际文件以后会怎样。二、日期少了一天把问题发回码道初版检查中发现了日期偏移预期是2026-08-01结果却成了2026-07-31。当时的实现把Date用toISOString().slice(0, 10)转成日期字符串。toISOString()输出 UTC 时间东八区的本地午夜转过去会落在前一天。这次反馈写了出错位置、运行时区和预期结果还要求补一个回归用例让本地午夜的日期走完 Excel 写入、读取、解析再核对输出。图5向码道反馈日期少一天的问题。截图里的复现表达式写得不准确new Date(2026-08-01)按 UTC 解析构造本地午夜应使用new Date(2026, 7, 1)月份从 0 开始。历史截图保留原样这里更正。码道随后把格式化改成读取本地年月日补了三个回归用例并给出 97 项测试通过的修复报告。图6码道给出日期修复方案和 97 项测试通过的报告。从 94 项到 97 项新增的三项都有具体针对的问题。不过这还是码道环境里的交付结果拿到本地后需要再跑一次。三、97 项测试拿到本地仍有两项失败后续独立复核在这台东八区 Windows 电脑上运行结果是 95 项通过、2 项失败。失败的仍然是日期本地午夜走完 Excel 写入、读取和解析还是少了一天。继续往前查偏差发生在日期格式化之前。当时使用的 SheetJS 0.18.5在这条写入再读回的链路中读到的本地时间已经落在前一天午夜前。只改最后的字符串处理修不到这一层。核对 SheetJS 官方安装说明 后复核阶段把依赖固定到官方 CDN 提供的 0.20.3。读取方式也做了调整保留 Excel 的日期序列值和格式直接输出日历日期减少经过 JavaScript 时区转换的环节。下面是src/core/parse.ts中的关键设置和日期转换片段省略了遍历、日期类型判断及错误处理workbookXLSX.read(data,{type:array,cellDates:false,cellNF:true,raw:true,})cell.vXLSX.SSF.format(yyyy-mm-dd,cell.v,{date1904:!!workbook.Workbook?.WBProps?.date1904,})cell.tsdeletecell.wdeletecell.zdate1904也不能漏。工作簿使用的日期系统不同同一个序列值对应的日历日期就不同。这轮验证既保留了写入、读回的用例也构造了固定序列值覆盖 1900、1904 两种日期系统。相关解析和数据保全用例分别在 UTC、洛杉矶、UTC14 下运行检查换一个时区后日期是否仍然相同。日期问题到这里才算经过本地复核。后面的页面和数据处理修正同样属于独立复核阶段并非码道那份 97 项测试报告中的内容。四、再从上传走到预览检查每一步的数据浏览器走查先卡在了上传入口。选择文件后列表没有出现文件输入框的change事件又调用了打开选择器的方法没有接上读取逻辑。页面还缺少进入字段映射的按钮。核心测试不加载 Vue 页面这两处问题要实际点击才能发现。修好入口才能继续核对字段。华北表用“订单编号”“产品名称”“销量”“销售额”目标表则用统一列名。当前版本通过本地同义词表给建议例如把“销售额”和amt对应到“金额”不在运行时调用大模型建议不合适可以在下拉框里改。图7将各份报表的列名映射到统一字段。这里还补了一个拦截如果同一份表同时有“金额”和“销售额”不能让两列都写进同一个目标列否则后一次赋值会覆盖前面的内容。遇到重复映射现在会提示文件名等使用者改好再合并。到了合并步骤又遇到 Vue 响应式对象不能直接传入 Worker 的问题。postMessage使用结构化克隆算法无法直接克隆 Vue Proxy。当前合并协议只有数组、字符串和普通对象因此发送前转成普通 JSON 数据上传文件仍用ArrayBuffer通过 transfer list 传递。如果以后扩展协议来传日期对象或其他类型这部分也要跟着调整。预览能显示以后还要看标签有没有漏。选择“全部保留”时两条重复记录都应该带标签也都能被“只看异常行”筛出来。对于金额为 100、200、200 的三条冲突记录也不能只标出一个 200漏掉另一条。去重依据同样需要检查。原实现把复合主键中的空值过滤掉再用|拼接可能把不同记录拼成同一个键。修正后缺少部分主键就提示空值不自动去重完整的复合主键用结构化形式编码exportfunctioncreateRowKey(parts:string[]):string{if(parts.length0||parts.some(vv))returnreturnparts.length1?parts[0]:JSON.stringify(parts)}最后还要保住单元格本来的含义。CSV 编号00123按文本读取备注里的“运费50”保持原文金额比较时可以识别货币符号和千分位导出时再把金额、数量、单价写成数值方便继续求和。五、下载 Excel再把结果读回来修正后的版本在 Edge 中跑了一遍生产构建从选择文件、确认映射一直走到下载。导出完成后又重新读取真正下载下来的 Excel核对“合并结果”和“合并报告”。五份样例输入 21 行默认“保留一条”输出 20 行。少掉的是一条重复记录开头那笔 5800、5850 的冲突仍然保留报告能指出被去重的是华北表第 4 行。图8合并报告列出处理结果和去重明细。检查项本次结果输入文件4 份.xlsx、1 份.csv共 21 行选择“保留一条”输出 20 行跳过 1 行重复记录选择“全部保留”输出 21 行重复的两行均有标签金额冲突保留 5800、5850标记 2 个冲突单元格重复与空值1 组重复3 个空单元格含 1 个日期、2 个备注导出内容结果、报告两张工作表金额列为数值最终本地测试7 个测试文件112 项通过核心实现覆盖率行 98.88%分支 90.63%这里的冲突按单元格计重复按组计备注空值目前也会提示。覆盖率只统计解析、同义词、映射、校验、合并、导出六个实现文件不包含 Vue 页面。浏览器走查还覆盖了拖拽、清空重选、错误文件提示和 390px 小屏。页面加载并解析完文件后断网仍可导出本轮观察到的 HTTP 请求都是本地页面资源没有发现报表内容外发。这个结论限于本次测试环境。当前工具适合表头清楚的明细表每个文件只处理第一个工作表第一条非空行作为表头。它不会完整保留合并单元格、多级标题、复杂公式和原样式日期只输出到天。超大文件和其他浏览器还没做专项测试金额冲突最终采用哪条记录也仍需人工核对。六、实际使用感受码道这次帮忙最多的是把需求变成了一套可以继续检查的工程。四步界面、核心函数和首轮测试一起交付日期反馈后又有具体的修改和回归用例省去了从空白项目搭起的工作。后续花时间的地方往往比最初的需求细重复的两行是不是都能筛出来主键缺一部分会不会误删编号导出后还剩几个零。这些问题靠现成样例和下载后的文件更容易说清楚。94、97、112 也分别属于首轮交付、码道日期修复、后续本地复核不能混成一次验收结果。如果再做同类工具我会把这五份带问题的表随需求一起交出去连预期保留哪些行、报告写什么都说明白。交付后再用同一批文件核对反馈也更具体。你合并报表时最常遇到的是列名不一致还是同一笔业务在不同文件里对不上也欢迎在评论里说说其他难处理的表格结构。想试试当前版本可以直接打开在线体验版也可以拉下代码在本地启动gitclone https://atomgit.com/qq_40202349/excel-merge-tool.gitcdexcel-merge-toolnpmcinpmrun dev导入fixtures/review/里的五份样例在线版可以从这个下载目录逐个下载保留默认“订单号”主键和“保留一条”策略。合并后应有 20 行勾选“只看异常行”找到ORD-2026-0912看看那两个不同金额的来源。再点“上一步”把策略改成“全部保留”重新合并。结果会变成 21 行重复记录也会留下并带有标签。最后导出 Excel打开“合并报告”对照这两次处理的差别。测试和构建命令如下npmtestnpmtest----coveragenpmrun build的来源。再点“上一步”把策略改成“全部保留”重新合并。结果会变成 21 行重复记录也会留下并带有标签。最后导出 Excel打开“合并报告”对照这两次处理的差别。测试和构建命令如下npmtestnpmtest----coveragenpmrun build
上一篇/下一篇内容由系统自动关联
返回资讯列表 →