Editar documentos Office
EditableDocument é a contraparte read-modify-write de Document. Ele preserva cada parte OPC não modificada — imagens, gráficos, estilos, temas, relacionamentos — exatamente como estavam, então suas edições não realinham o conteúdo ao redor nem invalidam consumidores downstream.
A edição é suportada para DOCX, XLSX e PPTX. Os formatos legados DOC, XLS e PPT são somente leitura — converta-os primeiro com save_as se precisar editá-los.
O que você pode fazer
| Operação | DOCX | XLSX | PPTX | Método |
|---|---|---|---|---|
| Substituir texto no 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 quando chamado em um XLSX (não há elementos <w:t> ou <a:t> lá); use set_cell para planilhas.
Abrir, editar, salvar
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")?;
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")
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");
C
int err = 0;
OfficeEditableHandle *ed = office_editable_open("template.docx", &err);
office_editable_replace_text(ed, "{{name}}", "Alice", &err);
office_editable_replace_text(ed, "{{date}}", "2026-04-19", &err);
office_editable_save(ed, "filled.docx", &err);
office_editable_free(ed);
Salvar em bytes (para upload / streaming)
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();
Python
with EditableDocument.open("template.docx") as ed:
ed.replace_text("{{name}}", "Alice")
bytes_out = ed.save_to_bytes()
# upload bytes_out to S3 / send over HTTP / etc.
JavaScript
using ed = EditableDocument.open('template.docx');
ed.replaceText('{{name}}', 'Alice');
const bytes = ed.saveToBytes(); // Uint8Array
C
int err = 0;
OfficeEditableHandle *ed = office_editable_open("template.docx", &err);
office_editable_replace_text(ed, "{{name}}", "Alice", &err);
size_t out_len = 0;
uint8_t *buf = office_editable_save_to_bytes(ed, &out_len, &err);
/* stream buf[0..out_len], then: */
office_oxide_free_bytes(buf, out_len);
office_editable_free(ed);
O que “preservar partes OPC” realmente significa
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, o que pode:
- Reordenar relacionamentos e quebrar links
- Descartar partes de extensão que o editor não compreende (custom XML, fallbacks de AlternateContent)
- Reformatar o XML de maneiras que corrompem diffs e assinaturas downstream
EditableDocument reescreve apenas as partes que você modificou. Todo o resto é copiado byte a byte. O resultado é o menor diff possível entre a entrada e a saída — mais amigável para controle de versão, verificação de assinatura e round-trip por outras ferramentas.
Quando preferir a API específica do formato
EditableDocument cobre 80% dos casos (templates, preenchimento em lote, escritas em células). Para edições mais complexas — adicionar parágrafos, inserir tabelas, ajustar estilos, criar slides do zero — use as APIs específicas de cada formato:
use office_oxide::docx::edit::DocxEditor;
let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("New section", 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 casos limite
- Conversão — converta DOC/XLS/PPT legados para OOXML editável primeiro