Skip to content

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