Skip to content

Editar documentos Office

EditableDocument es la contraparte read-modify-write de Document. Conserva cada parte OPC no modificada — imágenes, gráficos, estilos, temas, relaciones — tal cual, de modo que tus ediciones no redistribuyen el contenido circundante ni invalidan a los consumidores downstream.

La edición está soportada para DOCX, XLSX y PPTX. Los formatos heredados DOC, XLS y PPT son de solo lectura — conviértelos primero con save_as si necesitas editarlos.

Qué puedes hacer

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

replace_text devuelve 0 al llamarse sobre un XLSX (allí no existen elementos <w:t> ni <a:t>); usa set_cell para hojas de cálculo.

Abrir, editar, guardar

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

Guardar en 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);

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 simplistas reserializan todas las partes al guardar, lo que puede:

  • Reordenar las relaciones y romper enlaces
  • Eliminar partes de extensión que el editor no reconoce (custom XML, fallbacks de AlternateContent)
  • Reformatear el XML de maneras que corrompen diffs y firmas digitales downstream

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

Cuándo usar la API específica del formato

EditableDocument cubre el 80 % de los casos (plantillas, relleno masivo, escritura de celdas). Para ediciones más avanzadas — agregar párrafos, insertar tablas, ajustar estilos, construir diapositivas desde cero — recurre a las 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")?;

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