Створення документів з IR
create_from_ir пише з нуля DOCX, XLSX або PPTX із DocumentIR — ту саму структуровану схему, яку ви отримуєте з to_ir(). Один IR, три цільові формати. IR — природна зливна точка для LLM-генерованого контенту: модель віддає структурований JSON, а ви на запит матеріалізуєте потрібний Office-формат.
Зібрати й записати
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("Квартальний звіт".into()),
elements: vec![
Element::Heading { level: 1, text: "Головне".into() },
Element::Paragraph { runs: vec![Run::plain("Дохід зріс на 18%.")] },
Element::Table {
rows: vec![
vec!["Регіон".into(), "Дохід".into()],
vec!["NA".into(), "$1.2M".into()],
vec!["EU".into(), "$820K".into()],
],
},
],
}],
};
create_from_ir(&ir, DocumentFormat::Docx, "report.docx")?;
Зміна цільового формату — і з того ж IR ви отримуєте XLSX чи 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": "Квартальний звіт",
"elements": [
{"kind": "Heading", "level": 1, "text": "Головне"},
{"kind": "Paragraph", "runs": [{"text": "Дохід зріс на 18%."}]},
{"kind": "Table", "rows": [
["Регіон", "Дохід"],
["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: 'Quarterly Report',
elements: [
{ kind: 'Heading', level: 1, text: 'Highlights' },
{ kind: 'Paragraph', runs: [{ text: 'Revenue grew 18%.' }] },
{ kind: 'Table', rows: [
['Region', 'Revenue'],
['NA', '$1.2M'],
['EU', '$820K'],
]},
],
}],
};
createFromIr(ir, 'docx', 'report.docx');
createFromIr(ir, 'xlsx', 'report.xlsx');
createFromIr(ir, 'pptx', 'report.pptx');
Go
Go приймає IR як JSON-навантаження:
import (
"encoding/json"
officeoxide "github.com/yfedoseev/office_oxide/go"
)
ir := map[string]any{
"sections": []any{
map[string]any{
"title": "Quarterly Report",
"elements": []any{
map[string]any{"kind": "Heading", "level": 1, "text": "Highlights"},
map[string]any{"kind": "Paragraph", "runs": []any{map[string]any{"text": "Revenue grew 18%."}}},
map[string]any{"kind": "Table", "rows": [][]string{
{"Region", "Revenue"},
{"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 = "Quarterly Report",
elements = new object[] {
new { kind = "Heading", level = 1, text = "Highlights" },
new { kind = "Paragraph", runs = new[] { new { text = "Revenue grew 18%." } } },
new { kind = "Table", rows = new[] {
new[] { "Region", "Revenue" },
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");
Як кожен цільовий формат рендерить IR
| Елемент IR | DOCX | XLSX | PPTX |
|---|---|---|---|
Section |
Розрив розділу Word | Worksheet (одна section → один лист) | Слайд |
Heading { level } |
Абзац зі стилем Heading{level} |
Жирна клітинка на початку рядка | Плейсхолдер заголовка слайду |
Paragraph |
Body-абзац | Клітинки в послідовних рядках | Плейсхолдер body-тексту |
List { ordered, items } |
Нумерований/маркований список | Клітинки в колонці A | Маркери body-тексту |
Table { rows } |
Таблиця Word | Клітинки, починаючи з наступного вільного рядка | Таблиця PowerPoint |
Image { filename, data } |
Inline-зображення | (пропускається — XLSX потребує координат якоря) | Зображення слайду |
Маппінг консервативний: кожен IR-елемент дає детермінований вивід, але в кожного формату є фічі, які IR не моделює (merges у XLSX, анімації в PPTX, треди коментарів у DOCX). За багатшим виводом — у форматно-специфічні білдери.
Round-trip — читання, модифікація, запис
Поєднання to_ir() і create_from_ir дає структурні правки, що переживають зміну формату:
from office_oxide import Document, create_from_ir
with Document.open("legacy.doc") as doc:
ir = doc.to_ir()
# Додаємо нову секцію
ir["sections"].append({
"title": "Додаток",
"elements": [
{"kind": "Heading", "level": 2, "text": "Оновлені умови"},
{"kind": "Paragraph", "runs": [{"text": "Чинні з 2026-04-19."}]},
],
})
create_from_ir(ir, "docx", "modernized.docx")
Це ж і найчистіший спосіб конвертації legacy → OOXML (DOC → DOCX, XLS → XLSX, PPT → PPTX). Дивіться Конвертація: legacy → OOXML.
Чому використовувати IR для створення
- Формат-незалежні шаблони. Згенеруйте той самий контент як DOCX (для користувачів Word), XLSX (для аналітиків) чи PPTX (для презентацій) без переписування.
- LLM-нативно. Нехай модель видає JSON за схемою IR; потім матеріалізуйте файл. Значно надійніше, ніж змушувати її віддавати Office XML напряму.
- Diffable. IR — це JSON; закомітьте. Office-файл стає артефактом збірки.
Обмеження
- Зображення в
Element::Imageзаписуються, коли цільовий формат підтримує inline-зображення (DOCX, PPTX). XLSX потребує координат якоря, яких у простому IR немає — пропустіть або використайте форматно-специфічний білдер. - Форматування клітинок (числові формати, валюта, жирний) не входить до IR. Додавайте через форматно-специфічний редактор після створення.
- Діаграми, SmartArt та embedded-об’єкти не входять до IR.
Для всього, що виходить за виразність IR, переходьте у форматно-специфічні білдери (docx::create::DocxBuilder, xlsx::create::XlsxBuilder, pptx::create::PptxBuilder). Вони дають повний доступ до фіч OOXML коштом прив’язки до формату.
Дивіться також
- Структурований IR — схема детально
- Конвертація: legacy → OOXML — під капотом використовує
create_from_ir - Огляд редагування — змінювати наявні файли in-place