news 2026/10/24 14:04:25

用 Python 对比两份装修报价单,自动标出价格差异项(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用 Python 对比两份装修报价单,自动标出价格差异项(附完整代码)

装修报价单动辄几十上百行,施工方版本和自留版本一对比,最容易在「单价」「工程量」「合价」上动手脚。手动逐行核对又慢又容易漏。本文用openpyxl写一个本地脚本,按「项目名称 + 规格」匹配两份清单,自动算出单价差、合价差,并把异常行高亮导出成新表,全程零联网、零依赖服务端。

一、思路

两份清单结构通常一致:序号 / 项目编码 / 项目名称 / 项目特征 / 单位 / 工程量 / 综合单价 / 合价 … 我们拿「项目名称 + 单位」做去重键(项目特征可能表述不一致,先用名称兜底),逐行对齐,对比单价和合价。

二、代码

importopenpyxlfromopenpyxl.stylesimportFont,PatternFill KEY_COLS={"name":3,"unit":5,"price":7,"total":8}# 列号按需调整RED=PatternFill("solid",fgColor="FFC7CE")defload(path):wb=openpyxl.load_workbook(path,data_only=True)ws=wb.active rows={}forrinrange(2,ws.max_row+1):name=(ws.cell(r,KEY_COLS["name"]).valueor"").strip()unit=(ws.cell(r,KEY_COLS["unit"]).valueor"").strip()ifnotname:continuekey=(name,unit)price=ws.cell(r,KEY_COLS["price"]).valueor0total=ws.cell(r,KEY_COLS["total"]).valueor0rows[key]=(r,float(price),float(total))returnwb,ws,rowsdefdiff(a_path,b_path,out="差异报告.xlsx"):wb_a,ws_a,ra=load(a_path)wb_b,ws_b,rb=load(b_path)out_wb=openpyxl.Workbook()ws=out_wb.active ws.append(["项目名称","单位","A单价","B单价","单价差","A合价","B合价","合价差"])all_keys=list(dict.fromkeys(list(ra)+list(rb)))forkinall_keys:a=ra.get(k,(None,0,0))b=rb.get(k,(None,0,0))dp=round(b[1]-a[1],2)dt=round(b[2]-a[2],2)ifdpordt:# 只留有差异的行ws.append([k[0],k[1],a[1],b[1],dp,a[2],b[2],dt])ifabs(dp)>0orabs(dt)>0:forcinrange(1,9):ws.cell(ws.max_row,c).fill=RED out_wb.save(out)print(f"已导出差异报告:{out},共{ws.max_row-1}行")if__name__=="__main__":diff("报价单_施工方.xlsx","报价单_自留.xlsx")

三、几个实战坑

  1. 合价可能是公式:用data_only=True读缓存值;若文件从没在 Excel 里打开过,data_only会拿到None,先手动打开保存一次。
  2. 名称不完全一致:施工方常把「地砖铺贴 800*800」写成「地砖 800×800」,建议先做一层归一化(去空格、统一x/×、*),再比对,否则匹配不到。
  3. 工程量变动要单独标:单价没变但工程量被调高,合价照样涨。脚本里dt(合价差)就是抓这种「量价齐动」的。
  4. 精度:单价保留 2 位,避免浮点误差把 0.00 判成差异,可用abs(dp) > 0.005做阈值过滤。

四、延伸

把报告再喂给一个「差异分级」函数:单价差>10% 标红、5%~10% 标黄,就能一眼看出哪些是「真坑」、哪些是合理波动。整套逻辑也能套到工程量清单、采购单的版本对比上,核心是同一套「键匹配 + 字段 diff + 高亮导出」。

(maixuzi.cn 的在线报价系统也是基于类似的逐项核对思路做的,有兴趣可以去 resources 页看看。)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 13:20:43

OpenClaw 让 AI 直接操控电脑,TaoToken 统一 Key 接入值不值这个风险?

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/23 9:42:21

使用VScode插件连接MySQL:把数据库连接配置改到TaoToken统一管理

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/16 11:26:58

Superpowers实战:为Claude打造可复用的技能扩展系统

最近在 AI 工具圈里,superpowers 这个词出现的频率高得吓人。它不是某个软件的名字,也不是一套开源库,而是一个专门给 Claude.ai 做“技能扩展”的项目,来自老牌 Perl 社区开发者 Jesse Vincent(网名 obra)…

作者头像 李华