_bid_check_perf.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. # -*- coding: utf-8 -*-
  2. """自检:报价、业绩表、插入的图片数量与剩余占位项。"""
  3. import io
  4. import os
  5. import re
  6. import sys
  7. from docx import Document
  8. sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
  9. BID = r"C:\Users\skygu\OneDrive\Projects\AIDOP\项目\项目招投标"
  10. NAME = "响应文件(完整版)-2026年河南产互联制造业数据智能运营平台研发项目.docx"
  11. BLIP = ("{http://schemas.openxmlformats.org/drawingml/2006/main}blip")
  12. def check(path, label):
  13. d = Document(path)
  14. print(f"\n{'=' * 74}\n{label} {os.path.getsize(path) / 1024 / 1024:.1f}MB")
  15. print(f"段落 {len(d.paragraphs)} 表格 {len(d.tables)}")
  16. imgs = sum(len(p._p.findall(f".//{BLIP}")) for p in d.paragraphs)
  17. for t in d.tables:
  18. for row in t.rows:
  19. for c in row.cells:
  20. for p in c.paragraphs:
  21. imgs += len(p._p.findall(f".//{BLIP}"))
  22. print(f"图片 {imgs} 张")
  23. print("\n-- 报价 --")
  24. for i, p in enumerate(d.paragraphs):
  25. if re.search(r"5[68]6?,?000|伍拾陆万|伍拾捌万", p.text):
  26. m = re.findall(r"(?:伍拾[陆捌]万\S{0,6}|5[68]\d,000\.00)", p.text)
  27. print(f" 段P{i}: {' '.join(m)}")
  28. c = d.tables[0].rows[3].cells[1]
  29. print(f" 响应函附录: {c.text.replace(chr(10), ' / ')}")
  30. print("\n-- 业绩表 --")
  31. for i in range(2, 7):
  32. t = d.tables[i]
  33. print(f" [业绩{i - 1}]")
  34. for row in t.rows:
  35. k = row.cells[0].text.strip()
  36. v = row.cells[1].text.strip()
  37. flag = " ← 未填!" if "【待" in v else ""
  38. print(f" {k}:{v[:76]}{flag}")
  39. print("\n-- 剩余占位项 --")
  40. left = [(i, p.text.strip()) for i, p in enumerate(d.paragraphs)
  41. if "【待补" in p.text or "【待填" in p.text]
  42. for i, t in left:
  43. print(f" P{i}: {t[:96]}")
  44. for ti, t in enumerate(d.tables):
  45. for ri, row in enumerate(t.rows):
  46. for ci, cc in enumerate(row.cells):
  47. if "【待补" in cc.text or "【待填" in cc.text:
  48. print(f" 表{ti} 行{ri} 列{ci}: {cc.text.strip()[:80]}")
  49. print(f" 共 {len(left)} 处段落占位")
  50. check(os.path.join(BID, NAME), "响应文件(已改)")
  51. stale = os.path.join(BID, NAME[:-5] + "(已签章).docx")
  52. if os.path.exists(stale):
  53. d = Document(stale)
  54. shapes = len(d.element.body.findall(
  55. ".//{http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing}anchor"))
  56. print(f"\n{'=' * 74}\n遗留文件「(已签章)」:浮动图形 {shapes} 个,"
  57. f"{os.path.getsize(stale) / 1024 / 1024:.1f}MB")