Конвертація legacy DOC, XLS, PPT у OOXML
Office Oxide — єдина бібліотека на Rust або Python, що читає Word 97–2003 (.doc), Excel 97–2003 (.xls), PowerPoint 97–2003 (.ppt) і пише їхні сучасні OOXML-аналоги — без JVM (Apache Tika), без зовнішнього конвертера (LibreOffice headless), без комерційної ліцензії (Aspose).
save_as робить конвертацію одним викликом. Відкрийте legacy-файл, збережіть із сучасним розширенням; Office Oxide прожене його через IR і запише свіжий OOXML-контейнер.
Однорядковий
Rust
use office_oxide::Document;
Document::open("old.doc")?.save_as("modern.docx")?;
Document::open("old.xls")?.save_as("modern.xlsx")?;
Document::open("old.ppt")?.save_as("modern.pptx")?;
Python
from office_oxide import Document
with Document.open("old.doc") as doc:
doc.save_as("modern.docx")
with Document.open("old.xls") as doc:
doc.save_as("modern.xlsx")
with Document.open("old.ppt") as doc:
doc.save_as("modern.pptx")
JavaScript
import { Document } from 'office-oxide';
using doc = Document.open('old.xls');
doc.saveAs('modern.xlsx');
Go
doc, _ := officeoxide.Open("old.xls")
defer doc.Close()
doc.SaveAs("modern.xlsx")
C#
using var doc = Document.Open("old.xls");
doc.SaveAs("modern.xlsx");
Масова міграція
Мігруйте корпус одним рядком.
Python
from pathlib import Path
from office_oxide import Document
for src in Path("legacy").rglob("*"):
if src.suffix.lower() in {".doc", ".xls", ".ppt"}:
new_ext = {".doc": ".docx", ".xls": ".xlsx", ".ppt": ".pptx"}[src.suffix.lower()]
dst = Path("modern") / src.relative_to("legacy").with_suffix(new_ext)
dst.parent.mkdir(parents=True, exist_ok=True)
with Document.open(src) as doc:
doc.save_as(dst)
print(f"{src} → {dst}")
Rust
use office_oxide::Document;
use std::path::Path;
fn migrate(src: &Path, dst: &Path) -> office_oxide::Result<()> {
Document::open(src)?.save_as(dst)?;
Ok(())
}
Загорніть цикл у rayon для паралельної міграції великих корпусів.
Shell — через CLI
find legacy/ -iname '*.doc' | parallel \
'office-oxide convert {} modern/{/.}.docx'
find legacy/ -iname '*.xls' | parallel \
'office-oxide convert {} modern/{/.}.xlsx'
find legacy/ -iname '*.ppt' | parallel \
'office-oxide convert {} modern/{/.}.pptx'
Що переживає round-trip
Office Oxide зберігає форму контенту — абзаци, таблиці, клітинки, слайди, списки, заголовки — та значення всередині. Кілька категорій не переїжджають, бо legacy-формати кодують їх у пропрієтарних структурах, яких IR не моделює:
| Категорія | Переживає | Примітки |
|---|---|---|
| Текст абзаців | ✓ | Включно з bold/italic/underline-run |
| Списки | ✓ | Нумеровані + марковані |
| Таблиці | ✓ | Клітинки, порядок рядків, рядок-заголовок |
| Значення клітинок XLSX (string, number, bool) | ✓ | — |
| Імена листів | ✓ | — |
| Заголовки слайдів + body | ✓ | — |
| Гіперпосилання | ✓ | — |
| Зображення | partial | DOC/PPT зберігають inline-картинки; XLS-image-якорі відкидаються |
| Коментарі / ревізії | — | Tracked changes сплющуються |
| Формули (XLS) | лише значення | Кешовані результати формул переживають; вирази формул не round-trip’аться |
| WordArt, SmartArt, діаграми | — | Перерендеріть у цільовому форматі за потреби |
| Шифрування | — | Розшифруйте legacy-файл заздалегідь (наприклад, через LibreOffice) |
Для більшості LLM-, індексаційних та архівних кейсів важлива саме content-level fidelity — а Office Oxide віддає повністю редагований DOCX/XLSX/PPTX за мілісекунди.
Продуктивність
Per-file конвертація йде в тому ж порядку, що й видобування тексту. На типовому Word 97 .doc очікуйте однозначних мілісекунд end-to-end.
Дивіться також
- Бенчмарки продуктивності — числа видобування DOC/XLS/PPT
- Збірка з IR — що
save_asробить під капотом - Перехід з python-docx — перехід із форматно-специфічної Python-бібліотеки