aardio 文档

Word 结构化原生生成

fsys.openXml.docx.builder 将普通 aardio 内容模型生成可编辑的 DOCX。它不解析 HTML,不调用 Office、MSXML 或 .NET;通过公共 fsys.openXml.writer 写包、检查写入结果并原子提交。

适合程序组织报告、段落、编号和简单表格。Markdown 仍使用 string.markdown.toDocx:Markdown → 有限 HTML → 本生成器。不是完整 Word 排版引擎,也不是已有 Word 文档的编辑器。

最小示例

import fsys.openXml.docx.builder;
var document = {
    blocks = [
        {style="Heading1";text="工作报告"},
        {runs=[{text="结论:";bold=true},{text="正文与格式分开组织。"}]},
        {kind="table";rows=[["项目","数值"],["计数",0],["完成",false]]}
    ]
};
var path,err,report = fsys.openXml.docx.builder.write("/report.docx",document,{
    title = "工作报告";
    author = "aardio";
});
if(!path) return null,err;
return path,report;

document 只包含 blocks 和可选的 numbering。内容数组必须连续,空数组使用 [],不要用 null 作为占位元素。未知内容字段、未知块/运行类型、无效编号/书签引用会返回错误,不静默丢弃。

段落与文字

blocks 的普通字符串、数值、布尔值简写为一个段落;表对象省略 kind 时也表示段落。显式写法为 {kind="paragraph";...}。

字段 含义
text / runs 二选一。text 是字符串/数值/布尔值;runs 是格式化片段数组。未指定时为空段落
style Normal、Heading1…Heading6、CodeBlock。标题是带大纲级别的真实 Word 样式
align left、center、right、justify(兼容 Word 的 both)
left/hanging 左缩进/悬挂量,非负整数,单位 twips
spaceBefore/spaceAfter 段前/段后间距,twips;0 保留
lineSpacing 自动行距倍数
keepNext/keepLines 与下段同页/段中不分页,布尔值
quote/rule 简单左侧引用线/底部分隔线,使用公共边框颜色;同时设置时采用底线
numId 引用 document.numbering 的 1 基索引;不是直接填写显示的编号
list 无编号续段的紧凑段后间距;编号段落也自动采用紧凑间距

文字中的空格原样保留,不经过 HTML 实体解码。一个 text 内的 CRLF、LF、CR 转为软换行,TAB 转为制表符;要生成多个段落,使用多个 blocks。

0、false、空字符串分别生成 0、false 和空文字。XML 1.0 禁止的控制字符及 U+FFFE/U+FFFF 替换为 U+FFFD;非法 UTF-8 返回错误。标题和作者沿用 XML 文本的换行归一化规则。

格式化运行

import fsys.openXml.docx.builder;
var document = {blocks=[
    {runs=[
        {text="普通 "},
        {text="加粗";bold=true;color=0x0969DA},
        {text=" 标记";background=0xFFF8C5},
        {kind="tab"},
        {text="下一列"},
        {kind="break"},
        {text="软换行后的文字"}
    ]},
    {runs=[{kind="break";breakType="page"}]},
    {style="Heading1";text="新的一页"}
]};
return fsys.openXml.docx.builder.buildParts(document);

运行的 kind 默认为 text,另支持 tab、break、bookmark。breakType 默认为 line,也可为 page;不分页计算,只写入显式分页符。

文字运行可设置:

编号、书签与超链接

import fsys.openXml.docx.builder;
var document = {
    numbering = [
        {kind="decimal";start=3;left=480},
        {kind="bullet";marker="•";left=960}
    ];
    blocks = [
        {style="Heading1";runs=[{kind="bookmark";name="Intro";id=1},{text="目录目标"}]},
        {text="第三步";numId=1},
        {text="第四步";numId=1},
        {text="子项";numId=2},
        {runs=[
            {text="返回标题";hyperlink={anchor="Intro"}},
            {text=" aardio";hyperlink="https://www.aardio.com/"}
        ]}
    ]
};
return fsys.openXml.docx.builder.buildParts(document);

表格

import fsys.openXml.docx.builder;
var document = {blocks=[{
    kind="table";
    widths=[3000,5000];
    cellMargins={left=120;right=120;top=80;bottom=80};
    rows=[
        {header=true;cells=[
            {background=0xF6F8FA;blocks=[{runs=[{text="项目";bold=true}]}]},
            {background=0xF6F8FA;blocks=[{runs=[{text="说明";bold=true}]}]}
        ]},
        ["数值",0],
        ["状态",false],
        ["详情",{blocks=[{text="第一段"},{text="第二段";align="right"}]}]
    ]
}]};
return fsys.openXml.docx.builder.buildParts(document);

公共选项与保存

defaults 可修改,但与 string.html.toDocx 的默认表独立;后者与 string.markdown.toDocx 仍共用同一个表。

边界

当前只生成一个正文节、预定义样式与上述内容。没有页眉页脚、图片嵌入、跨格合并、浮动图形、修订、自动目录、公式/域计算、字体嵌入或既有 DOCX 编辑。内容模型拒绝这些未支持字段;不会通过 altChunk 把 HTML 留给 Word 临时转换。

report 包含 paragraphCount、tableCount、listCount、warnings。段落统计包括内核自动补充的必需空段落,listCount 是编号定义数,warnings 当前为空;不是页数/分页预检。HTML 包装继续返回它原来的计数和降级报告,不混用两种统计口径。

文档嵌套最多 128 层,内容节点最多 200000;这不是完整的解析内存上限。实际字体、换行和分页由阅读软件决定。需要修改已有文档或高保真渲染时,可继续使用 Office/WPS COM。

Markdown 格式