CORE

@office-open/core

共享 OOXML 基础设施 — 描述符系统、验证器、转换器、图表和 SmartArt

@office-open/core@office-open/docx@office-open/pptx@office-open/xlsx 的共享基础设施层。通常无需直接安装——但如果你需要构建自定义 OOXML 元素或扩展库,它提供了所有构建模块。

模块概览

描述符系统

核心描述符系统提供 TypeScript Options 对象与 XML 之间的声明式双向映射。同一个描述符同时驱动序列化(Options → XML 字符串)和解析(Element → Options)。

import type { CustomDescriptor } from "@office-open/core";

所有描述符都是 CustomDescriptor<T> —— 手写 stringify()parse() 方法的自定义描述符:

const myPartDesc: CustomDescriptor<MyOptions> = {
  kind: "custom",
  stringify(value, ctx) {
    /* ...生成 XML 字符串... */
  },
  parse(el, ctx) {
    /* ...从 XML 元素读取为 options... */
  },
};

运行时函数 stringify()parse() 执行实际转换:

// 序列化:Options → XML 字符串
const xml = stringify(spacingDesc, { before: 240, after: 120 }, ctx);
// <w:spacing w:before="240" w:after="120"/>

// 解析:Element → Partial<Options>
const opts = parse(spacingDesc, element, ctx);
// { before: 240, after: 120 }

值与验证

OOXML 规范值类型的运行时验证函数:

函数说明
decimalNumber(val)验证并向下取整
hexColorValue(val)验证十六进制颜色
twipsMeasureValue(val)TWIP 测量值
hpsMeasureValue(val)半磅测量值(字号)
percentageValue(val)标准化百分比字符串

单位转换器

import {
  convertMillimetersToTwip,
  convertInchesToTwip,
  convertPixelsToEmu,
  convertEmuToPixels,
  convertPointsToEmu,
} from "@office-open/core";

convertMillimetersToTwip(25.4); // 1440 (1 英寸)
convertPixelsToEmu(100); // 952500
convertPointsToEmu(12); // 152400

图表与 SmartArt

@office-open/docx@office-open/pptx 共享的图表描述符(BarChart、LineChart、PieChart、AreaChart、ScatterChart)和 SmartArt 组件。图表 XML 生成和解析均通过描述符驱动。

DrawingML

颜色、填充、轮廓、效果和几何形状的共享基元。

密码哈希

所有包都支持用于文档保护的明文 password 字段。核心加密模块实现了 ECMA-376 Agile Encryption(SHA-512):

import { derivePasswordHash } from "@office-open/core";

// 自动生成 hashValue、saltValue、spinCount、algorithmName
const derived = derivePasswordHash("secret");
// { hashValue: "...", saltValue: "...", spinCount: 100000, algorithmName: "SHA-512" }

DOCX 文档保护、PPTX 修改验证和 XLSX 工作表/工作簿保护在提供 password 字段时内部使用此模块。

该模块还导出 randomBytes(length) 用于生成密码学安全的随机字节,以及 hashPasswordAgile(password, salt, spinCount) 用于直接计算 ECMA-376 Agile Encryption 哈希。

编译与打包

generateDocument()generatePresentation()generateWorkbook() 内部使用的共享 ZIP 编译工具。通常你直接调用各格式包的顶层生成函数,而非直接使用 core:

import { generateDocument } from "@office-open/docx";
import { generatePresentation } from "@office-open/pptx";
import { generateWorkbook } from "@office-open/xlsx";

// 异步 — 默认返回 Buffer(Node.js)或 Blob(浏览器)
const buffer = await generateDocument(docOptions);
const blob = await generateDocument(docOptions, { type: "blob" });

// 也有同步变体
const buf = generateWorkbook(xlsxOptions);

异步方法使用 Web Worker 实现非阻塞 DEFLATE。同步方法会阻塞主线程,但避免了 Worker 开销。压缩策略与 Microsoft Office 一致:XML 条目使用 DEFLATE(级别 1,SuperFast);媒体按类型区分——已压缩格式(JPEG、PNG、GIF)使用 STORE,其余(EMF/WMF/BMP/TIFF)使用 DEFLATE 级别 1。

Copyright © 2026