# 跨表引用
1. 单元格的表示方法
  内部表示: 
     普通单元格 `{{id${cellId}}}`
     跨表公式 `{{id${sheetId}!${cellId}}}`
     ( 将cellId 与 sheetId 代入试试)
  给客户看的 + 客户手工输入的公式: 
     普通单元格: A1       <== 第A列, 第1行
     跨表单元格: CB1!A1   <== (code=CB1)的sheet 的 第A列, 第1行

2. 如何设置
注意组件属性里, 有一个formulaConfig
  对于建工成本项目, 需要这样设置: 
  formulaConfig = {
    userFormula: 'byPosition',   // 表示按A1这样的风格
    // 获取外部单元格
    getExternalCell: (sheetId: ID, cellId: ID) => ICell;
    // sheetId => sheetCode
    getSheetCodeById: (id: ID) => string;
    // sheetCode => sheetId
    getSheetIdByCode: (code: string) => ID;
    // cellId => cellLabel ('A1'之类,  不含sheetCode)
    getExternalCellLabelById: (sheetId: ID, cellId: ID) => string;
    /// cellCode => cellId (不含sheetId)
    getExternalCellIdByLabel: (sheetCode: string, cellLabel: string) => ID;
  }

3. 提请注意的事项
比如 CB2表, 需要依赖 CB1表, 那么你应该在加载 CB2表的同时,  加载CB1表 
       只有当 两个表都加载成功, loaded=true, 此时再实例化组件
       render() {
         if (loaded) {
           return <SpreadSheet ....>
         } 
         return "加载中..."
       }

# 如何同时支持 同一个sheet中同时存在 flatten 与 tree ?
反推: 
1. flatten与tree的唯一区别, 是计算时, tree具有subChildren/sumSibling公式
  (注意在增删行时, 仍应考虑全部row, 所以增删行本身不受影响)
2. 什么时候需要用公式计算? ( 也就是可能受影响的地方 )
2.1 全部重算 ( 全部计算 ): 直接用state.treeContext
2.2 单元格修改引起的自动重算 ( 优化计算 ): 直接用state.treeContext
2.3 增删行引起的自动重算 ( 优化计算 ): 用增删行后的newTreeContext, 注意infer过程推断受影响的单元格是否正确
这些计算的 [ 发生过程 ] , 应保证用到了正确的treeContext

3. 如何保证Store中的treeContext始终正确?
3.1 初始化时, 确保treeContext只包含tree部分
3.2 增删行时, 确保treeContext只包含tree部分

附加: 
1. 计算sumSibing/sumChildren, 只需依赖treeContext
2. 之前的问题是: treeContext是针对所有行的, 只需让treeContext反应type='body'&&area='tree'的行

# 有多种需要公式计算的场景
先下结论: 
当计算`a5+a6`时, 总是假定`a5`/`a6`已计算好, `getCellValue`直接取值, 不用递归计算

## 场景1: 当在单元格内键入公式并回车时
此时, 应假定: 别的单元格稳定
分为两步: 试算 和 确定:
### 试算
例如你是在对话框里键入公式, 还未点确定, 想预览一下值
只需 cell.formula ? parse(cell.formula) :cell.value 即可
显然, 可以保证 当计算 `a5+a6`时 , `a5`与`a6`已经算好了

### 确定
先试算
再根据当前单元格的值, 自动推算受影响的单元格

## 场景2: 当第一次加载时
分两步: 
### 直接显示上一次的value
 这一步的假设是: 之前的计算结果ok

### 用户点击 " 全部重算 " 
将全部单元格组织为 有向无环图, 并按顺序启动重算
所以, 也可以保证 当计算 `a5+a6`时 , `a5`与`a6`已经算好了
