aardio 文档

原生结构化查询

需要 fsys.openXml 0.15.0+。不依赖 Office、ACE/OLEDB;不解析 SQL、不调用 eval、不执行用户回调。只处理保存值及公式缓存,不重新计算。

筛选、投影、排序和汇总

import fsys.openXml.xlsx;
var result,err = fsys.openXml.xlsx.querySheet("/input.xlsx",1,{
    range = "B3:M8";             // 第一行明确用作标题
    columns = ["Name","Number"];
    where = {column="Number";op="ge";value=0};
    orderBy = [{column="Number";descending=true}];
    offset = 0;
    limit = 20;                  // 结果上限,不是扫描上限
    maxScanRows = 10000;
    maxScanCells = 200000;
    aggregates = [{name="total";op="sum";column="Number"}];
});
if(!result) return null,err;
return result;

参数2的工作表定位规则同 readSheet。不指定 range 时使用实际已存储格边界,不信任 dimension。指定 range 时保留矩形的空边界。标题行可为任意内容,因此有封面/大标题时应显式选数据区域,不能依赖自动猜表头。

列与结果

条件语法

叶子为 {column,op,value};支持以下 op:

op 规则
eq / ne 全等/不全等,不进行类型转换;value省略可与null比较
gt/ge/lt/le 同类型 number/string 才比较;数值与数字文本不互转
contains 大小写敏感的字面包含,只用于字符串;不是正则;空 value 匹配所有字符串(含空串)
in value 必须为不超过10000项的标量数组,逐项全等
isNull 缺格、缺值或无缓存公式;不包括空串/0/false
isEmpty 只匹配存在的空字符串

组合为 {all=[条件...]} 或 {any=[条件...]},可嵌套;一个节点不能同时有 all/any。空 all 为真、空 any 为假。最多256节点/16层;不支持条件代码字符串或函数。数组须稠密且没有附加哈希字段。

import fsys.openXml.xlsx;
var result,err = fsys.openXml.xlsx.querySheet("/input.xlsx",1,{
    range="B3:M8";
    where={all=[
        {column="Flag";op="eq";value=false},
        {any=[
            {column="Code";op="eq";value="00123"},
            {column="Empty";op="isEmpty"}
        ]}
    ]};
});
if(!result) return null,err;
return result;

错误单元格的查询值是原始错误字符串,如 #N/A;不会作为缺值处理。需要区分错误类型与同文本普通字符串时使用 findCells 的返回项 valueType 检查。共享公式正文不展开。

排序

orderBy=[{column=...,descending=false,nulls="last"},...],最多64个键:

简单汇总

aggregates=[{name="唯一名称",op="count/sum/min/max/average",column=...}],最多128项。

限额与完整性

选项 默认 上限/含义
maxScanRows 100000 最高1048576,按选区数据坐标行计,标题行除外
maxScanCells 1000000 最高10000000,每个扫描行按选区完整宽度计成本;不扫描半行
offset 0 跳过匹配结果数,最高1048576
limit 100 返回结果行上限,最高1000000;0仅统计,不返回行
maxResultCells 1000000 最高10000000,返回行数×投影宽度超限则失败;正整数

扫描限额0表示不扫描。即使跳过空行/隐藏行,也计算扫描成本。offset/limit不影响匹配总数或聚合;maxScanRows/maxScanCells会影响。为避免误解,查询拒绝 maxRows/maxColumns 及起点 row/column,请使用 range 和上述扫描/结果限额。

返回信息:

扫描数量为0或矩形为空时 scannedRange=null。即使没有行匹配,scanTruncated仍必须检查。不要把扫描前100行所得的sum/average称为整张表统计。

可见行列

visibleOnly=true:仅使用保存的工作表/行/列隐藏标记,不重新执行自动筛选条件。隐藏行、隐藏页不产生匹配;默认投影排除隐藏列;显式在投影/条件/排序/汇总中访问隐藏列会报错。合并格仍不填充。

按单元格查找

import fsys.openXml.xlsx;
var result,err = fsys.openXml.xlsx.findCells("/input.xlsx",1,{
    range="B3:M8";
    target="formula";
    op="contains";
    value="C4";
    maxScanCells=10000;
    limit=20;
});
if(!result) return null,err;
return result;

所有新入口失败返回 null,err。通用 ZIP/XML 安全限额照常生效。此版本使用 DOM;扫描限额约束查询处理与结果,不避免解析整张工作表或保留选区的稀疏cells。查询不同时构造完整值矩阵,但不能据此承诺百万行流式能力。

Markdown 格式