bid-doc
- Repo stars 4
- Author updated Live
- Author repo skills
- Domain
- Documentation
- Compatible agents
-
- Claude Code
- Cursor
- Cline
- Codex
- Windsurf
- Gemini CLI
- +20
- Trust score
- 88 / 100 · community maintained
- Author / version / license
- @atxinsky · no license declared
- Token usage
- Lean
- Setup complexity
- Guided setup
- External API key
- Not required
- Operating systems
- Windows
- Runtime requirements
- Node.js · Python
- Permissions
-
- Read-only
- Write / modify
- Network behavior
- Local-only
- Install commands
- 26 variants
Profile is derived at build time from SKILL.md and install vectors. Subject to drift from author intent.
Heads up: 未限定 allowed-tools,默认拥有全部工具权限。
---
name: bid-doc
description: 根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。 如果是 .doc 文件,先用 win32com 转换为 .docx: import…
category: documentation
runtime: Node.js / Python
---
# bid-doc output preview
## PART A: Task fit
- Use case: 根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。 如果是 .doc 文件,先用 win32com 转换为 .docx: import win32com.client, pythoncom pythoncom.CoInitialize() word = win32com.client.Dispatch("Word.Application") runs entirely locally; runs on Node.js. Works with Claude Code, Cursor, Cline and 23 more..
- Inputs: target material, constraints, expected output, and acceptance criteria.
- Evidence boundary: follow “输入要求 / 工作流程 / Step 1: 解析技术规范” and do not present inference as author intent.
## PART B: Execution result
- **01** The card summarizes the use case; runtime output centers on “根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。 如果是 .doc 文件,先用 win32com 转换为 .docx: import win32com.client, pythoncom pythoncom.CoInitialize() word = win32com.client.Dispatch("Word.Application") runs entirely locally; runs on Node.js. Works with Claude Code, Cursor, Cline and 23 more.”.
- **02** When the source has headings, the agent prioritizes “输入要求 / 工作流程 / Step 1: 解析技术规范” so the result follows the author’s structure.
- **03** Typical output includes task judgment, concrete steps, required commands or file edits, validation, and follow-up options.
- **04** Risk context follows the fingerprint: read files, write/modify files; mostly runs locally; usually needs no extra API key.
## Running Rules
- read files, write/modify files; mostly runs locally; usually needs no extra API key.
- Validate with a small sample before expanding scope.
- Return the result, validation criteria, and next iteration options. The source does not require a stable slash command. After installation, invoke the skill by name and describe the task.
Name target files or source material, expected output, forbidden changes, and whether network or shell access is allowed. Permission fingerprint: read files, write/modify files.
Start with a small task and check whether the result follows “输入要求 / 工作流程 / Step 1: 解析技术规范”. Inspect diffs, logs, previews, or tests before expanding scope.
Confirm the final output includes a concrete result, evidence, and next action. If it stays generic, tighten inputs, boundaries, and acceptance criteria.
---
name: bid-doc
description: 根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。 如果是 .doc 文件,先用 win32com 转换为 .docx: import…
category: documentation
source: atxinsky/skills
---
# bid-doc
## When to use
- 根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。 如果是 .doc 文件,先用 win32com 转换为 .docx: import win32com.client, pytho…
- Use it when the task has clear inputs, repeatable steps, and validation criteria.
## What to provide
- Target material, scope, expected result, and forbidden changes.
- Whether network, commands, file writes, or external services are allowed.
## Execution rules
- Organize steps around “输入要求 / 工作流程 / Step 1: 解析技术规范” and keep inference separate from source facts.
- read files, write/modify files; mostly runs locally; usually needs no extra API key.
- Validate with a small sample before expanding the task.
## Output requirements
- Return the deliverable, key evidence, validation method, and next action.
- Mark missing information as unknown; do not invent commands, platforms, or dependencies. The author source anchors workflow facts; repository files anchor sources and commands; Fluxly only adds fit, limitations, and quality judgment.
skill "bid-doc" {
input -> user goal + target files + boundaries + acceptance criteria
context -> 输入要求 / 工作流程 / Step 1: 解析技术规范
rules -> SKILL.md triggers / order / output contract
runtime -> Node.js / Python | read files, write/modify files | mostly runs locally
guardrails -> usually needs no extra API key + small-sample validation + diff/log review
output -> copyable result + checklist + next iteration
} 投标服务方案文档生成器
根据采购技术规范和评分标准,自动生成完整的投标服务方案文档(Word + 信息图)。适用于培训类项目投标。
输入要求
用户需提供:
- 技术规范文件(.doc 或 .docx)— 采购技术规范
- 评分标准(图片或文字)— 评分项和分值(可选,默认按服务方案+工作进度评分)
- 参考方案(.docx)— 可选,作为格式和内容参考
- 真实师资/课表(.docx 或图片)— 可选,甲方或合作方提供的真实讲师和课程安排
工作流程
Step 1: 解析技术规范
如果是 .doc 文件,先用 win32com 转换为 .docx:
import win32com.client, pythoncom
pythoncom.CoInitialize()
word = win32com.client.Dispatch("Word.Application")
word.Visible = False
doc = word.Documents.Open(r"原始文件路径.doc")
doc.SaveAs2(r"转换后路径.docx", 16)
doc.Close()
del doc, word
pythoncom.CoUninitialize()
然后用 python-docx 读取所有段落和表格,提取:
- 项目名称、甲方单位全称
- 培训对象、人数、期数/批次数、天数
- 培训内容覆盖(从表格的"培训内容覆盖"行提取,这是最权威的内容列表)
- 培训方式、考核方式
- 师资要求(职称等级)
- 满意率要求
- 交付物要求
- 保密要求
- 后续服务要求
关键:项目概况中的"培训目标"和表格中的"培训内容覆盖"可能不完全一致,以表格中的"培训内容覆盖"为准设计课程。
数据一致性清单(生成后必须交叉验证):
- 人数 × 批次数 = 总人数(如"400人分4批,每批约100人"必须写明)
- 天数口径统一:如有"准备日/报到日",必须在首次提到天数时加括号说明(如"5天(另含1天报到编班)")
- 课表中的讲师名 = 师资简介中的讲师名(一个都不能多、不能少)
- 讲师头衔/单位在全文所有出现处必须一致(课表简写可以,但不能写错)
Step 2: 解析评分标准
如果提供了评分标准图片,用 Read 工具查看图片内容,提取:
- 服务方案评分维度(先进性、创新性、可操作性、技术性、经济性、风险等)
- 工作进度及保证措施评分维度
- 各档次分值区间
评分标准 → 文档章节映射(必须一一对应):
| 评分项 | 分值 | 对应章节 | 得分策略 |
|---|---|---|---|
| 文件总体评价 | 6-10 | 全文结构 | 规范性、完整性、逻辑性 |
| 项目团队 | 12-20 | 2.5 人员配置 | 需公司提供真实资质 |
| 业绩情况 | 12-20 | 商务标 | 方案中不写,商务标单独提供 |
| 服务方案 | 18-30 | 二、服务方案 | 核心得分项,必须深度 + 量化 |
| 工作进度 | 8-13 | 三、工作进度 | 甘特图 + 四维保障 |
| 专利数量 | 0-2 | 商务标 | 如有专利单独提供 |
| 绩效评价 | 1-5 | — | 取决于历史供应商评价 |
Step 3: 生成 Word 文档
使用 docx-js(Node.js)生成 .docx 文件。运行时需要 NODE_PATH="$(npm root -g)"。
文档结构(严格按评分标准覆盖):
封面(项目名称 + 应答人 + 日期)
目录
一、对项目的理解
1.1 对[甲方单位]的理解
1.2 对采购项目的理解
- 项目定位与目标
- 项目规模与实施要求
- 服务敏感点分析
1.3 项目重点与难点分析
二、服务方案(对应评分项"服务方案")
2.1 项目实施思路(五阶段闭环)
2.2 培训课程体系设计
- 课程模块总览(严格按技术规范"培训内容覆盖")
- N天课程安排表
- 课程设计亮点
2.3 培训方式与教学方法(6种教学法)
2.4 师资配备方案
2.5 实施组织形式与人员配置
- 项目组织机构
- 人员配置表(含人员清单和简介说明)
2.6 培训效果评估体系(用技术规范中的考核方式术语)
2.7 质量保障措施(三维品控)
2.8 设备设施配置方案
2.9 风险管理与应对(6类风险+应对表)
★ 项目管理措施(深化服务过程细节,见下方专项说明)
★ 质量控制节点(训前+训中+训后闭环)
三、工作进度及保证措施(对应评分项"工作进度及保证措施")
3.1 项目进度计划(8阶段进度表 + 每期日程)
3.2 进度保证措施(四维保障)
四、项目交付成果(技术规范要求的所有交付物)
五、售后服务承诺(含明确期限、范围、内容)
★ 项目管理措施(关键得分章节)
这是拉开"良"与"优"差距的核心章节。甲方要看到的是操作细节和量化指标,不是空话。
必须包含的维度(4-5个子节,每个都要有量化):
1) 团队构建与职责分工
- 人员选拔标准量化(如"项目经理需5年以上培训管理经验")
- 岗前培训内容清单
- 考核机制(五维度考核 + 绩效挂钩)
2) 师资管理机制
- 三道准入关:资质审核 → 试讲评审 → 课件审核
- 动态监控:量化阈值(如"满意度低于90%立即约谈,低于85%启动替换")
- 课后教研:具体时间(如"每日课后15分钟教研简会")
3) 辅助人员管理(班主任/教务)
- 班主任日程:早间/午间/晚间分段职责
- 教务管理体系(如"五单管理":签到单、评估单、反馈单、日志单、交付单)
- 学员沟通机制(微信群、意见箱、24小时响应)
4) 后勤保障与风险管理
- 场地提前踏勘时间(如"提前3天")
- 设备故障响应时间(如"15分钟响应、30分钟解决")
- 应急响应时间(如"5分钟内启动")
5) 特色管理(按项目类型)
- 党建培训 → "红色现场教学全流程管理"(踩点→路线→安全→教学衔接)
- 党建培训 → "班主任全流程服务(党建特色)"(晨学诵读党章、心得辅导等)
- 技能培训 → 实操环节器材管理、分组演练轮转机制
★ 质量控制节点
训前(6-7个节点):
需求确认 → 方案评审 → 师资试讲 → 课件终审 → 场地踏勘 → 物料清点 → (红色教学点踩点)
训中(日循环):
晨会布置 → 课堂督导 → 午间反馈 → 课后教研 → 日报汇总
训后(闭环):
满意度统计 → 效果评估报告 → 改进建议 → 资料归档 → 跟踪回访
编码要点:
- 字体:SimHei 标题 + SimSun 正文
- 页面:A4(11906 x 16838 DXA)
- 页眉:项目名称
- 页脚:页码
- 表格:headerCell 用 D5E8F0 底色,边框 #999999
- 必须包含的表格:课程安排表、人员配置表、评估体系表、风险管理表、进度计划表
- 文中术语必须与技术规范保持一致(如"一级评估"而非"反应层评估")
Step 4: 生成信息图 HTML
创建一个包含所有信息图的 HTML 文件,风格要求:
- 配色:Navy(#0F172A) + Teal(#0e6b60/#1a8a7d) + Gold(#b8963e)
- 党建类项目可用:Red(#c41e3a) + Navy(#1e3a5f) + Gold(#b8963e)
- 图标:Font Awesome 6(不用emoji)
- 字体:Noto Sans SC
- 交互:cursor-pointer + hover 动效(200ms)
- 圆角:统一 12px/8px
需要的信息图(共14张):
- 项目定位目标(箭头网格 arrow-grid)
- 服务敏感点(六宫格 sens-grid)
- 重点vs难点(VS对比图)
- 五阶段闭环(流程图 flow-stages)
- 课程模块(彩色卡片 modules-grid)
- N天课程表(时间轴 timeline)— 必须包含讲师姓名
- 教学方法(圆环图标 methods-grid)
- 组织机构(层级图 org-chart)
- 评估体系(指标卡片 assess-row)
- 质量保障(三柱图 quality-row)
- 风险管理(卡片网格 risk-grid)
- 甘特图进度(gantt)
- 保障措施(渐变卡片 guarantee-grid)
- 交付成果(清单 deliver-grid)
每个信息图用唯一的 CSS class 命名,页面用 .page 容器包裹。
Step 5: 截取信息图
使用 Playwright 截图:
const { chromium } = require('playwright');
// 为每个信息图元素截取 PNG
// 选择器格式:'.page:nth-child(N) .class-name'
// 注意:需要 NODE_PATH="$(npm root -g)"
截图存放在 screenshots/ 目录。
Step 6: 插入图片到 Word
使用 python-docx 将截图插入对应段落后面:
from docx import Document
from docx.shared import Inches
from docx.enum.text import WD_ALIGN_PARAGRAPH
doc = Document('方案.docx')
# 找到目标段落 -> doc.add_paragraph() 创建新段 -> 添加图片 -> 移动到目标位置
# 关键:按段落索引倒序插入,避免索引偏移
图片插入位置映射(根据段落内容关键词定位):
- 01_project_goals -> "三大培训目标" bullets 之后
- 02_sensitivity -> 敏感点 bullets 之后
- 03_vs_diagram -> 项目难点末段之后
- 04_five_stages -> 实施思路首段之后
- 05_modules -> 课程模块 bullets 之后
- 06_timeline -> 课程表说明之后
- 07_methods -> 教学方法首段之后
- 08_org_chart -> 组织机构描述之后
- 09_assessment -> 评估体系表之后
- 10_quality -> 质量保障首段之后
- 11_risk -> 风险管理首段之后
- 12_gantt -> 进度计划表之后
- 13_guarantees -> 进度保证措施标题之后
- 14_deliverables -> 交付成果首段之后
更新已有图片的技巧(不需要重新插入):
# 直接替换图片 blob,保持位置和尺寸不变
for rel_id, rel in doc.part.rels.items():
if "image" in rel.reltype:
image_part = rel.target_part
with open(new_image_path, 'rb') as f:
image_part._blob = f.read()
Step 7: 质量审查(MANDATORY — 不可跳过)
生成完成后,必须执行以下审查,这是从"良"冲"优"的关键。
7.1 AI 去痕检查
以下表述禁止出现在最终文档中:
| 禁用表述 | 替换方案 |
|---|---|
| "我公司深刻理解" | 直接删除,陈述事实 |
| "贡献力量" | "圆满完成" |
| "以高度负责的态度和专业化的服务水准" | "以专业的服务水准" |
| "量身定制" | "针对XX实际设计" |
| "先进性、创新性和可操作性"三连 | "切实可行、有针对性" |
| "一对一访谈"(对大规模培训不现实) | "代表性座谈"、"分组访谈" |
| "确保...的XX性"万能句 | 具体说做什么 |
| "N大核心模块"(数字可能与实际不符) | "核心培训模块" |
检测脚本:
ai_phrases = [
'我公司深刻理解', '贡献力量', '量身定制',
'高度负责的态度', '先进性、创新性和可操作性',
'一对一访谈',
]
text = '\n'.join([p.text for p in doc.paragraphs])
for phrase in ai_phrases:
if phrase in text:
print(f'⚠️ AI套话残留: {phrase}')
7.2 数据一致性检查
# 必须验证的项目:
checks = {
'人数×批次': '检查总人数 = 每批人数 × 批次数',
'天数口径': '正式天数 vs 含报到日,首次提到必须加括号说明',
'师资姓名': '课表中每位讲师必须在师资简介中有对应条目',
'师资头衔': '同一讲师在全文所有出处的单位名/职称必须一致',
'课程覆盖': '技术规范要求的每项培训内容都必须出现在课表或正文中',
'满意率数字': '全文中出现的满意率目标必须一致(如95%)',
'交付物': '技术规范列出的每项交付物都必须在第四章出现',
}
7.3 师资交叉验证(血泪教训)
| 检查项 | 说明 | 典型错误 |
|---|---|---|
| 单位名称 | 必须精确到区/县级 | "成都市委党校" vs "成都市温江区委党校" |
| 专家标签 | 必须与本项目课程匹配 | 讲党建课的讲师标签写成"宏观经济专家" |
| 职称资质 | 必须满足技术规范要求 | 技术规范要求"中级及以上",讲师无明确职称 |
| 简写一致 | 课表简写不能写错 | "高培中心" vs "高级培训中心" |
7.4 技术规范全覆盖检查
技术规范"项目概况"和"培训内容覆盖"中提到的每一项内容,都必须在方案中有对应安排:
- 如果课表没有单独安排,必须说明融入哪个模块
- 如果是选修/补充内容,必须在正文中明确标注
# 提取技术规范中所有培训内容关键词,逐一在方案全文中搜索
for kw in spec_keywords:
if kw not in full_text:
print(f'❌ 技术规范要求但方案未覆盖: {kw}')
Step 8: 真实数据替换(如有)
如果甲方/合作方后续提供了真实师资和课表,执行替换:
- 课表替换:用 python-docx 定位课程安排表(通常是第一个表格),逐行替换
- 师资替换:定位师资简介段落(通常在"2.4 师资配备"下方),删除旧内容插入新内容
- 信息图同步:更新 HTML 中 timeline 区域的讲师姓名,重新截图
- 全文扫描:简化版日程描述、课程模块说明等处也要同步更新
替换后必须重新执行 Step 7 全部检查。
Step 9: 文档扩充(当字数不足时)
当客户反馈"内容太少"或字数未达目标(如2万字),使用以下方法论进行迭代扩充。
9.1 扩充原则
- 分轮迭代:每轮控制5-10处修改,避免一次性改太多导致关键词匹配错位
- 先分析后动手:每轮先统计当前字数,计算差额,选择扩充点
- 优先展开有深度空间的段落:项目理解、服务敏感点、重点难点、风险管理、售后服务
- 保持格式一致:新插入段落必须继承前一段落的字体、字号、缩进等格式
9.2 核心工具函数
import copy
from lxml import etree
from docx import Document
def expand_para(para, new_text):
"""替换段落文本,保留原有格式(字体、加粗等)"""
if not para.runs:
return
para.runs[0].text = new_text
for run in para.runs[1:]:
run.text = ''
def insert_para_after(ref_para, text):
"""在指定段落后插入新段落,继承格式"""
new_para = copy.deepcopy(ref_para._element)
ns = '{http://schemas.openxmlformats.org/wordprocessingml/2006/main}'
for r in new_para.findall(f'.//{ns}r'):
new_para.remove(r)
new_r = etree.SubElement(new_para, f'{ns}r')
if ref_para.runs:
rpr = ref_para.runs[0]._element.find(f'{ns}rPr')
if rpr is not None:
new_r.insert(0, copy.deepcopy(rpr))
new_t = etree.SubElement(new_r, f'{ns}t')
new_t.text = text
new_t.set('{http://www.w3.org/XML/1998/namespace}space', 'preserve')
ref_para._element.addnext(new_para)
9.3 扩充优先级(从高到低)
| 优先级 | 章节 | 扩充方式 | 典型增量 |
|---|---|---|---|
| 1 | 服务敏感点分析 | 每条加具体应对措施 | 每条+80-120字 |
| 2 | 项目重点难点 | 每条加解决方案和量化指标 | 每条+60-100字 |
| 3 | 实施思路/五阶段 | 每阶段加操作细节 | 每阶段+100-150字 |
| 4 | 质量保障措施 | 每条从一句话展开为一段 | 每条+80-120字 |
| 5 | 进度保证措施 | 加时间节点和责任人 | 每条+50-80字 |
| 6 | 售后服务 | 加响应时间、服务期限等量化承诺 | 每条+60-100字 |
| 7 | 风险管理 | 总述展开,每类风险加应急预案 | 总述+150字 |
| 8 | 培训效果评估 | 加过程性评价、结果运用 | 每项+100-150字 |
| 9 | 师资配备 | 总述加选拔标准和备选机制 | +100-150字 |
| 10 | 项目交付成果 | 加资料规范和移交流程 | +80-120字 |
9.4 扩充内容写作要求
- 量化优先:用数字而非形容词("3个工作日内"而非"及时")
- 具体可执行:每个承诺都要能落地执行
- 贴合行业:培训类用"学员""课时""满意度",党建类加"政治把关""红色现场教学"
- 不重复:不同段落扩充的内容不能互相重复
- 不空洞:避免"进一步加强""不断完善"等无实质内容的套话
9.5 迭代字数监控
# 每轮修改后必须统计字数
doc2 = Document(doc_path)
total = sum(len(p.text) for p in doc2.paragraphs)
for t in doc2.tables:
for row in t.rows:
for cell in row.cells:
total += len(cell.text)
print(f'当前字数: {total},距目标还差: {20000 - total} 字')
9.6 关键词匹配注意事项(血泪教训)
- 跨run问题:python-docx的一个段落可能被拆成多个run,关键词可能跨run边界,
p.text能搜到但run.text中搜不到 - 前轮修改影响后轮:前一轮脚本替换了文本后,后续脚本的关键词搜索可能失效,每轮都要用最新文档验证关键词
- 长度限制过滤:搜索时加
len(p.text) < 200避免匹配已展开的段落 - 段落索引偏移:
insert_para_after会增加段落数量,后续段落索引全部后移,如需多处插入应从后往前或分轮处理
Step 10: AI去痕(MANDATORY — 每次生成/扩充后必须执行)
10.1 完整AI禁用表述替换表
| 禁用表述 | 替换方案 | 说明 |
|---|---|---|
| 深刻理解 | 充分了解 | 最典型AI套话 |
| 贡献力量 | 圆满完成 | |
| 量身定制 | 专门制定 / 针对XX实际设计 | |
| 赋能 | 支撑 / 助推 | |
| 助力 | 支持 / 帮助 | |
| 打造 | 建设 / 建立 | |
| 筑牢 | 夯实 | 党建文档高频 |
| 构筑 | 构建 | |
| 紧密结合 | 结合 | 出现频率最高,通常4+处 |
| 深度融合 | 融合 | |
| 有机融合 | 融合 / 统筹 | |
| 全方位 | 全面 | |
| 多维度 | 多角度 | |
| 立体化 | 综合 | |
| 系统化培训 | 系统培训 | |
| 深入浅出 | 通俗易懂 | 讲师简介高频 |
| 精心设计 | 合理设计 | |
| 精心打造 | 合理建设 | |
| 精心组织 | 周密组织 | |
| 全面提升 | 提高 | |
| 持续提升 | 逐步提高 | |
| 不断提升 | 逐步提高 | |
| 充分发挥 | 发挥 | |
| 充分体现 | 体现 | |
| 充分调动 | 调动 | |
| 切实增强 | 增强 | |
| 切实提高 | 提高 | |
| 切实做到 | 做到 | |
| 积极探索 | 探索 | |
| 大胆创新 | 创新 | |
| 勇于担当 | 担当 | |
| 凝聚共识 | 统一认识 | |
| 汇聚力量 | 集中力量 | |
| 形成合力 | 协同配合 | |
| 高质量发展 | 稳健发展 | |
| 新质生产力 | 新型生产力 | |
| 确保培训取得实效 | 确保培训达到预期效果 | |
| 确保圆满完成 | 确保按期完成 | |
| 先进性、创新性和可操作性 | 切实可行、有针对性 | 三连套话 |
| 一对一访谈 | 代表性座谈 / 分组访谈 | 大规模培训不现实 |
10.2 自动化去痕脚本模板
"""AI去痕修复脚本模板"""
import sys
sys.stdout.reconfigure(encoding='utf-8')
from docx import Document
doc_path = r'文档路径.docx'
doc = Document(doc_path)
changes = []
# 替换映射表(根据实际文档调整)
replacements = {
'赋能': '支撑',
'紧密结合': '结合',
'全方位': '全面',
'多维度': '多角度',
'持续提升': '逐步提高',
'全面提升': '提高',
'量身定制': '专门制定',
'系统化培训': '系统培训',
'精心设计': '合理设计',
'深入浅出': '通俗易懂',
'深刻理解': '充分了解',
'充分调动': '调动',
'高质量发展': '稳健发展',
'筑牢': '夯实',
'深度融合': '融合',
'凝聚共识': '统一认识',
}
# 段落替换
for i, p in enumerate(doc.paragraphs):
for old, new in replacements.items():
if old in p.text:
for run in p.runs:
if old in run.text:
run.text = run.text.replace(old, new)
changes.append(f'[段落{i}] {old} → {new}')
# 表格替换
for ti, t in enumerate(doc.tables):
for ri, row in enumerate(t.rows):
for ci, cell in enumerate(row.cells):
for old, new in replacements.items():
if old in cell.text:
for p in cell.paragraphs:
for run in p.runs:
if old in run.text:
run.text = run.text.replace(old, new)
changes.append(f'[表{ti}-行{ri}-列{ci}] {old} → {new}')
doc.save(doc_path)
# 残留检查
doc2 = Document(doc_path)
ai_phrases = list(replacements.keys())
残留 = []
for i, p in enumerate(doc2.paragraphs):
for phrase in ai_phrases:
if phrase in p.text:
残留.append(f'[段落{i}] {phrase}')
print(f'AI去痕完成,共 {len(changes)} 处修改')
if 残留:
print(f'⚠️ 残留: {残留}')
else:
print('✅ 无残留')
10.3 跨run替换的坑
AI词汇可能被 python-docx 拆分到多个 run 中(如"紧密"在一个run、"结合"在另一个run),这时 run.text.replace() 无法匹配。解决方案:
# 如果 p.text 中有但所有 run.text 中都没有,说明跨run了
if old in p.text and not any(old in run.text for run in p.runs):
# 合并所有run文本后替换,再写回第一个run
combined = ''.join(run.text for run in p.runs)
combined = combined.replace(old, new)
p.runs[0].text = combined
for run in p.runs[1:]:
run.text = ''
输出文件
{项目名}_服务方案.docx— 纯文字版infographics_{项目名}.html— 信息图网页版{项目名}_服务方案_final.docx— 带信息图的最终版
注意事项
- Windows 环境下 docx 全局安装需
NODE_PATH="$(npm root -g)" - .doc 转 .docx 需要 win32com(仅 Windows)
- 如果 Word 正在打开文件会报 EBUSY,换文件名输出
- python-docx 的 sys.stdout 需要
reconfigure(encoding='utf-8') - 截图需要网络加载 Font Awesome CDN,确保有网络连接
- python-docx 替换图片用
image_part._blob = new_data,不需要重新插入 - 同一文档多次修改时,每次都用
Document(path)重新读取再保存,避免状态污染
Decide Fit First
Design Intent
How To Use It
Boundaries And Review