kimi-docx by thvroyal/kimi-skills
npx skills add https://github.com/thvroyal/kimi-skills --skill kimi-docx要保留源文档的任何格式,必须解压并解析 XML。
读取工具仅返回纯文本 — 字体、颜色、对齐方式、边框、样式都会丢失。
| 需求 | 方法 |
|---|---|
| 仅文本内容(总结、分析、翻译) | 读取工具即可 |
| 格式信息(复制样式、保留布局、模板填充) | 解压并解析 XML |
| 结构 + 评论/修订跟踪 | pandoc input.docx -t markdown |
保留格式 — 编辑现有文档时,保留原始格式。克隆并修改,切勿重新创建。
正确实现功能 — 评论需要多文件同步。修订跟踪需要修订标记。使用正确的结构。
切勿使用 python-docx/docx-js 作为备选方案。 这些库产生的输出质量低于直接操作 XML。
提供模板 = 充当表单填写者,而非设计师。
根据场景自由设计。
广告位招租
在这里展示您的产品或服务
触达数万 AI 开发者,精准高效
对于 .doc(旧格式),首先使用 libreoffice --headless --convert-to docx 进行转换。
docx/
├── SKILL.md ← 此文件(入口点 + 参考)
├── references/
│ └── EditingGuide.md → 完整的 Python 编辑教程(评论、修订跟踪、5 文件同步)
├── scripts/
│ ├── docx → 统一入口(唯一需要调用的脚本)
│ ├── fix_element_order.py → 自动修复 XML 元素顺序
│ ├── validate_docx.py → 业务规则验证
│ ├── generate_backgrounds.py → 莫兰迪风格背景
│ ├── generate_inkwash_backgrounds.py → 水墨风格背景
│ └── generate_chart.py → matplotlib(仅用于热图/3D/雷达图;简单图表必须使用原生)
├── assets/
│ └── templates/
│ ├── KimiDocx.csproj → 项目文件模板(用于创建新文档)
│ ├── Program.cs → 程序入口模板
│ ├── Example.cs → 完整示例(封面+目录+图表+封底)
│ ├── CJKExample.cs → CJK 内容模式(引号转义、字体)
│ └── xml/ → 评论基础设施的 XML 模板
└── validator/ → OpenXML 验证器(预编译二进制文件,AI 不修改)
创建新文档:使用 C# SDK 配合 ./scripts/docx build → 查看 Example.cs 了解模式,CJKExample.cs 了解 CJK 内容 编辑现有文档:使用 Python + lxml → 查看 references/EditingGuide.md 获取完整教程
⚠️ 切勿混合使用这些方法。 C# SDK 用于创建,Python 用于编辑。切勿使用 python-docx/docx-js。
首次使用时,在 SKILL 目录中执行:
cd /app/.kimi/skills/kimi-docx/
./scripts/docx init
固定路径约定(不可更改):
| 路径 | 用途 |
|---|---|
/app/.kimi/skills/kimi-docx/ | SKILL 目录,在此执行命令 |
/tmp/docx-work/ | 工作目录,在此编辑 Program.cs |
/mnt/okcomputer/output/ | 输出目录,最终交付物 |
/mnt/okcomputer/upload/ | 用户上传位置(输入文件) |
脚本命令 (./scripts/docx <cmd>):
| 命令 | 用途 |
|---|---|
env | 显示环境状态(无更改) |
init | 设置依赖项 + 工作空间 |
build [out] | 编译、运行、验证(默认:output/output.docx) |
validate FILE | 验证现有 docx |
脚本自动处理:
必须使用./scripts/docx build,不要单独执行 dotnet build && dotnet run(会跳过验证)。
Program.cs 必须从命令行参数获取输出路径,否则构建脚本无法找到生成的文件:
// 正确 - 从命令行参数获取输出路径
string outputFile = args.Length > 0 ? args[0] : "/mnt/okcomputer/output/output.docx";
// 错误 - 硬编码路径导致构建失败
string outputFile = "my_document.docx"; // 脚本找不到文件!
| 步骤 | 操作 | 备注 |
|---|---|---|
| 1. 编译 | dotnet build | 失败时提供修复建议 |
| 2. 生成 | dotnet run -- <输出路径> | 通过命令行参数传递路径 |
| 3. 自动修复 | fix_element_order.py | 修复 XML 元素排序问题 |
| 4. OpenXML 验证 | validator/ | 必需 |
| 5. 业务规则 | validate_docx.py | 必需 |
| 6. 统计 | 字符 + 字数统计 | 可选(需要 pandoc) |
验证是必需的:失败时,文件会被保留但会显示警告。检查错误信息以修复问题。
cd /app/.kimi/skills/kimi-docx/
./scripts/docx validate /mnt/okcomputer/output/report.docx
pandoc 是唯一真相来源。 OpenXML 验证器检查结构;pandoc 显示实际内容。
交付前,使用 pandoc 验证:
pandoc output.docx -t plain — 检查文本完整性--track-changes=all 以验证标记位置⚠️ 关键:comments.xml 存在 ≠ 评论可见。计数不匹配 = doc_tree 未保存。参见 references/EditingGuide.md §5.3。
通用样式和中等审美 = 中等交付。
交付具有工作室品质的 Word 文档,深入思考内容、功能和样式。用户通常不会明确要求高级功能(封面、目录、背景、封底、脚注、图表)— 深刻理解需求并主动扩展。
文档语言 = 用户对话语言(包括文件名、正文、标题、页眉、目录提示、图表标签以及所有其他文本)。
大多数文档必须包含页眉和页脚。具体样式(对齐方式、格式、内容)应与文档的整体设计相匹配。
TitlePage 设置隐藏首页的页眉/页脚创建超出用户期望的文档,主动添加专业元素,不要等待用户要求。交付标准:2024 年顶级设计师的视觉质量。
封面与视觉:
结构:
数据呈现:
链接与引用:
Word 目录是域代码,生成时页码可能不准确。必须在目录后添加灰色提示文本,告知用户手动刷新:
Table of Contents
─────────────────
Chapter 1 Overview .......................... 1
Chapter 2 Methods ........................... 3
...
(提示:首次打开时,右键点击目录并选择"更新域"以显示正确的页码)
提示文本要求:
| 功能 | 原因 |
|---|---|
| 水印 | 改变视觉状态。SDK 限制:VML 水印类无法正确序列化;必须向页眉写入原始 XML。 |
| 文档保护 | 限制编辑 |
| 邮件合并域 | 需要数据源 |
默认使用原生 Word 图表,可编辑、文件小、专业。
| 图表类型 | 方法 | 备注 |
|---|---|---|
| 饼图 | 原生 | Example.cs → AddPieChart() |
| 条形图 | 原生 | Example.cs → AddBarChart() |
| 折线图 | 原生 | 参考条形图结构,使用 c:lineChart |
| 水平条形图 | 原生 | 参考条形图结构,使用 barDir="bar" |
| 热图、3D、雷达图 | matplotlib | Word 原生不支持 |
| 复杂统计(箱形图等) | matplotlib | Word 原生不支持 |
原生图表是首选(可编辑、文件更小),但对于数据分析场景,matplotlib 是可接受的。
任何 PNG(matplotlib 图表、背景、照片)必须使用 AddInlineImage() 插入:
AddInlineImage(body, mainPart, "/path/to/image.png", "Description", docPrId++);
关键:
X images — 如果为 0,则图片未插入| 用户要求 | 执行标准 |
|---|---|
| 特定字数(如"3000 字") | 实际输出在 ±20% 以内 |
| 特定页数(如"5 页") | 完全匹配 |
| 范围(如"2000-3000 字") | 在范围内 |
| 最小值(如"至少 5000 字") | 不超过要求的 2 倍 |
禁止:用过多的项目符号列表填充字数。保持信息密度。
比用户多想一步,完成场景所需的元素。以下示例并非详尽 — 将此原则应用于所有文档类型:
低饱和度色调,避免 Word 默认蓝色和 matplotlib 默认高饱和度。
根据文档场景灵活选择配色方案:
| 风格 | 调色板 | 适用场景 |
|---|---|---|
| 莫兰迪 | 柔和哑光色调 | 艺术、编辑 |
| 大地色系 | 棕色、橄榄色、自然色 | 环境、有机 |
| 北欧 | 冷灰、雾霾蓝 | 极简、科技 |
| 日式侘寂 | 灰色、原木色、禅意 | 传统、沉思 |
| 法式优雅 | 米白、灰粉色 | 奢华、女性化 |
| 工业风 | 炭黑、铁锈色、混凝土色 | 制造、工程 |
| 学术 | 海军蓝、勃艮第红、象牙白 | 研究、教育 |
| 海洋薄雾 | 雾霾蓝、沙色 | 海洋、健康 |
| 森林苔藓 | 橄榄绿、苔藓绿 | 自然、可持续 |
| 沙漠黄昏 | 赭石色、沙金色 | 温暖、地域性 |
同一文档内配色方案必须一致。
留白(边距、段落间距)、清晰的层次结构(H1 > H2 > 正文)、适当的填充(文本不应触及边框)。
Word 使用流式布局,而非固定页面。使用以下属性控制分页:
| 属性 | XML | 效果 |
|---|---|---|
| 与下段同页 | <w:keepNext/> | 标题与后续段落保持在同一页 |
| 段中不分页 | <w:keepLines/> | 段落不会跨页断开 |
| 段前分页 | <w:pageBreakBefore/> | 强制新页(用于 H1) |
| 孤行控制 | <w:widowControl/> | 防止单行出现在页首/页尾 |
// 示例:H1 始终从新页开始,并与下段同页
new ParagraphProperties(
new ParagraphStyleId { Val = "Heading1" },
new PageBreakBefore(),
new KeepNext(),
new KeepLines()
)
表格分页:
// 允许行跨页断开(避免大块空白区域)
new TableRowProperties(
new CantSplit { Val = false } // false = 可以拆分
)
// 每页重复表头行
new TableRowProperties(
new TableHeader()
)
选择你的路径:
| 任务 | 技术栈 | 参考 |
|---|---|---|
| 创建新文档 | C# + OpenXML SDK | 4.1-4.6 + Example.cs |
| 编辑现有文档 | Python + lxml | 4.7 + references/EditingGuide.md |
OpenXML 有严格的元素顺序要求。顺序错误 = Word 无法打开文件。
// Normal 样式必须存在 - 所有 Heading 样式都使用 basedOn="Normal"
styles.Append(new Style(
new StyleName { Val = "Normal" },
new StyleParagraphProperties(
new SpacingBetweenLines { After = "200", Line = "276", LineRule = LineSpacingRuleValues.Auto }
),
new StyleRunProperties(
new RunFonts { Ascii = "Calibri", HighAnsi = "Calibri" },
new FontSize { Val = "22" },
new FontSizeComplexScript { Val = "22" }
)
) { Type = StyleValues.Paragraph, StyleId = "Normal", Default = true });
大多数排序问题由 fix_element_order.py 自动修复。需要记住的关键规则:
| 父元素 | 关键规则 |
|---|---|
sectPr | headerRef → footerRef 必须在 pgSz → pgMar 之前 |
Table | 必须在 tblPr 和 tr 之间有 tblGrid(见下文) |
// 正确 - 表格必须定义网格
var table = new Table();
table.Append(new TableProperties(...));
table.Append(new TableGrid( // 必需!
new GridColumn { Width = "4680" },
new GridColumn { Width = "4680" }
));
table.Append(new TableRow(...));
// 错误 - 缺少 tblGrid,Word 无法打开
var table = new Table();
table.Append(new TableProperties(...));
table.Append(new TableRow(...)); // 直接添加行
表格扭曲的主要原因:tblGrid 中的 gridCol 宽度与单元格的 tcW 宽度不匹配。
// 正确 - gridCol 和 tcW 完全匹配
table.Append(new TableGrid(
new GridColumn { Width = "3600" }, // 第一列
new GridColumn { Width = "5400" } // 第二列
));
var row = new TableRow(
new TableCell(
new TableCellProperties(
new TableCellWidth { Width = "3600", Type = TableWidthUnitValues.Dxa } // 匹配 gridCol!
),
new Paragraph(new Run(new Text("Content")))
),
new TableCell(
new TableCellProperties(
new TableCellWidth { Width = "5400", Type = TableWidthUnitValues.Dxa } // 匹配 gridCol!
),
new Paragraph(new Run(new Text("Content")))
)
);
| 规则 | 原因 |
|---|---|
| gridCol 数量 = 表格列数 | 否则列宽计算失败 |
| gridCol.Width = tcW.Width | 不匹配导致扭曲(验证时检查) |
| 同一列的所有行使用相同的 tcW | 保持列宽一致性 |
paraId 必须 < 0x80000000(用于评论段落 ID)| 任务 | 方法 | 原因 |
|---|---|---|
| 创建新文档 | C# OpenXML SDK | 自动处理包结构、关系、Content_Types |
| 编辑现有文档 | Python + lxml | 透明、无黑盒、完全控制 |
创建新文档:使用 Example.cs 模式配合 SDK。
编辑现有文档:查看 references/EditingGuide.md 获取完整的 Python 工作流程。
阅读整个文件以理解整体结构,而不仅仅是单个函数。该文件演示了各部分如何连接(封面 → 目录 → 正文 → 封底)。
Example 中的 "Project Proposal"、"[Company Name]" 等是仅作示例的内容,配色方案仅供参考。
| 需要学习的内容 | 不应学习的内容 |
|---|---|
| 章节划分(封面 → 目录 → 正文 → 封底) | 具体的颜色值 |
| 浮动背景插入代码 | 示例中的业务内容 |
| 图表创建 API 调用 | 示例中的复制/措辞 |
| 样式定义结构 | 示例中的硬编码数据 |
⚠️ 切勿复制示例的配色方案。 根据你的文档场景重新设计视觉风格,就像顶级设计师那样。
函数索引(阅读源代码了解实现细节):
| 功能 | 函数 | 行号 |
|---|---|---|
| 文档结构 | ||
| 样式(Normal、Heading1-3) | AddStyles() | 85-203 |
| 封面页 | AddCoverSection() | 369-453 |
| 目录 | AddTocSection() | 458-526 |
| 正文部分 | AddContentSection() | 531-729 |
| 封底 | AddBackcoverSection() | 734-794 |
| 视觉元素 | ||
| 浮动背景 | CreateFloatingBackground() | 228-279 |
| 按比例内嵌图片 | AddInlineImage() | 285-364 |
| 表格 | ||
| 三线表 | CreateDataTable() | 853-888 |
| 表头行(灰色背景) | CreateSimpleHeaderRow() | 933-971 |
| 数据行 | CreateSimpleDataRow() | 976-1008 |
| 图表 | ||
| 饼图 | AddPieChart() | 1013-1049 |
| 条形图 | AddBarChart() | 1133-1169 |
| 页面元素 | ||
| 带背景的页眉 | 在 AddContentSection() 内 | 534-575 |
| 带页码的页脚 | 在 AddContentSection() 内 | 578-588 |
| 页码域 | CreatePageNumberField() | 1345-1354 |
| 总页数域 | CreateTotalPagesField() | 1356-1365 |
| 高级功能 | ||
| 脚注 | AddFootnote() | 1370-1410 |
| 交叉引用 | CreateCrossReference() | 1415-1425 |
| 编号/列表 | CreateBasicNumbering() | 1327-1340 |
CJK 文档必须只阅读CJKExample.cs — 阅读 Example.cs 会导致错误(缺少字体配置、引号转义)。它处理:
"" → \u201c \u201d)结构与 Example.cs 相同 — 无需阅读两者。
PAGE/NUMPAGES/DATE/TOC — 结构:FieldChar(Begin) → FieldCode(" PAGE ") → FieldChar(Separate) → Text → FieldChar(End)。结果被缓存;WPS 不支持 UpdateFieldsOnOpen。
书签标记位置(BookmarkStart/BookmarkEnd 具有匹配的 ID);交叉引用通过 REF 域链接(" REF bookmarkName \\h ")。
陷阱:删除带书签的文本会删除书签 → "错误!未找到引用源"。
封面/封底必须有背景。背景图片应有中心留白,使用低饱和度颜色。背景图片必须不包含任何文本;文本应在 Word 中实现,以便用户可编辑。
scripts/generate_backgrounds.py 了解 HTML/CSS 技术(径向渐变、透明度、定位)⚠️ 复制示例 = 所有文档看起来都一样 = 平庸的交付。 每个文档都应具有与其内容和目的相匹配的独特视觉标识。
| 风格 | 关键元素 | 场景 |
|---|---|---|
| MUJI | 细边框 + 留白 | 极简、日式、生活方式 |
| 包豪斯 | 散落的几何形状 | 艺术、设计、创意 |
| 瑞士风格 | 网格线 + 强调条 | 专业、企业 |
| 柔和色块 | 柔和的彩色矩形、重叠透明 | 温暖、教育、医疗 |
| 圆角几何 | 圆角矩形、药丸形状 | 科技、互联网、年轻 |
| 毛玻璃 | 模糊 + 透明度 + 细微边框 | 现代、高端、科技 |
| 渐变丝带 | 柔和的渐变椭圆 + 小点 | 女性化、美容、柔和 |
| 点阵 | 规则的点阵纹理 | 技术、数据、工程 |
| 双边框 | 嵌套边框 + 角部装饰 | 传统、正式、法律 |
| 波浪 | 底部 SVG 波浪 + 渐变背景 | 海洋、环境、流动 |
| 温暖自然 | 大地色调 + 有机形状 | 环境、农业、自然 |
技术:Playwright 生成 794×1123px (device_scale_factor=2),作为浮动锚点插入,BehindDoc=true。参见 Example.cs:CreateFloatingBackground()。
对于正式商业信函,考虑在页眉区域添加信头。常见模式:
SectionProperties 中使用 TitlePage 以启用不同的首页页眉使用带有 Columns 的 sectPr。影响整个章节直到下一个 sectPr。
核心模式:<m:e> 是通用的内容容器。几乎所有元素都将内容包装在 <m:e> 中。
文本:始终是 <m:r><m:t>text</m:t></m:r>,绝不能是裸文本。
根元素:<m:oMath>(内联)或 <m:oMathPara>(显示)。不要将 <m:oMath> 嵌套在另一个里面。
结构示例:
| 元素 | 结构 |
|---|---|
| 分数 | <m:f><m:num><m:e>…</m:e></m:num><m:den><m:e>…</m:e></m:den></m:f> |
| 下标 | <m:sSub><m:e>base</m:e><m:sub><m:e>…</m:e></m:sub></m:sSub> |
| 上标 | <m:sSup><m:e>base</m:e><m:sup><m:e>…</m:e></m:sup></m:sSup> |
| 根式 | <m:rad><m:deg><m:e>n</m:e></m:deg><m:e>radicand</m:e></m:rad> |
| 矩阵 | <m:m><m:mr><m:e>cell</m:e><m:e>cell</m:e></m:mr></m:m> |
| N 元运算(∑∫) | <m:nary><m:sub><m:e>…</m:e></m:sub><m:sup><m:e>…</m:e></m:sup><m:e>body</m:e></m:nary> |
| 定界符 | <m:d><m:dPr><m:begChr m:val="("/><m:endChr m:val=")"/></m:dPr><m:e>…</m:e></m:d> |
| 方程组 | <m:eqArr><m:e>eq1</m:e><m:e>eq2</m:e></m:eqArr> |
陷阱:矩阵使用 <m:e> 表示单元格,而不是 <m:mc>(后者用于列属性)。
C# 将 " " 视为字符串分隔符 → CS1003。最简单的修复方法:在字符串字面量中使用转义直引号 \"。如果需要弯引号,使用 XML 实体编码:“ ”(双引号)或 ‘ ’(单引号)。
中文引号处理 — 查看 CJKExample.cs 获取完整模式:
// ❌ 错误 - 中文引号导致编译失败
new Text("请点击"确定"按钮") // CS1003!
// ✓ 正确 - 使用 Unicode 转义
new Text("请点击\u201c确定\u201d按钮")
| 字符 | Unicode | 用法 |
|---|---|---|
| "(左双引号) | \u201c | 开引号 |
| "(右双引号) | \u201d | 闭引号 |
| '(左单引号) | \u2018 | 开单引号 |
| '(右单引号) | \u2019 | 闭单引号 |
⚠️ 切勿使用逐字字符串@"" — \u 转义在逐字字符串中不起作用:
// ❌ 错误 - @"" 逐字字符串,\u 未转义,输出字面量 "\u201c"
string text = @"她说\u201c你好\u201d"; // 输出:她说\u201c你好\u201d
// ✓ 正确 - 常规字符串,\u 已转义
string text = "她说\u201c你好\u201d"; // 输出:她说"你好"
// ✓ 对于长文本,使用 + 连接
string para = "第一段内容," +
"她说\u201c这是引用\u201d," +
"继续写第二段。";
缇 = 1/20 磅(11906 = A4 宽度)。字体大小为半磅(24 = 12pt)。EMU = 914400/英寸。
wp:extent 和 a:ext 的 Cx/Cy 必须匹配。对于按比例缩放:读取 PNG 头(字节 16-23)获取尺寸,计算 cy = cx * 高度 / 宽度。
向标题/图表段落添加 KeepNext,以防止标题孤立或图表与标题分离。
pPr 内的 sectPr = 章节的最后一段。避免 PageBreak + Continuous(空白页)。使用 NextPage。
WPS 不支持 UpdateFieldsOnOpen → 必须使用域代码结构预填充目录条目:FieldChar(Begin) → FieldCode(" TOC ...") → FieldChar(Separate) → 占位符条目(超链接文本 + 页码) → FieldChar(End)。Separate 和 End 之间的占位符条目允许 Word 立即显示目录;用户刷新以获取准确的页码。切勿使用静态文本段落模拟目录 — 必须使用域代码结构,否则无法刷新。参见 Example.cs:AddTocSection()。
参数:\o "1-3"(标题级别),\h(超链接),\z(在网页中隐藏页码),\u(大纲级别)。
标题必须使用内置的 Heading1/Heading2 样式(自定义样式不被识别)。
CJK 正文:两端对齐 + 2 字符缩进。英文:左对齐。表格数字:右对齐。标题:无缩进。
// 1. 创建页眉部分
var headerPart = mainPart.AddNewPart<HeaderPart>();
var headerId = mainPart.GetIdOfPart(headerPart);
headerPart.Header = new Header(
new Paragraph(
new ParagraphProperties(
new ParagraphStyleId { Val = "Header" },
new Justification { Val = JustificationValues.Center }
),
new Run(new Text("Document Title"))
)
);
// 2. 创建页脚部分(带页码)
var footerPart = mainPart.AddNewPart<FooterPart>();
var footerId = mainPart.GetIdOfPart(footerPart);
var footerPara = new Paragraph(
new ParagraphProperties(
new Justification { Val = JustificationValues.Center }
)
);
// PAGE 域:Begin → FieldCode → Separate → Text → End
footerPara.Append(new Run(new FieldChar { FieldCharType = FieldCharValues.Begin }));
footerPara.Append(new Run(new FieldCode(" PAGE ")));
footerPara.Append(new Run(new FieldChar { FieldCharType = FieldCharValues.Separate }));
footerPara.Append(new Run(new Text("1"))); // 占位符,打开时更新
footerPara.Append(new Run(new FieldChar { FieldCharType = FieldCharValues.End }));
footerPara.Append(new Run(new Text(" / ") { Space = SpaceProcessingModeValues.Preserve }));
// NUMPAGES 域(相同结构)
footerPara.Append(new Run(new FieldChar { FieldCharType = FieldCharValues.Begin }));
footerPara.Append(new Run(new FieldCode(" NUMPAGES ")));
footerPara.Append(new Run(new FieldChar { FieldCharType = FieldCharValues.Separate }));
footerPara.Append(new Run(new Text("1")));
footerPara.Append(new Run(new FieldChar { FieldCharType = FieldCharValues.End }));
footerPart.Footer = new Footer(footerPara);
// 3. 在 SectionProperties 中引用
new SectionProperties(
new HeaderReference { Type = HeaderFooterValues.Default, Id = headerId },
new FooterReference { Type = HeaderFooterValues.Default, Id = footerId },
new PageSize { Width = 11906, Height = 16838 },
new PageMargin { Top = 1440, Right = 1440, Bottom = 1440, Left = 1440, Header = 720, Footer = 720 }
)
页眉/页脚类型:
| 类型 | HeaderFooterValues | 用途 |
|---|---|---|
| 默认 | .Default | 奇数页(或所有页) |
| 偶数页 | .Even | 偶数页 |
| 首页 | .First | 第一页 |
首页不同(用于封面):在 sectPr 中添加 TitlePage()。
奇偶页不同:在 settings.xml 中添加 <w:evenAndOddHeaders/>。
分隔符陷阱:FootnotesPart/EndnotesPart 必须在任何用户注释之前包含 Id=-1(Separator)和 Id=0(ContinuationSeparator)。缺少这些 → Word 无法渲染。
<!-- 在 footnotes.xml / endnotes.xml 中,用户注释之前必需 -->
<w:footnote w:type="separator" w:id="-1">
<w:p><w:r><w:separator/></w:r></w:p>
</w:footnote>
<w:footnote w:type="continuationSeparator" w:id="0">
<w:p><w:r><w:continuationSeparator/></w:r></w:p>
</w:footnote>
<!-- 用户注释从 id="1" 开始 -->
需要带有 AbstractNum + NumberingInstance 的 NumberingDefinitionsPart。通过段落中的 NumberingProperties 应用。
多级:创建具有多个 Level 的 AbstractNum。格式:Decimal、UpperLetter、LowerRoman、Bullet、ChineseCounting。
必须使用<w:hyperlink> 元素,而非纯文本。 首先需要建立关系:
var relId = mainPart.AddHyperlinkRelationship(new Uri("https://example.com"), true).Id;
paragraph.Append(new Hyperlink(new Run(
new RunProperties(new Color { Val = "0563C1" }, new Underline { Val = UnderlineValues.Single }),
new Text("Click here")
)) { Id = relId })
| 需求 | 首选 | 备选 |
|---|---|---|
| 数据图表 | Word 原生 | matplotlib PNG |
| 流程图 | DrawingML 形状 | 表格布局 |
| 插图 | 图片生成 | 图片搜索 |
Word 图表:使用 NumberLiteral(无 Excel),DataPoint 用于颜色。参见 Example。
matplotlib:dpi=300,axes.unicode_minus=False。字体/标签必须与文档语言匹配。
使用 docx_lib.editing 进行评论和修订跟踪:
from scripts.docx_lib.editing import (
DocxContext,
add_comment, reply_comment, resolve_comment, delete_comment,
insert_paragraph, insert_text, propose_deletion,
reject_insertion, restore_deletion, enable_track_changes
)
with DocxContext("input.docx", "output.docx") as ctx:
# add_comment(ctx, para_text, comment, highlight=None)
# - para_text: 用于定位段落的文本
# - comment: 评论内容
# - highlight: 要高亮的文本(省略则高亮整个段落)
add_comment(ctx, "M-SVI index", "Please define", highlight="M-SVI")
insert_text(ctx, "The method", after="method", new_text=" and materials")
完整指南:references/EditingGuide.md
通过 LiteLLM 代理让 Claude Code 对接 GitHub Copilot 运行 | 高级变通方案指南
40,000 周安装
阿里云CDN OpenAPI自动化操作指南 - 域名管理、缓存刷新、HTTPS证书配置
110 周安装
Google Ads 账户深度分析与健康度审计工具 - 74项检查,自动生成优化报告
110 周安装
Pulumi TypeScript 技能:使用 TypeScript 和 Pulumi ESC 实现云基础设施即代码
110 周安装
Markdown转Overseer任务工具:自动分解规划文档为可追踪开发任务
110 周安装
LinkedIn广告健康度审计工具 - 25项检查清单,优化B2B广告效果与ROI
110 周安装
React拖放功能实现指南:dnd-kit库教程与无障碍可排序界面开发
110 周安装