把旧版 DOC、XLS、PPT 转成 OOXML
Office Oxide 是唯一一个既能读 Word 97–2003(.doc)、Excel 97–2003(.xls)、PowerPoint 97–2003(.ppt)又能写出对应现代 OOXML 的 Rust 或 Python 库 — 不依赖 JVM(Apache Tika)、外部转换器(LibreOffice headless)或商业许可(Aspose)。
save_as 一次调用就完成转换。打开旧版文件,用现代扩展名保存它;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'
往返中能保留什么
Office Oxide 保留 内容形态 — 段落、表格、单元格、幻灯片、列表、标题 — 以及其中的值。有几类没法跨过去,因为旧版格式把它们藏在 IR 不建模的私有结构里:
| 类别 | 是否保留 | 备注 |
|---|---|---|
| 段落文本 | ✓ | 含粗体/斜体/下划线 run |
| 列表 | ✓ | 有序 + 无序 |
| 表格 | ✓ | 单元格、行序、表头行 |
| XLSX 单元格值(字符串、数字、布尔) | ✓ | — |
| 工作表名 | ✓ | — |
| 幻灯片标题 + 正文 | ✓ | — |
| 超链接 | ✓ | — |
| 图片 | 部分 | DOC/PPT 保留内联图片;XLS 的图片锚点会丢 |
| 评论 / 修订 | — | 修订记录会被合并 |
| 公式(XLS) | 仅值 | 缓存的公式结果会保留;公式表达式不往返 |
| WordArt、SmartArt、图表 | — | 需要的话在目标格式里重新渲染 |
| 加密 | — | 先把旧版文件解密(例如经 LibreOffice) |
对绝大多数 LLM、索引和归档场景来说,内容级别的还原度才是关键 — Office Oxide 用毫秒级返回一个完全可编辑的 DOCX/XLSX/PPTX。
性能
单文件转换与文本提取处于同一数量级。典型 Word 97 .doc 端到端预计 个位数毫秒。
相关链接
- 性能基准 — DOC/XLS/PPT 提取数据
- 从 IR 构建 —
save_as底层做了什么 - 从 python-docx 迁移 — 从按格式的 Python 库切换过来