Skip to content

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