import { IStoreState, ID, ICell, ICellNN } from '../../index.data'; import Parser from '../../formula-parser/parser'; import { ParsedResult } from '../../formula-parser/data'; export interface IFormulaRef_RelativePosition { [cellId: string]: { di: number; dj: number; }; } /** * A5 => true */ export declare function isCellLabel(s: string): boolean; /** * {{id123}} => true */ export declare function isCellIdBraced(s: string): boolean; /** * A1 => {i:0, j:0} */ export declare function getIJByLabel(s: string): { i: number; j: number; }; /** * A1 => cell */ export declare function getCellByLabel(state: IStoreState, s: string): ICell; /** * {{id123}} => 123 */ export declare function extractIdFromBracedIdStr(s: string): ID; /** * {{id123}} => cell */ export declare function getCellByBracedId(state: IStoreState, s: string): ICell; /** * 通过cellId获取cell的值 * `parser` 主要用于测试 * 返回 {result, error, deps} */ export declare function evalCellValue(state: IStoreState, cell: ICell, parser: Parser): ParsedResult; /** * 通过字符串获取单元格, 通常用于公式, 暂时未使用 * 例: * A1 => cell * {{id333}} => cell */ export declare function getCellByStr(state: IStoreState, sCell: string): ICell; /** * 通过字符串获取单元格id, 性能高, 同上. * 例: * A1 => 'A1' * {{id333}} => 333 * {{id333!33}} => '333!33' */ export declare function getCellIdByStr(state: IStoreState, sCell: string, options?: { getSheetIdByCode: (code: string) => ID; getExternalCellIdByLabel: (sheetCode: string, cellLabel: string) => ID; }): string | number | null; /** * 对外接口 * 使用场景: 一次性, 例如 用户输入某个单元格, 立即求值 * 基本假定: 依赖已全部计算完成 * 不适用: 全部重算场景 ( 依赖可能未计算 ) * 通过sCell获取cell的值 */ /** * @param cellId 要计算的单元格 * @param skipLevel 上溯级别 * A * A1 * A11 * A12 * A2 * A21 * A22 * B * B1 * B11 * B12 * B2 * B21 * B22 * * 如上,对B21,sumByPosition(B21, 1), 表示 sum(B11) * 对于B21, sumByPosition(B21, 2), 表示 sum(B11, A21, A11) * @param getCellValue 如何获取依赖cell的值? 如果不传, 则就地取cell.value, 如果传此参数则执行之(重算) */ export declare function sumSamePosition(state: IStoreState, cellId: ID, skipLevel?: number, getCellValue?: (cellID: ID) => any): { result: number; error: any; deps: any; }; /** * 对外接口 * 取 同列 + 同级 cell的和 * 例: 估算表最后一行的总计 * @param state * @param cellId 要计算的单元格 * @param getCellValue 如何获取依赖cell的值? 如果不传, 则就地取cell.value, 如果传此参数则执行之(重算) * 使用getCellValue的场景: 整体重算recalculate */ export declare function sumSiblings(state: IStoreState, cellId: ID, getCellValue?: (cellID: ID) => any): ParsedResult; /** * 对外接口 * 取下级cell之和 * 例: 估算表中, 工程费用的中父项 等于 子项之和 * @param state * @param cellId 要计算的单元格 * @param getCellValue 如何获取依赖cell的值? 如果不传, 则就地取cell.value, 如果传此参数则执行之(重算) * 使用getCellValue的场景: 整体重算recalculate */ export declare function sumChildren(state: IStoreState, cellId: ID, getCellValue?: (cellID: ID) => any): ParsedResult; /** * 对外接口 * 取左侧cell之和 * 例: 估算表中, 合计 = 人+ 材+ 机+其它 * @param state * @param cellId 要计算的单元格 * @param num 向左起计算多少单元格, 若为null 或 undefined 则表示全部 * @param interval 间隔多少个(如当前为0, 计算右侧3,6,9, 则取3) * @param getCellValue 如何获取依赖cell的值? 如果不传, 则就地取cell.value, 如果传此参数则执行之(重算) * 使用getCellValue的场景: 整体重算recalculate */ export declare function sumLeft(state: IStoreState, cellId: ID, num: number | null | undefined, interval: number | undefined, getCellValue?: (cellID: ID) => any): ParsedResult; export declare function sumRight(state: IStoreState, cellId: ID, num: number | null | undefined, interval: number | undefined, getCellValue?: (cellID: ID) => any): ParsedResult; export declare function sumCells(cells: ICell[], getCellValue?: (cellID: ID) => any): { result: number; error: string; deps: { cells?: undefined; }; } | { result: number; error: null; deps: { cells: ID[]; }; }; export declare function getLabelByIj(i: number, j: number): string; export declare function getLabelByJ(j: number): string; /** * delay: 可能暂时用不上!!!! * 对外接口 * 通过cellRange获取数组值 ( 二维数组 ) * a1:a2=>[[1,2]] * a1:b2=>[[1,2], [3,4]] * {{id_1}}:{{id_2}}=>[[1,2], [3,4]] */ export declare function getRangeValue(state: IStoreState, startCellId?: ID | null, endCellId?: ID | null, getCellValue?: (cellID: ID) => any): ParsedResult; /** * 获取当前cell公式里引用的单元格的相对位置 * 暂未考虑绝对引用 * 例: * A1 A2 A3 * 其中, A3.formula='A1'+'A2'+'Sheet!A1' * 调用此方法将得到: {A1: {x:-2, y:0}, A2: {x:-1, y:0}} * ( 忽略外部公式 ) * @param state: 老的state ( 插入/插列前 ) * @param cellId */ export declare function getCellRelativeRefs(state: IStoreState, cellId: ID): IFormulaRef_RelativePosition; export declare function getMultipleCellsRelativeRefs(state: IStoreState, cellIds: ID[]): Record; /** * 通过上面计算得到的 {A1: {x:-2, y:0}, A2: {x:-1, y:0}} * 以及A3.formula='A1'+'A2'+'Sheet!A1' * 计算新的cellId对应的位置 * 比如, 复制出来的单元格为 B3, 左侧分别是B1和B2: * B1 B2 B3 * 则B3.formula将变成'B1'+'B2'+'Sheet!A1' * @param state: 已经插入行/列的state * @param cellId: 刚插入的cell ( 注意此时cell.formula还是旧的) * @param refMaps: 注意map里的cellId是公式里的cellId. cell.formula里引用的老的cellId, 其di/dj是多少, 利用di/dj找到新的cellId并替换老的 */ export declare function realizeFormulaByRelativeRefs(state: IStoreState, cellId: ID, refMaps: IFormulaRef_RelativePosition, _martrixCache?: ICell[][]): string | undefined; /** * 批量修改cells里的formula * 依据是 cells里, 每个cell在cellsRefMaps里, 能找到 每个cell引用的refCellId, 从而找到di/dj, 从而找到新refCellId * @param state: 插行/列后的新state * @param cellIds: 单元格 * @param cells2RefMaps: 上述每个cell, 对应的formula里的每个refCellId, 其di/dj是多少 * @param _martrixCache * @return cells: 已修改formula的新cell */ export declare function realizeFormulaByRElativeRefs_multipleCells(state: IStoreState, cellIds: ID[], cell2RefMaps: ReturnType, _martrixCache?: ICell[][]): ICell[]; /** * 当发生插行/插列操作后, 新插入的行/列的单元格, 其公式引用与源单元格是相同的, 需要修正 * 调用本方法后, 公式将根据相对位置修正 * @param stateBefore: 发生插列/插行之前的state * @param stateAfter: 发生插列/插行之后的state * @param newCell2BaseCell baseCell是指被复制的源格, newCell是根据baseCell创建的新格 * @return 新的修改过formula的cells */ export declare function updateFormula(stateBefore: IStoreState, stateAfter: IStoreState, baseCell2newCell_: Record): ICellNN[]; export declare function toFormulaId(id: any): string;