_bid_update_toc.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. # -*- coding: utf-8 -*-
  2. """插入业绩材料后页码整体后移,用 Word 更新目录域并回存。"""
  3. import io
  4. import os
  5. import sys
  6. import time
  7. sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding="utf-8")
  8. BID = r"C:\Users\skygu\OneDrive\Projects\AIDOP\项目\项目招投标"
  9. RESP = os.path.join(
  10. BID, "响应文件(完整版)-2026年河南产互联制造业数据智能运营平台研发项目.docx")
  11. WD_FORMAT_DOCX = 16
  12. WD_PAGE = 3
  13. def main():
  14. import win32com.client as win32
  15. word = None
  16. for i in range(4):
  17. try:
  18. word = win32.gencache.EnsureDispatch("Word.Application")
  19. word.Visible = False
  20. word.DisplayAlerts = 0
  21. break
  22. except Exception as e:
  23. print(f" 启动 Word 重试 {i + 1}/4:{e}")
  24. time.sleep(4)
  25. if word is None:
  26. raise SystemExit("无法启动 Word")
  27. t0 = time.time()
  28. doc = word.Documents.Open(RESP)
  29. try:
  30. print(f"打开用时 {time.time() - t0:.0f}s")
  31. doc.Fields.Update()
  32. for i in range(1, doc.TablesOfContents.Count + 1):
  33. doc.TablesOfContents(i).Update()
  34. doc.Repaginate()
  35. pages = doc.ComputeStatistics(2) # wdStatisticPages
  36. print(f"更新完成,总页数 {pages}")
  37. print("\n目录前 40 行:")
  38. toc = doc.TablesOfContents(1).Range.Text if doc.TablesOfContents.Count else ""
  39. for l in [x.strip() for x in toc.split("\r") if x.strip()][:40]:
  40. print(f" {l[:72]}")
  41. doc.Save()
  42. finally:
  43. doc.Close(False)
  44. word.Quit()
  45. print(f"\n总用时 {time.time() - t0:.0f}s")
  46. if __name__ == "__main__":
  47. main()