Skip to content

把旧版 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 端到端预计 个位数毫秒

相关链接