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
- Reemplazar texto — la API
replace_texten detalle - Establecer celdas XLSX — tipos de celda, formatos, edge cases
- Conversión — convierte DOC/XLS/PPT heredados primero