编辑 Office 文档
EditableDocument 是 Document 的读—改—写版本。它会完整保留所有未修改的 OPC 部件 — 图片、图表、样式、主题、关系 — 所以你的修改不会让周围内容重新排版,也不会让下游消费者失效。
编辑支持 DOCX、XLSX、PPTX。旧版 DOC、XLS、PPT 是只读的 — 需要编辑请先用 save_as 转换。
你能做什么
| 操作 | DOCX | XLSX | PPTX | 方法 |
|---|---|---|---|---|
| 在正文/占位符中替换文本 | ✓ | — | ✓ | replace_text |
| 设置单元格值(字符串/数字/布尔/空) | — | ✓ | — | set_cell |
| 保存到磁盘 | ✓ | ✓ | ✓ | save |
| 保存为字节 | ✓ | ✓ | ✓ | save_to_bytes |
replace_text 在 XLSX 上返回 0(XLSX 里没有 <w:t> 或 <a:t>);电子表格请改用 set_cell。
打开、编辑、保存
Python
from office_oxide import EditableDocument
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
ed.replace_text("{{date}}", "2026-04-19")
ed.save("filled.docx")
Rust
use office_oxide::edit::EditableDocument;
let mut ed = EditableDocument::open("template.docx")?;
ed.replace_text("{{name}}", "Alice");
ed.replace_text("{{date}}", "2026-04-19");
ed.save("filled.docx")?;
JavaScript
import { EditableDocument } from 'office-oxide';
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
ed.replaceText('{{date}}', '2026-04-19');
ed.save('filled.docx');
Go
ed, err := officeoxide.OpenEditable("template.docx")
defer ed.Close()
ed.ReplaceText("{{name}}", "Alice")
ed.ReplaceText("{{date}}", "2026-04-19")
ed.Save("filled.docx")
C#
using var ed = EditableDocument.Open("template.docx");
ed.ReplaceText("{{name}}", "Alice");
ed.ReplaceText("{{date}}", "2026-04-19");
ed.Save("filled.docx");
保存为字节(用于上传/流式)
Python
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
bytes_out = ed.save_to_bytes()
# 把 bytes_out 上传到 S3 / 通过 HTTP 发送等
Rust
let mut ed = EditableDocument::open("template.docx")?;
ed.replace_text("{{name}}", "Alice");
let mut buf = std::io::Cursor::new(Vec::new());
ed.write_to(&mut buf)?;
let bytes: Vec<u8> = buf.into_inner();
JavaScript
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
const bytes = ed.saveToBytes(); // Uint8Array
「保留 OPC 部件」到底意味着什么
OOXML 文件是 ZIP 包,里面包含几十个 XML 部件加二进制部件(图片、字体、嵌入对象)。朴素的编辑器在保存时会重新序列化所有部件,这会:
- 重排关系并破坏链接
- 丢掉编辑器不理解的扩展部件(自定义 XML、AlternateContent 回退)
- 用某种方式重新格式化 XML,破坏下游 diff 与签名
EditableDocument 只重写你动过的部件,其他逐字节复制。结果是输入与输出之间 尽可能小的 diff — 对版本控制、签名校验和往返其他工具更友好。
何时改用按格式 API
EditableDocument 覆盖 80% 场景(模板、批量填充、单元格写入)。要做更复杂的编辑 — 添加段落、插入表格、调整样式、从零构建幻灯片 — 请改用按格式 API:
use office_oxide::docx::edit::DocxEditor;
let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("新章节", Some("Heading2"));
docx.save("report.docx")?;
按格式编辑器在每个绑定的参考中都有文档(Rust: docx::edit、xlsx::edit、pptx::edit)。
相关链接
- 替换文本 — 深入了解
replace_textAPI - 设置 XLSX 单元格 — 单元格类型、格式、边界情况
- 转换 — 先把旧版 DOC/XLS/PPT 转成可编辑的 OOXML