Skip to content

Editar documentos Office

EditableDocument es la contraparte read-modify-write de Document. Conserva cada parte OPC sin tocar — imágenes, gráficos, estilos, temas, relaciones — al pie de la letra, así que tus ediciones no recolocan el contenido alrededor ni invalidan a consumidores downstream.

La edición está soportada en DOCX, XLSX y PPTX. DOC, XLS y PPT heredados son de solo lectura — primero convierte con save_as si necesitas editar.

Qué puedes hacer

Operación DOCX XLSX PPTX Método
Reemplazar texto en cuerpo / placeholders replace_text
Establecer valor de celda (string / número / bool / vacío) set_cell
Guardar a disco save
Guardar en bytes save_to_bytes

replace_text devuelve 0 en XLSX (allí no hay elementos <w:t> o <a:t>); para hojas de cálculo usa set_cell.

Abrir, editar, guardar

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");

Guardar en bytes (para upload / streaming)

Python

with EditableDocument.open("template.docx") as ed:
    ed.replace_text("{{name}}", "Alice")
    bytes_out = ed.save_to_bytes()
    # sube bytes_out a S3 / envíalo por 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

Qué significa realmente “preservar partes OPC”

Los archivos OOXML son archivos ZIP que contienen decenas de partes XML más partes binarias (imágenes, fuentes, objetos incrustados). Los editores ingenuos reserialian cada parte al guardar, lo que puede:

  • Reordenar las relaciones y romper enlaces
  • Descartar partes de extensión que el editor no entiende (custom XML, fallbacks de AlternateContent)
  • Reformatear el XML de modos que rompen diffs downstream y firmas

EditableDocument reescribe solo las partes que tocaste. El resto se copia byte a byte. El resultado es el diff más pequeño posible entre entrada y salida — más amigable a control de versiones, verificación de firma y round-trip por otras herramientas.

Cuándo usar la API específica del formato

EditableDocument cubre el 80% de casos (plantillas, fill-in masivo, escrituras de celda). Para ediciones más ricas — añadir párrafos, insertar tablas, ajustar estilos, construir diapositivas desde cero — entra a las APIs específicas del formato:

use office_oxide::docx::edit::DocxEditor;

let mut docx = DocxEditor::open("report.docx")?;
docx.append_paragraph("Nueva sección", Some("Heading2"));
docx.save("report.docx")?;

Los editores específicos por formato están documentados en la referencia de cada binding (Rust: docx::edit, xlsx::edit, pptx::edit).

Véase también