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
- Reemplazar texto — la API
replace_texten profundidad - Definir celdas XLSX — tipos de celda, formatos y casos límite
- Conversión — convierte los formatos heredados DOC/XLS/PPT a OOXML editable primero