Criar documentos a partir do IR
create_from_ir escreve um DOCX, XLSX ou PPTX novinho a partir de um DocumentIR — o mesmo schema estruturado que você obtém com to_ir(). Um IR, três formatos-alvo. O IR é o destino natural de conteúdo gerado por LLM: faça o modelo produzir JSON estruturado e materialize o formato Office certo sob demanda.
Construir e gravar
Rust
use office_oxide::{DocumentFormat};
use office_oxide::create::create_from_ir;
use office_oxide::ir::{DocumentIR, Section, Element, Run};
let ir = DocumentIR {
sections: vec![Section {
title: Some("Relatório Trimestral".into()),
elements: vec![
Element::Heading { level: 1, text: "Destaques".into() },
Element::Paragraph { runs: vec![Run::plain("Receita cresceu 18%.")] },
Element::Table {
rows: vec![
vec!["Região".into(), "Receita".into()],
vec!["NA".into(), "$1.2M".into()],
vec!["EU".into(), "$820K".into()],
],
},
],
}],
};
create_from_ir(&ir, DocumentFormat::Docx, "report.docx")?;
Trocando o formato-alvo, a partir do mesmo IR você pega XLSX ou PPTX:
create_from_ir(&ir, DocumentFormat::Xlsx, "report.xlsx")?;
create_from_ir(&ir, DocumentFormat::Pptx, "report.pptx")?;
Python
from office_oxide import create_from_ir
ir = {
"sections": [{
"title": "Relatório Trimestral",
"elements": [
{"kind": "Heading", "level": 1, "text": "Destaques"},
{"kind": "Paragraph", "runs": [{"text": "Receita cresceu 18%."}]},
{"kind": "Table", "rows": [
["Região", "Receita"],
["NA", "$1.2M"],
["EU", "$820K"],
]},
],
}],
}
create_from_ir(ir, "docx", "report.docx")
create_from_ir(ir, "xlsx", "report.xlsx")
create_from_ir(ir, "pptx", "report.pptx")
JavaScript
import { createFromIr } from 'office-oxide';
const ir = {
sections: [{
title: 'Relatório Trimestral',
elements: [
{ kind: 'Heading', level: 1, text: 'Destaques' },
{ kind: 'Paragraph', runs: [{ text: 'Receita cresceu 18%.' }] },
{ kind: 'Table', rows: [
['Região', 'Receita'],
['NA', '$1.2M'],
['EU', '$820K'],
]},
],
}],
};
createFromIr(ir, 'docx', 'report.docx');
createFromIr(ir, 'xlsx', 'report.xlsx');
createFromIr(ir, 'pptx', 'report.pptx');
Go
Go recebe o IR como payload JSON:
import (
"encoding/json"
officeoxide "github.com/yfedoseev/office_oxide/go"
)
ir := map[string]any{
"sections": []any{
map[string]any{
"title": "Relatório Trimestral",
"elements": []any{
map[string]any{"kind": "Heading", "level": 1, "text": "Destaques"},
map[string]any{"kind": "Paragraph", "runs": []any{map[string]any{"text": "Receita cresceu 18%."}}},
map[string]any{"kind": "Table", "rows": [][]string{
{"Região", "Receita"},
{"NA", "$1.2M"},
{"EU", "$820K"},
}},
},
},
},
}
payload, _ := json.Marshal(ir)
officeoxide.CreateFromIR(string(payload), "docx", "report.docx")
officeoxide.CreateFromIR(string(payload), "xlsx", "report.xlsx")
officeoxide.CreateFromIR(string(payload), "pptx", "report.pptx")
C#
using OfficeOxide;
using System.Text.Json;
var ir = new {
sections = new[] {
new {
title = "Relatório Trimestral",
elements = new object[] {
new { kind = "Heading", level = 1, text = "Destaques" },
new { kind = "Paragraph", runs = new[] { new { text = "Receita cresceu 18%." } } },
new { kind = "Table", rows = new[] {
new[] { "Região", "Receita" },
new[] { "NA", "$1.2M" },
new[] { "EU", "$820K" },
}},
},
},
},
};
var payload = JsonSerializer.Serialize(ir);
OfficeOxide.CreateFromIr(payload, "docx", "report.docx");
OfficeOxide.CreateFromIr(payload, "xlsx", "report.xlsx");
OfficeOxide.CreateFromIr(payload, "pptx", "report.pptx");
Como cada formato-alvo renderiza o IR
| Elemento IR | DOCX | XLSX | PPTX |
|---|---|---|---|
Section |
Quebra de seção Word | Planilha (uma section → uma planilha) | Slide |
Heading { level } |
Parágrafo com estilo Heading{level} |
Célula em negrito no topo da linha | Placeholder de título do slide |
Paragraph |
Parágrafo no corpo | Células em linhas sucessivas | Placeholder de corpo de texto |
List { ordered, items } |
Lista numerada ou com marcadores | Células na coluna A | Marcadores no corpo |
Table { rows } |
Tabela Word | Células começando na próxima linha livre | Tabela PowerPoint |
Image { filename, data } |
Imagem inline | (ignorado — XLSX precisa de coordenadas de âncora) | Imagem do slide |
O mapeamento é conservador: todo elemento IR produz uma saída determinística, mas cada formato tem features que o IR não modela (mesclagens em XLSX, animações em PPTX, threads de comentários em DOCX). Para saídas mais ricas use os builders específicos do formato.
Round-trip — ler, modificar, gravar
Combine to_ir() com create_from_ir para fazer edições estruturais que sobrevivem entre formatos:
from office_oxide import Document, create_from_ir
with Document.open("legacy.doc") as doc:
ir = doc.to_ir()
# Anexa uma nova section
ir["sections"].append({
"title": "Apêndice",
"elements": [
{"kind": "Heading", "level": 2, "text": "Termos atualizados"},
{"kind": "Paragraph", "runs": [{"text": "Vigente a partir de 2026-04-19."}]},
],
})
create_from_ir(ir, "docx", "modernized.docx")
Esse também é o jeito mais limpo de fazer conversão legado → OOXML (DOC → DOCX, XLS → XLSX, PPT → PPTX). Veja Conversão: legado → OOXML.
Por que usar o IR para criação
- Templates independentes de formato. Gere o mesmo conteúdo como DOCX (para gente do Word), XLSX (para analistas) ou PPTX (para apresentações) sem reescrever nada.
- Nativo para LLM. Faça o modelo produzir JSON no schema IR; depois materialize o arquivo. Bem mais confiável do que pedir XML do Office direto.
- Versionável (diff). O IR é JSON; commit. O arquivo Office vira um artefato de build.
Limitações
- As imagens em
Element::Imagesão gravadas quando o formato-alvo suporta imagens inline (DOCX, PPTX). XLSX precisa de coordenadas de âncora, que o IR simples não carrega — pule ou use o builder específico do formato. - Formatação de célula (formato numérico, moeda, negrito) não faz parte do IR. Adicione via editor específico após a criação.
- Gráficos, SmartArt e objetos embutidos não fazem parte do IR.
Para tudo além do que o IR consegue expressar, vá nos builders específicos de formato (docx::create::DocxBuilder, xlsx::create::XlsxBuilder, pptx::create::PptxBuilder). Eles dão acesso completo às features OOXML ao custo de serem específicos por formato.
Veja também
- IR estruturado — o schema em detalhes
- Conversão: legado → OOXML — usa
create_from_irpor baixo - Visão geral de edição — modificar arquivos existentes in-place