Editar documentos Office
EditableDocument é a contraparte read-modify-write do Document. Ele preserva toda parte OPC inalterada — imagens, gráficos, estilos, temas, relações — exatamente como estavam, então suas edições não realinham conteúdo ao redor nem invalidam consumidores downstream.
A edição é suportada para DOCX, XLSX e PPTX. DOC, XLS e PPT legados são somente leitura — converta antes com save_as se precisar editar.
O que dá pra fazer
| Operação | DOCX | XLSX | PPTX | Método |
|---|---|---|---|---|
| Substituir texto em corpo / placeholders | ✓ | — | ✓ | replace_text |
| Definir valor de célula (string / número / bool / vazio) | — | ✓ | — | set_cell |
| Salvar em disco | ✓ | ✓ | ✓ | save |
| Salvar em bytes | ✓ | ✓ | ✓ | save_to_bytes |
replace_text retorna 0 em XLSX (não existem elementos <w:t> ou <a:t> lá); use set_cell para planilhas.
Abrir, editar, salvar
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");
Salvar em bytes (para upload / streaming)
Python
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
bytes_out = ed.save_to_bytes()
# envia bytes_out para S3 / via HTTP / etc.
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
O que “preservar partes OPC” realmente quer dizer
Arquivos OOXML são arquivos ZIP contendo dezenas de partes XML mais partes binárias (imagens, fontes, objetos embutidos). Editores ingênuos reserializam todas as partes ao salvar, e isso pode:
- Reordenar as relações e quebrar links
- Descartar partes de extensão que o editor não entende (custom XML, fallbacks de AlternateContent)
- Reformatar o XML de jeitos que quebram diffs downstream e assinaturas
EditableDocument reescreve só as partes que você tocou. O resto é copiado byte a byte. O resultado é o menor diff possível entre entrada e saída — mais amigável para versionamento, verificação de assinatura e round-trip por outras ferramentas.
Quando preferir a API específica do formato
EditableDocument cobre o caso comum 80% (templates, batch fill-in, escritas em célula). Para edições mais ricas — adicionar parágrafos, inserir tabelas, ajustar estilos, montar slides do zero — entre nas APIs específicas do formato:
use office_oxide::docx::edit::DocxEditor;
let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("Nova seção", Some("Heading2"));
docx.save("report.docx")?;
Os editores específicos por formato estão documentados na referência de cada binding (Rust: docx::edit, xlsx::edit, pptx::edit).
Veja também
- Substituir texto — a API
replace_textem detalhes - Definir células XLSX — tipos de célula, formatos e edge cases
- Conversão — converta DOC/XLS/PPT legados primeiro