Конвертация 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-runs |
| Списки | ✓ | Нумерованные + маркированные |
| Таблицы | ✓ | Ячейки, порядок строк, шапка |
| Значения ячеек XLSX (string, number, bool) | ✓ | — |
| Имена листов | ✓ | — |
| Заголовки слайдов + body | ✓ | — |
| Гиперссылки | ✓ | — |
| Изображения | partial | DOC/PPT сохраняют inline-картинки; XLS-image-якоря дропаются |
| Комментарии / ревизии | — | Tracked changes сплющиваются |
| Формулы (XLS) | только значения | Кешированные результаты переживают; выражения формул — нет |
| WordArt, SmartArt, диаграммы | — | Если нужны — рендерите в целевом формате заново |
| Шифрование | — | Дешифруйте legacy-файл заранее (например, через LibreOffice) |
Для большинства LLM, индексирования и архивных кейсов важна именно content-level fidelity — а Office Oxide отдаёт полностью редактируемый DOCX/XLSX/PPTX за миллисекунды.
Производительность
Конвертация на файл идёт в том же порядке, что и извлечение текста. На типичной Word 97 .doc ожидайте однозначные миллисекунды end-to-end.
Смотрите также
- Бенчмарки производительности — числа извлечения DOC/XLS/PPT
- Сборка из IR — что
save_asделает под капотом - Переход с python-docx — переход с формат-специфичной Python-библиотеки