Skip to content

编辑 Office 文档

EditableDocumentDocument 的读—改—写版本。它会完整保留所有未修改的 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::editxlsx::editpptx::edit)。

相关链接