#calc #logisheets

logisheets_controller

the core of LogiSheets

4 releases (2 breaking)

0.3.0 Jun 2, 2022
0.2.1 May 3, 2022
0.2.0 May 2, 2022
0.1.0 Apr 18, 2022

26 downloads per month
Used in logisheets

MIT license

560KB
16K SLoC

Block

Block是指在一个sheet中一块连续的由单元格组成的区域。 该区域可以随时调整大小,但不受插入行列等全局操作影响。Block中的单元格可以引用任何单元格,也可被任何单元格引用。Block是LogiSheets实现结构化数据的基础

Block的创建、扩大、移动

在创建Block时,需要先指定Block的大小。那么原本在这片区域的“一般单元格”都会被删除(若有公式引用,则引用处变为#REF!)。 Block扩建与移动同理,将会被Block占用的“一般单元格”会被删除。

用一种形象的方式去描述:Block的创建、扩大和移动都是去“占领”一般单元格的地盘的。 也就是说,Block的创建、扩大、和移动,除了涉及被占据的一般单元格外,其他的一般单元格是没有影响的。 这与插入或行列块是有明显区别的。 这样的设计的好处显而易见:在一个具体的位置当中,如A5,D9,这个单元格要么是一般单元格、要么是Block单元格。 这样在公式中引用该单元格时就可以转换成单元格ID。

单元格

组成Block的单元格不妨称为Block单元格。

用户在某个单元格键入公式,其中包含了对单元格C5的引用。

  • 若C5是一般单元格,

其与一般单元格唯一的不同在于两者单元格Id组织方式存在差别。

pub enum CellId {
    NormalCell(NormalCellId),
    BlockCell(BlockCellId),
}

操作

全局插入行或列

  • 插入的行列无论相对于Block在什么位置,无其他影响

全局删除行或列

  • 删除的行(或列)在Block的上方(或左方),无其他影响
  • 删除的行(或列)在Block的下方(或右方),无其他影响
  • 删除的行(或列)在Block的中部,则与Block的下方(或右方)接壤的一般单元格会被删除。如果接壤区域中包括Block单元格,则整个Block都需要被删除.

Block插入行或列

  • 与Block的下方(或右方)接壤的一般单元格会被删除

Block删除行或列

  • 无其他影响

删除Block单元格

Block的单元格删除只能通过删除Block的整行或整列来达到.不能删除个别的单元格. 当用户选定部分Block单元格进行删除时,实际上是将该数据清空.

单元格引用

一般单元格及Block单元格不能同时被一个Range引用.若一个公式包含一个Range引用A1:C5,那么A1:C5这个范围内要么全是一般单元格,要么全是Block单元格.

  • 若用户输入A1:C5,其中A1是一般单元格,C5是Block单元格. 此时将该语法树节点转为一般单元格的引用(即A1).
  • 若用户输入A1:C5,其中A1与C5均为Block单元格,但不属于同一个Block. 此时将该语法树节点转为第一个单元格引用(即A1).
  • 若用户输入A1:C5,其中A1与C5均为一般单元格.但是在A1:C5范围内存在若干个Block单元格. 此时不对用户输入作出修改.然而在计算过程中,该范围内的Block的数值不参与计算.

Dependencies

~17MB
~328K SLoC