diff --git a/docs/zh/guide/operate.md b/docs/zh/guide/operate.md
index 4a82ad4..59288b1 100644
--- a/docs/zh/guide/operate.md
+++ b/docs/zh/guide/operate.md
@@ -10,6 +10,8 @@
## 单元格刷新
+### 单个单元格刷新
+
- **格式**:
```json
@@ -48,6 +50,43 @@
```
后台在保存前台推送的数据时,会更新 `luckysheetfile[i].celldata` 字段,如果存在该单元格则更新,如果没有则添加,如果存在该单元格但是`v`为null则删除该单元格。
+
+### 范围单元格刷新
+
+- **格式**:
+
+ ```json
+ {
+ "t": "rv",
+ "i": "Sheet_ahKdzaNC65iL_1598343160744",
+ "v": [
+ [
+ { "v": 3, "ct": { "fa": "General", "t": "n" }, "m": "3" }
+ ],
+ [
+ { "v": 4, "ct": { "fa": "General", "t": "n" }, "m": "4" }
+ ]
+ ],
+ "range": {
+ "row": [ 1, 2 ],
+ "column": [ 1, 1 ]
+ }
+ }
+ ```
+
+- **说明**:
+
+ |参数|说明|
+ | ------------ | ------------ |
+ |t|操作类型表示符号|
+ |i|当前sheet的索引值|
+ |v|范围二维数组,单元格对象参考 [单元格属性表](/zh/guide/cell.html#基本单元格)|
+ |range|范围行列数|
+
+- **后台更新**:
+
+ 前端维护luckysheetfile[i].data,而单元格更新到后台,继续维护`luckysheetfile[i].celldata` 参数,需要将指定位置`range`的所有单元格数据替换为新的数据
+
## config操作
- **格式**:
@@ -78,7 +117,7 @@
- **后台更新**:
- 更新 `luckysheetfile[i].config.[k] = v` ,如果`config`中不存在`k`,则新建一个`k`属性并设置为空。
+ 更新 `luckysheetfile[i].config[k] = v` ,如果`config`中不存在`k`,则新建一个`k`属性并设置为空。
注意一点,修改config中的某个配置时,会把这个配置全部传输到后台,比如修改borderInfo,本来已经有一个含边框的单元格了,再新设置一个单元格边框,这时候会把这两个单元格边框信息都传输到后台,而不做更细颗粒的操作。
@@ -92,7 +131,7 @@
"k": "rowhidden"
}
```
- - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config.["rowhidden"] = { "5": 0, "6": 0, "13": 0, "14": 0 }`
+ - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config["rowhidden"] = { "5": 0, "6": 0, "13": 0, "14": 0 }`
2. 修改行高:
- 发送到后台:
@@ -104,7 +143,7 @@
"k": "rowlen"
}
```
- - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config.["rowlen"] = { "9": 20, "11": 71, "15": 58 }`
+ - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config["rowlen"] = { "9": 20, "11": 71, "15": 58 }`
3. 修改列宽:
- 发送到后台:
@@ -116,7 +155,7 @@
"k": "columnlen"
}
```
- - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config.["columnlen"] = { "2": 135 }`
+ - 后台更新:`luckysheetfile["Sheet_0554kKiKl4M7_1597974810804"].config["columnlen"] = { "2": 135 }`
## 通用保存
@@ -128,10 +167,7 @@
"i": 0,
"v": {
"type": "rangeRow",
- "range": {
- "row_focus": 1,
- "column_focus": 1
- }
+ "range": { "row_focus": 1, "column_focus": 1 }
},
"k": "frozen"
}
@@ -148,50 +184,370 @@
- **后台更新**:
- `luckysheetfile[3].[k]= v`
- 如果`s`为`true`,则为 `luckysheetfile[3].[k]= JSON.stringify(v)`
-
- 1. 数据透视表:
- - 输入:`{"t":"all","i":1,"v":{………},"k":"pivotTable", "s": false}`
- - 更新:`luckysheetfile[1].["pivotTable"] = {………}`
+ 更新 `luckysheetfile[i][k] = v` ,如果`luckysheetfile[i]`中不存在`k`,则新建一个`k`属性并设置为空。
- 2. 冻结行列:
- - 输入:`{"t":"all","i":3,"v":{………},"k":"freezen", "s": false}`
- - 更新:`luckysheetfile[3].["freezen"] = {………}`
+ 1. 冻结行列:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": 0,
+ "v": {
+ "type": "rangeRow",
+ "range": { "row_focus": 1, "column_focus": 1 }
+ },
+ "k": "frozen"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile[0]["frozen"] = {
+ "type": "rangeRow",
+ "range": { "row_focus": 1, "column_focus": 1 }
+ }
+ ```
- 3. 筛选范围:
- - 输入:`{"t":"all","i":3,"v":{………},"k":"filter_select", "s": true }`
- - 更新:`luckysheetfile[3].["filter_select"] = JSON.stringify ({………})`
-
- 4. Sheet名称:
- - 输入:`{"t":"all","i":1,"v":"文档","k":"name", "s": false}`
- - 更新:`luckysheetfile[1].["name"] = "文档"`
+ 2. 修改工作表名称:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": 0,
+ "v": "Cell22",
+ "k": "name"
+ }
+ ```
+ - 后台更新:`luckysheetfile[0]["name"] = "Cell22"`
+
+ 3. 修改工作表颜色:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": 0,
+ "v": "#f02323",
+ "k": "color"
+ }
+ ```
+ - 后台更新:`luckysheetfile[0]["color"] = "#f02323"`
+
+ 4. 合并单元格:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": "Sheet_aheLt0Waf1lk_1598248231626",
+ "v": {
+ "merge": {
+ "0_0": { "r": 0, "c": 0, "rs": 2, "cs": 1 }
+ },
+ "rowlen": {}
+ },
+ "k": "config"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile["Sheet_aheLt0Waf1lk_1598248231626"]["config"] = {
+ "merge": {
+ "0_0": { "r": 0, "c": 0, "rs": 2, "cs": 1 }
+ },
+ "rowlen": {}
+ }
+ ```
+
+ 注意,合并单元格的更新比较特殊,要求把整个config传输到后台,因为合并单元格可能会影响到其他参数。
+
+ 5. 筛选范围:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": 0,
+ "v": {
+ "row": [ 16, 21 ],
+ "column": [ 2, 3 ]
+ },
+ "k": "filter_select"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile[0]["filter_select"] = {
+ "row": [ 16, 21 ],
+ "column": [ 2, 3 ]
+ }
+ ```
+
+ 6. 筛选的具体设置:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": "0",
+ "v": {
+ "0": {
+ "caljs": {
+ "value": "textinclude",
+ "text": "Text contains",
+ "type": "1",
+ "value1": "Lucky"
+ },
+ "rowhidden": {
+ "18": 0
+ },
+ "optionstate": true,
+ "str": 17,
+ "edr": 19,
+ "cindex": 2,
+ "stc": 2,
+ "edc": 3
+ }
+ },
+ "k": "filter"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile[0]["filter"] = {
+ "0": {
+ "caljs": {
+ "value": "textinclude",
+ "text": "Text contains",
+ "type": "1",
+ "value1": "Lucky"
+ },
+ "rowhidden": {
+ "18": 0
+ },
+ "optionstate": true,
+ "str": 17,
+ "edr": 19,
+ "cindex": 2,
+ "stc": 2,
+ "edc": 3
+ }
+ }
+ ```
+
+ 7. 交替颜色:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": "Sheet_4N45tpMd0ni4_1598250591760",
+ "v": [
+ {
+ "cellrange": {
+ "row": [ 2, 6 ],
+ "column": [ 1, 4 ]
+ },
+ "format": {
+ "head": {
+ "fc": "#000",
+ "bc": "#f6cb4b"
+ },
+ "one": {
+ "fc": "#000",
+ "bc": "#ffffff"
+ },
+ "two": {
+ "fc": "#000",
+ "bc": "#fff9e7"
+ },
+ "foot": {
+ "fc": "#000",
+ "bc": "#ffebac"
+ }
+ },
+ "hasRowHeader": true,
+ "hasRowFooter": true
+ }
+ ],
+ "k": "luckysheet_alternateformat_save"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile["Sheet_4N45tpMd0ni4_1598250591760"]["luckysheet_alternateformat_save"] = [
+ {
+ "cellrange": {
+ "row": [ 2, 6 ],
+ "column": [ 1, 4 ]
+ },
+ "format": {
+ "head": {
+ "fc": "#000",
+ "bc": "#f6cb4b"
+ },
+ "one": {
+ "fc": "#000",
+ "bc": "#ffffff"
+ },
+ "two": {
+ "fc": "#000",
+ "bc": "#fff9e7"
+ },
+ "foot": {
+ "fc": "#000",
+ "bc": "#ffebac"
+ }
+ },
+ "hasRowHeader": true,
+ "hasRowFooter": true
+ }
+ ]
+ ```
+
+ 8. 条件格式:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": "Sheet_545W7w03kLkC_1598251927583",
+ "v": [
+ {
+ "type": "default",
+ "cellrange": [
+ {
+ "row": [ 2, 6 ],
+ "column": [ 1, 3 ]
+ }
+ ],
+ "format": {
+ "textColor": "#9c0006",
+ "cellColor": "#ffc7ce"
+ },
+ "conditionName": "greaterThan",
+ "conditionRange": [],
+ "conditionValue": [ "3" ]
+ }
+ ],
+ "k": "luckysheet_conditionformat_save"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile["Sheet_545W7w03kLkC_1598251927583"]["luckysheet_conditionformat_save"] = [
+ {
+ "type": "default",
+ "cellrange": [
+ {
+ "row": [ 2, 6 ],
+ "column": [ 1, 3 ]
+ }
+ ],
+ "format": {
+ "textColor": "#9c0006",
+ "cellColor": "#ffc7ce"
+ },
+ "conditionName": "greaterThan",
+ "conditionRange": [],
+ "conditionValue": [ "3" ]
+ }
+ ]
+ ```
+
+ 9. 数据透视表:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": "Sheet_r3Cz5bbxipL3_1598252547290",
+ "v": {
+ "pivot_select_save": {
+ "row": [ 0, 2 ],
+ "column": [ 0, 2 ]
+ },
+ "pivotDataSheetIndex": "Sheet_31ikLMip330K_1598252536645",
+ "column": [],
+ "row": [],
+ "filter": [],
+ "values": [],
+ "showType": "column"
+ },
+ "k": "pivotTable"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile["Sheet_r3Cz5bbxipL3_1598252547290"]["pivotTable"] = {
+ "pivot_select_save": {
+ "row": [ 0, 2 ],
+ "column": [ 0, 2 ]
+ },
+ "pivotDataSheetIndex": "Sheet_31ikLMip330K_1598252536645",
+ "column": [],
+ "row": [],
+ "filter": [],
+ "values": [],
+ "showType": "column"
+ }
+ ```
- 5. Sheet颜色:
- - 输入: `{"t":"all","i":2,"v":"#FFF000","k":"color", "s": false}`
- - 更新:`luckysheetfile[2].["color"] = "#FFF000"`
+ 注意,虽然数据透视表的格式是这个,但是当你选择一个范围之后,点击生产数据透视表时,Luckysheet会先执行新建sheet页和切换到该sheet页的操作,才能在新建的sheet页加上数据透视表。
+
+ 10. 动态数组:
+ - 发送到后台:
+ ```json
+ {
+ "t": "all",
+ "i": "Sheet_r3Cz5bbxipL3_1598252547290",
+ "v": [
+ {
+ "r": 4,
+ "c": 5,
+ "f": "=UNIQUE(B2:E9)",
+ "data": [
+ [ 1, 2, 3, 4 ],
+ [ 2, 3, 4, 5 ],
+ [ 3, 4, 5, 6 ],
+ [ 4, 5, 6, 7 ],
+ [ 5, 6, 7, 8 ],
+ [ 6, 7, 8, 9 ],
+ [ 7, 8, 9, 10 ],
+ [ 8, 9, 10, 11 ]
+ ]
+ }
+ ],
+ "k": "dynamicArray"
+ }
+ ```
+ - 后台更新:
+ ```js
+ luckysheetfile["Sheet_r3Cz5bbxipL3_1598252547290"]["dynamicArray"] = [
+ {
+ "r": 4,
+ "c": 5,
+ "f": "=UNIQUE(B2:E9)",
+ "data": [
+ [ 1, 2, 3, 4 ],
+ [ 2, 3, 4, 5 ],
+ [ 3, 4, 5, 6 ],
+ [ 4, 5, 6, 7 ],
+ [ 5, 6, 7, 8 ],
+ [ 6, 7, 8, 9 ],
+ [ 7, 8, 9, 10 ],
+ [ 8, 9, 10, 11 ]
+ ]
+ }
+ ]
+ ```
## 函数链操作
- **格式**:
```json
+
{
"t": "fc",
- "i": 0,
- "v": {
- "r": 3,
- "c": 7,
- "index": 0,
- "func": [
- true,
- 187282,
- "=SUM(E4:G4)"
- ]
- },
+ "i": "0",
+ "v": "{\"r\":1,\"c\":1,\"index\":\"0\",\"func\":[true,3,\"=sum(A1:B1)\"]}",
"op": "add",
- "pos": 0
+ "pos": 1
}
+
```
- **说明**:
@@ -207,13 +563,29 @@
- **后台更新**:
calcChain为一个数组
- - 如果`op`的值为`add`则添加到末尾 `luckysheetfile[i].calcChain.push (v)`,
- - 如果`op`的值为`update`则更新 `luckysheetfile[i].calcChain[pos]= v`,
- - 如果`op`的值为`del`则删除 `luckysheetfile[i].calcChain.splice(pos, 1)`。
-
-- **前台查看**:
-
- 可以修改任意单元格的数值,然后到chrome控制台中查看`"t"=="v"`的操作。
+ - 如果`op`的值为`add`则添加到末尾 `luckysheetfile[0].calcChain.push(v)`,
+ - 如果`op`的值为`update`,格式为:
+ ```json
+ {
+ "t": "fc",
+ "i": "0",
+ "v": "{\"r\":0,\"c\":3,\"index\":\"0\",\"func\":[true,1,\"=Formula!A1+Formula!B1+1\"],\"color\":\"w\",\"parent\":null,\"chidren\":{},\"times\":0}",
+ "op": "update",
+ "pos": 0
+ }
+ ```
+ 更新 `luckysheetfile[0].calcChain[pos] = v`,
+ - 如果`op`的值为`del`则删除,格式为:
+ ```json
+ {
+ "t": "fc",
+ "i": 0,
+ "v": null,
+ "op": "del",
+ "pos": 0
+ }
+ ```
+ `luckysheetfile[0].calcChain.splice(pos, 1)`。
## 行列操作
@@ -271,10 +643,6 @@
主要是对 `luckysheetfile[i].celldata` 中的单元格进行操作,删除参数中所描述符合条件的单元格并且更新其他单元格的行列值,以上述为例,首先查找单元格中`r`值在4到8的所有单元格并删除,然后把本来行号9以后的单元格的`r`值减去5,最后把 `luckysheetfile[i].row` 减去5。
如果`v`值为 `"#__qkdelete#"`(不含引号),则此处为需要删除的单元格。
-- **前台查看**:
-
- 可以删除行或者列,然后到chrome控制台中查看`"t"=="drc"`的操作。
-
### 增加行或列
- **格式**:
@@ -282,13 +650,14 @@
```json
{
"t": "arc",
- "i": 0,
+ "i": "0",
"v": {
- "index": 5,
- "len": 10,
+ "index": 1,
+ "len": 1,
+ "direction": "lefttop",
"data": []
},
- "rc": "c"
+ "rc": "r"
}
```
@@ -312,7 +681,7 @@
行操作还是列操作,值`r`代表行,`c`代表列 |
- v |
+ v |
index |
从第几行或者列开始新增 |
@@ -320,6 +689,10 @@
len |
增加多少行或者列 |
+
+ direction |
+ 方向 |
+
data |
新增行或者列的内容 |
@@ -346,39 +719,8 @@
return ret;
```
-- **前台查看**:
- 可以新增行或者列,然后到chrome控制台中查看`"t"=="arc"`的操作。如果想查看具有`data`值的操作,则先删除某几行或几列,然后再撤销删除(Ctrl+Z),就能看到。
-
## 筛选操作
-### 选择筛选条件
-
-- **格式**:
-
- ```json
- {
- "t": "f",
- "i": 0,
- "v": "{\"caljs\":{},\"selected\":{\"青岛\":\"1\",\"广西\":\"1\",\"重庆\":\"1\"},\"rowhidden\":{\"1\":0,\"2\":0,\"3\":0,\"4\":0,\"6\":0,\"7\":0,\"8\":0,\"9\":0,\"10\":0,\"11\":0,\"12\":0,\"13\":0,\"14\":0,\"15\":0,\"16\":0,\"17\":0,\"18\":0,\"19\":0,\"21\":0,\"22\":0,\"24\":0,\"25\":0,\"26\":0,\"27\":0,\"28\":0,\"29\":0,\"30\":0,\"31\":0,\"32\":0,\"33\":0,\"34\":0,\"35\":0}}",
- "op": "upOrAdd",
- "pos": 1
- }
- ```
-
-- **说明**:
-
- |参数|说明|
- | ------------ | ------------ |
- |t|操作类型表示符号|
- |i|当前sheet的index值|
- |v|对象值,这里对象的内部字段不需要单独更新,所以存为文本即可|
- |op|操作类型`upOrAdd`为更新,如果不存在则增加,`del`为删除|
- |pos|更新或者删除的`option`位置|
-
-- **后台更新**:
-
- 更新 `luckysheetfile[i].filter = { pos : v }`, v值为一个JSON格式的字符串。filter为一个键值对,key表示选项位置的索引值(以字符表示),v表示一个json字符串参数。filter代表一个筛选条件的集合。
-
### 清除筛选
- **格式**:
@@ -393,7 +735,7 @@
- **后台更新**:
- 清除 `luckysheetfile[i]. filter = null` , `luckysheetfile[i]. filter_select = null`。
+ 清除 `luckysheetfile[0].filter = null` , `luckysheetfile[i].filter_select = null`。
### 恢复筛选
@@ -425,12 +767,14 @@
"t": "sha",
"i": null,
"v": {
- "name": "Sheet4",
+ "name": "Sheet11",
"color": "",
"status": "0",
- "order": 3,
- "index": 3,
- "data": [],
+ "order": 10,
+ "index": "Sheet_oWlM5pKnwL1s_1598331858653",
+ "celldata": [],
+ "row": 84,
+ "column": 60,
"config": {},
"pivotTable": null,
"isPivotTable": false
@@ -454,7 +798,7 @@
当前sheet的index值 |
- v |
+ v |
name |
隐藏后跳转的sheet的index值 |
@@ -478,6 +822,14 @@
celldata |
单元格数据集 |
+
+ row |
+ 行数 |
+
+
+ column |
+ 列数 |
+
config |
设置 |
@@ -496,6 +848,8 @@
- **后台更新**:
添加一行(一个文档)到数据库中。
+ `luckysheetfile.push(json)`
+
### 复制sheet
@@ -504,9 +858,10 @@
```json
{
"t": "shc",
- "i": "新建sheet的位置",
+ "i": "Sheet_e5pKTeloilhe_1598332166630",
"v": {
- "copyindex": "copyindex"
+ "copyindex": 0,
+ "name": "Cell(Copy)"
}
}
```
@@ -552,15 +907,61 @@
删除索引为`deleIndex`对应值的sheet。
-### 位置
+### 删除sheet后恢复操作
+
+- **格式**:
+
+ ```json
+ {
+ "t": "shre",
+ "i": null,
+ "v": {
+ "reIndex": "0"
+ }
+ }
+ ```
+
+- **说明**:
+
+
+
+ 参数 |
+ 说明 |
+
+
+ t |
+ 操作类型表示符号 |
+
+
+ v |
+ deleIndex |
+ 需要恢复的sheet索引 |
+
+
+
+
+- **后台更新**:
+
+ 恢复索引为`reIndex`对应值的sheet。
+
+### 调整sheet位置
- **格式**:
```json
{
"t": "shr",
+ "i": null,
"v": {
- "index": "positon"
+ "0": 1,
+ "1": 0,
+ "2": 2,
+ "3": 3,
+ "4": 4,
+ "5": 5,
+ "6": 6,
+ "7": 7,
+ "Sheet_6az6nei65t1i_1596209937084": 8
}
}
```
@@ -580,17 +981,15 @@
`luckysheetfile[key2].order = value2`
`luckysheetfile[key3].order = value3`
-## sheet属性(隐藏或显示)
+### 切换到指定sheet
- **格式**:
```json
{
- "t": "sh",
- "i": 0,
- "v": 1,
- "op": " hide",
- "cur": 2
+ "t": "shs",
+ "i": null,
+ "v": 1
}
```
@@ -599,27 +998,27 @@
|参数|说明|
| ------------ | ------------ |
|t|操作类型表示符号|
- |i|当前sheet的index值|
- |op|操作选项,有hide、show|
- |v|如果`hide`为`1`则隐藏,为`0`或者空则为显示|
- |cur|隐藏后设置索引对应`cur`的sheet为激活状态|
+ |v|要切换到的sheet页索引|
- **后台更新**:
- 更新`i`对应sheet的根路径`hide`字段为`v`,当隐藏时`status`值为`0`,当显示时为`1`,如果为隐藏则更新`index`对应`cur`的sheet的`status`状态为`1`。
+ 对sheet的`index`等于`v`的页,设置其`status`属性为`1`值。示例:
-## 表格信息更改
+ `luckysheetfile[v].status = 1`
-### 表格名称
+## sheet属性(隐藏或显示)
- **格式**:
```json
{
- "t": "na",
- "i": null,
- "v": "数据"
+ "t": "sh",
+ "i": 0,
+ "v": 1,
+ "op": "hide",
+ "cur": 1
}
+
```
- **说明**:
@@ -627,32 +1026,57 @@
|参数|说明|
| ------------ | ------------ |
|t|操作类型表示符号|
- |v|表格的名称|
+ |i|当前sheet的index值|
+ |op|操作选项,有hide、show|
+ |v|如果`hide`为`1`则隐藏,为`0`或者空则为显示|
+ |cur|隐藏后设置索引对应`cur`的sheet为激活状态|
- **后台更新**:
- 根据gridkey更新数据库中的表格名称。
+ 更新`i`对应sheet的根路径`hide`字段为`v`
+
+ 当隐藏时`status`值为`0`,更新`index`对应`cur`的sheet的`status`状态为`1`
+
+ `luckysheetfile[0].hide = 1`
+ `luckysheetfile[0].status = 0`
+ `luckysheetfile[1].status = 1`
-### 缩略图
+ 显示某个sheet页时,json为
+ ```json
+ {
+ "t": "sh",
+ "i": 6,
+ "v": 0,
+ "op": "show"
+ }
+ ```
+ `status`值为`1`,上一个激活sheet的`status`状态为`0`
+
+ `luckysheetfile[6].hide = 0`
+ `luckysheetfile[6].status = 1`
+ `luckysheetfile[old_cur].status = 0`
+
+## 表格信息更改
+
+### 修改工作簿名称
- **格式**:
- ```json
- {
- "t": "thumb",
- "img": "base64",
- "curindex": "curindx"
- }
- ```
+ ```json
+ {
+ "t": "na",
+ "i": null,
+ "v": "Luckysheet Demo1"
+ }
+ ```
- **说明**:
|参数|说明|
| ------------ | ------------ |
|t|操作类型表示符号|
- |img|当前表格的缩略图,为base64字符串|
- |curindex|当前表格默认打开的sheet|
+ |v|工作簿名称|
- **后台更新**:
- 根据gridkey更新mysql中表格的缩略图字段为img值,同时更新index为curindex值的sheet的status字段为1,设置其他sheet的status值为0。
\ No newline at end of file
+ Luckysheet配置,修改title为`"Luckysheet Demo1"`
\ No newline at end of file
diff --git a/docs/zh/guide/sheet.md b/docs/zh/guide/sheet.md
index d83821b..b831b31 100644
--- a/docs/zh/guide/sheet.md
+++ b/docs/zh/guide/sheet.md
@@ -416,18 +416,8 @@ options.data示例如下:
```js
{
"pivot_select_save": {
- "left": 0,
- "width": 73,
- "top": 0,
- "height": 19,
- "left_move": 0,
- "width_move": 369,
- "top_move": 0,
- "height_move": 259,
"row": [0, 12],
- "column": [0, 4],
- "row_focus": 0,
- "column_focus": 0
+ "column": [0, 4]
},
"pivotDataSheetIndex": 6, //The sheet index where the source data is located
"column": [{
@@ -469,24 +459,9 @@ options.data示例如下:
- 示例:
```js
{
- "left": 74,
- "width": 73,
- "top": 40,
- "height": 19,
- "left_move": 74,
- "width_move": 221,
- "top_move": 40,
- "height_move": 99,
- "row": [
- 2,
- 6
- ],
- "column": [
- 1,
- 3
- ],
- "row_focus": 2,
- "column_focus": 1
+
+ "row": [ 2, 6 ],
+ "column": [ 1, 3 ]
}
```
@@ -499,23 +474,22 @@ options.data示例如下:
```js
{
"0": {
- "caljs": {},
- "rowhidden": {
- "3": 0,
- "4": 0
+ "caljs": { // 条件筛选类型
+ "value": "cellnull",
+ "text": "Is empty",
+ "type": "0"
},
- "optionstate": true,
- "str": 2,
- "edr": 6,
- "cindex": 1,
- "stc": 1,
- "edc": 3
+ "rowhidden": { "3": 0, "4": 0 }, // 隐藏行
+ "optionstate": true, //是否开启配置
+ "str": 2, // 范围,起始行
+ "edr": 6, // 范围,结束行
+ "cindex": 1, // 当前范围列索引
+ "stc": 1, // 范围,起始列
+ "edc": 3 // 范围,结束列
},
"1": {
"caljs": {},
- "rowhidden": {
- "6": 0
- },
+ "rowhidden": { "6": 0 },
"optionstate": true,
"str": 2,
"edr": 6,
@@ -619,13 +593,13 @@ options.data示例如下:
- 默认值:[]
- 作用: 条件格式配置信息,包含多个条件格式配置对象的一维数组,
-type: "default": 突出显示单元格规则和项目选区规则,
+ type: "default": 突出显示单元格规则和项目选区规则,
-"dataBar":数据条,
+ "dataBar":数据条,
-"icons":图标集,
+ "icons":图标集,
-"colorGradation": 色阶
+ "colorGradation": 色阶
- 示例:
```js
@@ -687,18 +661,8 @@ type: "default": 突出显示单元格规则和项目选区规则,
"type": "colorGradation",
"cellrange": [
{
- "left": 422,
- "width": 100,
- "top": 210,
- "height": 20,
- "left_move": 422,
- "width_move": 100,
- "top_move": 210,
- "height_move": 125,
"row": [ 10, 15 ],
- "column": [ 6, 6 ],
- "row_focus": 10,
- "column_focus": 6
+ "column": [ 6, 6 ]
}
],
"format": [
diff --git a/src/controllers/constant.js b/src/controllers/constant.js
index 7090e80..3731014 100644
--- a/src/controllers/constant.js
+++ b/src/controllers/constant.js
@@ -3,7 +3,6 @@ import Store from '../store';
//dom variable
const gridHTML = function(){
-
const _locale = locale();
const locale_info = _locale.info;
@@ -183,7 +182,7 @@ const gridHTML = function(){
`;
}
-const columeHeader_word = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
+const columeHeader_word = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'],
columeHeader_word_index = { 'A': 0, 'B': 1, 'C': 2, 'D': 3, 'E': 4, 'F': 5, 'G': 6, 'H': 7, 'I': 8, 'J': 9, 'K': 10, 'L': 11, 'M': 12, 'N': 13, 'O': 14, 'P': 15, 'Q': 16, 'R': 17, 'S': 18, 'T': 19, 'U': 20, 'V': 21, 'W': 22, 'X': 23, 'Y': 24, 'Z': 25 },
flow = '',
colsmenuHTML = '';
@@ -221,6 +220,11 @@ function rightclickHTML(){
${rightclick.hide}
+
+
+
@@ -391,6 +395,28 @@ function rightclickHTML(){
${rightclick.showHide}${rightclick.row}
+
+
+
+
+
+
';
- }
+}
const luckysheetchartpointconfigHTML = ' 数据点设置
图形大小
图形形状
边框粗细
数值比例
小数位数
标签格式
标签位置
';
const luckysheetToolHTML = '';
@@ -1188,7 +1212,6 @@ function menuToolBar (){
`;
}
-
const luckysheetlodingHTML = function(){
const _locale = locale()
const info =_locale.info;
@@ -1298,8 +1321,6 @@ const luckysheetdefaultFont = function(){
const luckysheet_CFiconsImg = new Image();
luckysheet_CFiconsImg.src = "data:image/png;base64,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";
-
-
export {
gridHTML,
columeHeader_word,
diff --git a/src/controllers/controlHistory.js b/src/controllers/controlHistory.js
index 5614d02..0046ff4 100644
--- a/src/controllers/controlHistory.js
+++ b/src/controllers/controlHistory.js
@@ -14,6 +14,7 @@ import {
jfrefreshrange,
jfrefreshgrid_rhcw,
jfrefreshgrid_adRC,
+ jfrefreshgrid_deleteCell,
jfrefreshgrid_pastcut,
luckysheetrefreshgrid
} from '../global/refresh';
@@ -140,6 +141,9 @@ const controlHistory = {
jfrefreshgrid_adRC(ctr.data, ctr.config, "addRC", ctrlValue, ctr.calc, ctr.filterObj, ctr.cf, ctr.af, ctr.freezen);
}
+ else if (ctr.type == "deleteCell") { //删除单元格撤销操作
+ jfrefreshgrid_deleteCell(ctr.data, ctr.config, ctr.ctrl, ctr.calc, ctr.filterObj, ctr.cf);
+ }
else if (ctr.type == "showHidRows") { // 隐藏、显示行 撤销操作
//config
Store.config = ctr.config;
@@ -150,6 +154,16 @@ const controlHistory = {
//行高、列宽 刷新
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
+ else if (ctr.type == "showHidCols") { // 隐藏、显示列 撤销操作
+ //config
+ Store.config = ctr.config;
+ Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.config;
+
+ server.saveParam("cg", ctr.sheetIndex, ctr.config["colhidden"], { "k": "colhidden" });
+
+ //行高、列宽 刷新
+ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+ }
else if (ctr.type == "datachangeAll") {
formula.execFunctionGroup();
jfrefreshgridall(ctr.data[0].length, ctr.data.length, ctr.data, null, ctr.range, "datachangeAll", ctr.ctrlValue);
@@ -388,6 +402,9 @@ const controlHistory = {
else if (ctr.type == "delRC") { //删除行列重做操作
jfrefreshgrid_adRC(ctr.curData, ctr.curConfig, "delRC", ctr.ctrlValue, ctr.curCalc, ctr.curFilterObj, ctr.curCf, ctr.curAf, ctr.curFreezen);
}
+ else if (ctr.type == "deleteCell") { //删除单元格重做操作
+ jfrefreshgrid_deleteCell(ctr.curData, ctr.curConfig, ctr.ctrl, ctr.curCalc, ctr.curFilterObj, ctr.curCf);
+ }
else if (ctr.type == "showHidRows") { // 隐藏、显示行 重做操作
//config
Store.config = ctr.curconfig;
@@ -398,6 +415,16 @@ const controlHistory = {
//行高、列宽 刷新
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
+ else if (ctr.type == "showHidCols") { // 隐藏、显示列 重做操作
+ //config
+ Store.config = ctr.curconfig;
+ Store.luckysheetfile[getSheetIndex(ctr.sheetIndex)].config = ctr.curconfig;
+
+ server.saveParam("cg", ctr.sheetIndex, ctr.curconfig["colhidden"], { "k": "colhidden" });
+
+ //行高、列宽 刷新
+ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+ }
else if (ctr.type == "datachangeAll") {
formula.execFunctionGroup();
jfrefreshgridall(ctr.curdata[0].length, ctr.curdata.length, ctr.curdata, null, ctr.currange, "datachangeAll", ctr.ctrlValue);
diff --git a/src/controllers/filter.js b/src/controllers/filter.js
index d979f7e..980b72c 100644
--- a/src/controllers/filter.js
+++ b/src/controllers/filter.js
@@ -745,6 +745,10 @@ function initialFilterHandler(){
//单元格颜色
let bg = menuButton.checkstatus(Store.flowdata, r, cindex , "bg");
+
+ if(bg == null){
+ bg = "#ffffff";
+ }
let checksAF = alternateformat.checksAF(r, cindex, af_compute);
if(checksAF != null){//若单元格有交替颜色
diff --git a/src/controllers/rowColumnOperation.js b/src/controllers/rowColumnOperation.js
index 6ca9cb8..f36900e 100644
--- a/src/controllers/rowColumnOperation.js
+++ b/src/controllers/rowColumnOperation.js
@@ -21,7 +21,7 @@ import {
import { isRealNull, isRealNum, hasPartMC, isEditMode } from '../global/validate';
import { countfunc } from '../global/count';
import formula from '../global/formula';
-import { luckysheetextendtable, luckysheetdeletetable } from '../global/extend';
+import { luckysheetextendtable, luckysheetdeletetable, luckysheetDeleteCell } from '../global/extend';
import {
jfrefreshgrid,
jfrefreshgridall,
@@ -1295,9 +1295,7 @@ export function rowColumnOperationInitial(){
for(let s = 0; s < Store.luckysheet_select_save.length; s++){
let r1 = Store.luckysheet_select_save[s].row[0],
- r2 = Store.luckysheet_select_save[s].row[1],
- c1 = Store.luckysheet_select_save[s].column[0],
- c2 = Store.luckysheet_select_save[s].column[1];
+ r2 = Store.luckysheet_select_save[s].row[1];
for(let r = r1; r <= r2; r++){
cfg["rowhidden"][r] = 0;
@@ -1336,9 +1334,7 @@ export function rowColumnOperationInitial(){
for(let s = 0; s < Store.luckysheet_select_save.length; s++){
let r1 = Store.luckysheet_select_save[s].row[0],
- r2 = Store.luckysheet_select_save[s].row[1],
- c1 = Store.luckysheet_select_save[s].column[0],
- c2 = Store.luckysheet_select_save[s].column[1];
+ r2 = Store.luckysheet_select_save[s].row[1];
for(let r = r1; r <= r2; r++){
delete cfg["rowhidden"][r];
@@ -1367,6 +1363,134 @@ export function rowColumnOperationInitial(){
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
})
+ //隐藏、显示列
+ $("#luckysheet-hidCols").click(function (event) {
+ $("#luckysheet-rightclick-menu").hide();
+ luckysheetContainerFocus();
+
+ let cfg = $.extend(true, {}, Store.config);
+ if(cfg["colhidden"] == null){
+ cfg["colhidden"] = {};
+ }
+
+ for(let s = 0; s < Store.luckysheet_select_save.length; s++){
+ let c1 = Store.luckysheet_select_save[s].column[0],
+ c2 = Store.luckysheet_select_save[s].column[1];
+
+ for(let c = c1; c <= c2; c++){
+ cfg["colhidden"][c] = 0;
+ }
+ }
+
+ //保存撤销
+ if(Store.clearjfundo){
+ let redo = {};
+ redo["type"] = "showHidCols";
+ redo["sheetIndex"] = Store.currentSheetIndex;
+ redo["config"] = $.extend(true, {}, Store.config);
+ redo["curconfig"] = cfg;
+
+ Store.jfundo = [];
+ Store.jfredo.push(redo);
+ }
+
+ //config
+ Store.config = cfg;
+ Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;
+
+ server.saveParam("cg", Store.currentSheetIndex, cfg["colhidden"], { "k": "colhidden" });
+
+ //行高、列宽 刷新
+ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+ })
+ $("#luckysheet-showHidCols").click(function (event) {
+ $("#luckysheet-rightclick-menu").hide();
+ luckysheetContainerFocus();
+
+ let cfg = $.extend(true, {}, Store.config);
+ if(cfg["colhidden"] == null){
+ return;
+ }
+
+ for(let s = 0; s < Store.luckysheet_select_save.length; s++){
+ let c1 = Store.luckysheet_select_save[s].column[0],
+ c2 = Store.luckysheet_select_save[s].column[1];
+
+ for(let c = c1; c <= c2; c++){
+ delete cfg["colhidden"][c];
+ }
+ }
+
+ //保存撤销
+ if(Store.clearjfundo){
+ let redo = {};
+ redo["type"] = "showHidCols";
+ redo["sheetIndex"] = Store.currentSheetIndex;
+ redo["config"] = $.extend(true, {}, Store.config);
+ redo["curconfig"] = cfg;
+
+ Store.jfundo = [];
+ Store.jfredo.push(redo);
+ }
+
+ //config
+ Store.config = cfg;
+ Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)].config = Store.config;
+
+ server.saveParam("cg", Store.currentSheetIndex, cfg["colhidden"], { "k": "colhidden" });
+
+ //行高、列宽 刷新
+ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+ })
+
+ //删除单元格(左移、上移)
+ $("#luckysheet-delCellsMoveLeft").click(function (event) {
+ $("#luckysheet-rightclick-menu").hide();
+ luckysheetContainerFocus();
+
+ const locale_drag = locale().drag;
+
+ if(Store.luckysheet_select_save.length > 1){
+ if(isEditMode()){
+ alert(locale_drag.noMulti);
+ }
+ else{
+ tooltip.info(locale_drag.noMulti, "");
+ }
+ return;
+ }
+
+ let str = Store.luckysheet_select_save[0].row[0],
+ edr = Store.luckysheet_select_save[0].row[1],
+ stc = Store.luckysheet_select_save[0].column[0],
+ edc = Store.luckysheet_select_save[0].column[1];
+
+ luckysheetDeleteCell('moveLeft', str, edr, stc, edc);
+ });
+ $("#luckysheet-delCellsMoveUp").click(function (event) {
+ $("#luckysheet-rightclick-menu").hide();
+ luckysheetContainerFocus();
+
+ const locale_drag = locale().drag;
+
+ if(Store.luckysheet_select_save.length > 1){
+ if(isEditMode()){
+ alert(locale_drag.noMulti);
+ }
+ else{
+ tooltip.info(locale_drag.noMulti, "");
+ }
+ return;
+ }
+
+ let str = Store.luckysheet_select_save[0].row[0],
+ edr = Store.luckysheet_select_save[0].row[1],
+ stc = Store.luckysheet_select_save[0].column[0],
+ edc = Store.luckysheet_select_save[0].column[1];
+
+ luckysheetDeleteCell('moveUp', str, edr, stc, edc);
+ });
+
//清除单元格内容
$("#luckysheet-delete-text").click(function(){
$("#luckysheet-rightclick-menu").hide();
diff --git a/src/controllers/server.js b/src/controllers/server.js
index a66814d..f0ee730 100644
--- a/src/controllers/server.js
+++ b/src/controllers/server.js
@@ -315,10 +315,10 @@ const server = {
let k = item.k;
file[k] = value;
- if(k == "name"){ //表格名
+ if(k == "name"){ //工作表名
$("#luckysheet-sheet-container-c #luckysheet-sheets-item" + index).find("span.luckysheet-sheets-item-name").html(value);
}
- else if(k == "color"){ //表格颜色
+ else if(k == "color"){ //工作表颜色
let currentSheetItem = $("#luckysheet-sheet-container-c #luckysheet-sheets-item" + index);
currentSheetItem.find(".luckysheet-sheets-item-color").remove();
diff --git a/src/global/draw.js b/src/global/draw.js
index 2a28212..3974103 100644
--- a/src/global/draw.js
+++ b/src/global/draw.js
@@ -223,28 +223,33 @@ function luckysheetDrawgridColumnTitle(scrollWidth, drawWidth, offsetLeft) {
// if(end_c > scrollWidth + drawWidth+1){
// break;
// }
+
+ if (Store.config["colhidden"] != null && Store.config["colhidden"][c] != null) {
- luckysheetTableContent.fillStyle = "#ffffff";
- luckysheetTableContent.fillRect(
- (start_c + offsetLeft - 1) ,
- 0,
- (end_c - start_c) ,
- Store.columeHeaderHeight -1
- )
- luckysheetTableContent.fillStyle = "#000000";
+ }
+ else {
+ luckysheetTableContent.fillStyle = "#ffffff";
+ luckysheetTableContent.fillRect(
+ (start_c + offsetLeft - 1) ,
+ 0,
+ (end_c - start_c) ,
+ Store.columeHeaderHeight -1
+ )
+ luckysheetTableContent.fillStyle = "#000000";
- //列标题栏序列号
- luckysheetTableContent.save();//save scale before draw text
- luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);
- let abc = chatatABC(c);
- let textMetrics = getMeasureText(abc, luckysheetTableContent);
- //luckysheetTableContent.measureText(abc);
+ //列标题栏序列号
+ luckysheetTableContent.save();//save scale before draw text
+ luckysheetTableContent.scale(Store.zoomRatio,Store.zoomRatio);
+ let abc = chatatABC(c);
+ let textMetrics = getMeasureText(abc, luckysheetTableContent);
+ //luckysheetTableContent.measureText(abc);
- let horizonAlignPos = Math.round((start_c + (end_c - start_c) / 2 + offsetLeft) - textMetrics.width / 2);
- let verticalAlignPos = Math.round(Store.columeHeaderHeight / 2 );
-
- luckysheetTableContent.fillText(abc, horizonAlignPos/Store.zoomRatio, verticalAlignPos/Store.zoomRatio);
- luckysheetTableContent.restore();//restore scale after draw text
+ let horizonAlignPos = Math.round((start_c + (end_c - start_c) / 2 + offsetLeft) - textMetrics.width / 2);
+ let verticalAlignPos = Math.round(Store.columeHeaderHeight / 2 );
+
+ luckysheetTableContent.fillText(abc, horizonAlignPos/Store.zoomRatio, verticalAlignPos/Store.zoomRatio);
+ luckysheetTableContent.restore();//restore scale after draw text
+ }
//列标题栏竖线 vertical
luckysheetTableContent.beginPath();
@@ -465,6 +470,10 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
}
let end_r = Store.visibledatarow[r] - scrollHeight;
+
+ if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
+ continue;
+ }
for (let c = dataset_col_st; c <= dataset_col_ed; c++) {
let start_c;
@@ -477,78 +486,77 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
let end_c = Store.visibledatacolumn[c] - scrollWidth;
- if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
-
+ if (Store.config["colhidden"] != null && Store.config["colhidden"][c] != null) {
+ continue
+ }
+
+ let firstcolumnlen = Store.defaultcollen;
+ if (Store.config["columnlen"] != null && Store.config["columnlen"][c] != null) {
+ firstcolumnlen = Store.config["columnlen"][c];
}
- else {
- let firstcolumnlen = Store.defaultcollen;
- if (Store.config["columnlen"] != null && Store.config["columnlen"][c] != null) {
- firstcolumnlen = Store.config["columnlen"][c];
- }
- if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
- let value = Store.flowdata[r][c];
+ if (Store.flowdata[r] != null && Store.flowdata[r][c] != null) {
+ let value = Store.flowdata[r][c];
- if(getObjType(value) == "object" && ("mc" in value)){
- borderOffset[r + "_" + c] = {
- "start_r": start_r,
- "start_c": start_c,
- "end_r": end_r,
- "end_c": end_c
- };
+ if(getObjType(value) == "object" && ("mc" in value)){
+ borderOffset[r + "_" + c] = {
+ "start_r": start_r,
+ "start_c": start_c,
+ "end_r": end_r,
+ "end_c": end_c
+ };
- if("rs" in value["mc"]){
- let key = "r"+ r + "c" + c;
+ if("rs" in value["mc"]){
+ let key = "r"+ r + "c" + c;
+ mergeCache[key] = cellupdate.length;
+ }
+ else{
+ let key = "r"+ value["mc"].r + "c" + value["mc"].c;
+ let margeMain = cellupdate[mergeCache[key]];
+
+ if(margeMain == null){
mergeCache[key] = cellupdate.length;
+ cellupdate.push({
+ "r": r,
+ "c": c,
+ "start_c": start_c,
+ "start_r": start_r,
+ "end_r": end_r,
+ "end_c": end_c,
+ "firstcolumnlen": firstcolumnlen,
+ });
}
else{
- let key = "r"+ value["mc"].r + "c" + value["mc"].c;
- let margeMain = cellupdate[mergeCache[key]];
-
- if(margeMain == null){
- mergeCache[key] = cellupdate.length;
- cellupdate.push({
- "r": r,
- "c": c,
- "start_c": start_c,
- "start_r": start_r,
- "end_r": end_r,
- "end_c": end_c,
- "firstcolumnlen": firstcolumnlen,
- });
+ if(margeMain.c == c){
+ margeMain.end_r += (end_r - start_r - 1);
}
- else{
- if(margeMain.c == c){
- margeMain.end_r += (end_r - start_r - 1);
- }
-
- if(margeMain.r == r){
- margeMain.end_c += (end_c - start_c);
- margeMain.firstcolumnlen += firstcolumnlen;
- }
+
+ if(margeMain.r == r){
+ margeMain.end_c += (end_c - start_c);
+ margeMain.firstcolumnlen += firstcolumnlen;
}
-
- continue;
}
+
+ continue;
}
}
-
- cellupdate.push({
- "r": r,
- "c": c,
- "start_r": start_r,
- "start_c": start_c,
- "end_r": end_r,
- "end_c": end_c,
- "firstcolumnlen": firstcolumnlen,
- });
- borderOffset[r + "_" + c] = {
- "start_r": start_r,
- "start_c": start_c,
- "end_r": end_r,
- "end_c": end_c
- };
}
+
+ cellupdate.push({
+ "r": r,
+ "c": c,
+ "start_r": start_r,
+ "start_c": start_c,
+ "end_r": end_r,
+ "end_c": end_c,
+ "firstcolumnlen": firstcolumnlen,
+ });
+ borderOffset[r + "_" + c] = {
+ "start_r": start_r,
+ "start_c": start_c,
+ "end_r": end_r,
+ "end_c": end_c
+ };
}
}
diff --git a/src/global/extend.js b/src/global/extend.js
index f58a971..3734cf1 100644
--- a/src/global/extend.js
+++ b/src/global/extend.js
@@ -1,8 +1,9 @@
import editor from './editor';
import formula from './formula';
-import { jfrefreshgrid_adRC, jfrefreshgrid_rhcw } from './refresh';
+import { jfrefreshgrid_adRC, jfrefreshgrid_deleteCell, jfrefreshgrid_rhcw } from './refresh';
import { datagridgrowth } from './getdata';
import { setcellvalue } from './setdata';
+import conditionformat from '../controllers/conditionformat';
import luckysheetFreezen from '../controllers/freezen';
import { selectHightlightShow } from '../controllers/select';
import { luckysheet_searcharray } from '../controllers/sheetSearch';
@@ -808,6 +809,7 @@ function luckysheetextendData(rowlen, newData) {
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
+//删除行列
function luckysheetdeletetable(type, st, ed) {
let d = editor.deepCopyFlowData(Store.flowdata);
let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
@@ -1481,8 +1483,482 @@ function luckysheetdeletetable(type, st, ed) {
);
}
+//删除单元格
+function luckysheetDeleteCell(type, str, edr, stc, edc) {
+ let d = editor.deepCopyFlowData(Store.flowdata);
+ let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
+
+ let rlen = edr - str + 1;
+ let clen = edc - stc + 1;
+ let cfg = $.extend(true, {}, Store.config);
+
+ //合并单元格配置变动
+ if(cfg["merge"] == null){
+ cfg["merge"] = {};
+ }
+
+ let merge_new = {};
+ for(let m in cfg["merge"]){
+ let mc = cfg["merge"][m];
+
+ let r = mc.r,
+ c = mc.c,
+ rs = mc.rs,
+ cs = mc.cs;
+
+ if(type == "moveLeft"){
+ if(str > r + rs - 1 || edr < r || stc > c + cs - 1){
+ merge_new[r + "_" + c] = { "r": r, "c": c, "rs": rs, "cs": cs };
+ }
+ else if(str <= r && edr >= r + rs - 1 && edc < c){
+ merge_new[r + "_" + (c - clen)] = { "r": r, "c": c - clen, "rs": rs, "cs": cs };
+ }
+ }
+ else if(type == "moveUp"){
+ if(stc > c + cs - 1 || edc < c || str > r + rs - 1){
+ merge_new[r + "_" + c] = { "r": r, "c": c, "rs": rs, "cs": cs };
+ }
+ else if(stc <= c && edc >= c + cs - 1 && edr < r){
+ merge_new[(r - rlen) + "_" + c] = { "r": r - rlen, "c": c, "rs": rs, "cs": cs };
+ }
+ }
+ }
+ cfg["merge"] = merge_new;
+
+ //公式配置变动
+ let calcChain = file.calcChain;
+ let newCalcChain = [];
+ if(calcChain != null && calcChain.length > 0){
+ for(let i = 0; i < calcChain.length; i++){
+ let calc = $.extend(true, {}, calcChain[i]);
+ let calc_r = calc.r, calc_c = calc.c, calc_i = calc.index, calc_funcStr = calc.func[2];
+
+ if((calc_r < str || calc_r > edr) && (calc_c < stc || calc_c > edc)){
+ let functionStr;
+
+ if(type == 'moveLeft'){
+ functionStr = "=" + formula.functionStrChange(calc_funcStr, "del", "col", null, stc, clen);
+
+ if(calc_c > edc){
+ calc.c = calc_c - clen;
+ }
+ }
+ else if(type == 'moveUp'){
+ functionStr = "=" + formula.functionStrChange(calc_funcStr, "del", "row", null, str, rlen);
+
+ if(calc_r > edr){
+ calc.r = calc_r - rlen;
+ }
+ }
+
+ if(d[calc_r][calc_c].f == calc_funcStr){
+ d[calc_r][calc_c].f = functionStr;
+ }
+
+ calc.func[2] = functionStr;
+
+ newCalcChain.push(calc);
+ }
+ }
+ }
+
+ //筛选配置变动
+ let filter_select = file.filter_select;
+ let filter = file.filter;
+ let newFilterObj = null;
+ if(filter_select != null && JSON.stringify(filter_select) != "{}"){
+ newFilterObj = { "filter_select": null, "filter": null };
+
+ let f_r1 = filter_select.row[0], f_r2 = filter_select.row[1];
+ let f_c1 = filter_select.column[0], f_c2 = filter_select.column[1];
+
+ if(type == 'moveUp'){
+ if(f_c1 >= stc && f_c2 <= edc){
+ if(f_r1 > edr){
+ newFilterObj.filter_select = {
+ "row": [f_r1 - rlen, f_r2 - rlen],
+ "column": [f_c1, f_c2]
+ }
+ }
+ else if(f_r2 < str){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+ }
+ else if(f_r1 < str){
+ if(f_r2 > edr){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2 - rlen],
+ "column": [f_c1, f_c2]
+ }
+ }
+ else{
+ newFilterObj.filter_select = {
+ "row": [f_r1, str - 1],
+ "column": [f_c1, f_c2]
+ }
+ }
+ }
+
+ if(newFilterObj.filter_select != null && filter != null){
+ for(let k in filter){
+ let f_rowhidden = filter[k].rowhidden;
+ let f_rowhidden_new = {};
+
+ for(let n in f_rowhidden){
+ if(n < str){
+ f_rowhidden_new[n] = 0;
+ }
+ else if(n > edr){
+ f_rowhidden_new[n - slen] = 0;
+ }
+ }
+
+ if(newFilterObj.filter == null){
+ newFilterObj.filter = {};
+ }
+ newFilterObj.filter[k] = $.extend(true, {}, filter[k]);
+
+ if(JSON.stringify(f_rowhidden_new) != "{}"){
+ newFilterObj.filter[k].rowhidden = f_rowhidden_new;
+ }
+
+ newFilterObj.filter[k].str = newFilterObj.filter_select.row[0];
+ newFilterObj.filter[k].edr = newFilterObj.filter_select.row[1];
+ }
+ }
+ }
+ else if(f_r1 >= str && f_r2 <= edr){
+ if(f_c1 > edc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+ }
+ else if(f_c1 >= stc){
+ if(f_c2 > edc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [stc, f_c2 - clen]
+ }
+ }
+ }
+ else{
+ if(f_c2 < stc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+ }
+ else if(f_c2 <= edc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, stc - 1]
+ }
+ }
+ else{
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2 - clen]
+ }
+ }
+ }
+
+ if(newFilterObj.filter_select != null && filter != null){
+ for(let k in filter){
+ let f_stc = newFilterObj.filter_select.column[0];
+ let f_edc = newFilterObj.filter_select.column[1];
+ let f_cindex = filter[k].cindex;
+
+ if(f_cindex < stc || f_cindex > edc){
+ if(newFilterObj.filter == null){
+ newFilterObj.filter = {};
+ }
+
+ if(f_cindex > edc){
+ f_cindex -= clen;
+ }
+
+ let k2 = f_cindex - f_stc;
+
+ newFilterObj.filter[k2] = $.extend(true, {}, filter[k]);
+ newFilterObj.filter[k2].cindex = f_cindex;
+ newFilterObj.filter[k2].stc = f_stc;
+ newFilterObj.filter[k2].edc = f_edc;
+ }
+ }
+ }
+ }
+ else{
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+
+ if(filter != null){
+ newFilterObj.filter = filter;
+ }
+ }
+ }
+ else if(type == 'moveLeft'){
+ if(f_r1 >= str && f_r2 <= edr){
+ if(f_c1 > edc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1 - clen, f_c2 - clen]
+ }
+ }
+ else if(f_c2 < stc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+ }
+ else if(f_c1 < stc){
+ if(f_c2 > edc){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2 - clen]
+ }
+ }
+ else{
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, stc - 1]
+ }
+ }
+ }
+
+ if(newFilterObj.filter_select != null && filter != null){
+ for(let k in filter){
+ let f_stc = newFilterObj.filter_select.column[0];
+ let f_edc = newFilterObj.filter_select.column[1];
+ let f_cindex = filter[k].cindex;
+
+ if(f_cindex < stc || f_cindex > edc){
+ if(newFilterObj.filter == null){
+ newFilterObj.filter = {};
+ }
+
+ if(f_cindex > edc){
+ f_cindex -= clen;
+ }
+
+ let k2 = f_cindex - f_stc;
+
+ newFilterObj.filter[k2] = $.extend(true, {}, filter[k]);
+ newFilterObj.filter[k2].cindex = f_cindex;
+ newFilterObj.filter[k2].stc = f_stc;
+ newFilterObj.filter[k2].edc = f_edc;
+ }
+ }
+ }
+ }
+ else if(f_c1 >= stc && f_c2 <= edc){
+ if(f_r1 < str || f_r1 > edr){
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+
+ if(filter != null){
+ newFilterObj.filter = filter;
+ }
+ }
+ }
+ else{
+ newFilterObj.filter_select = {
+ "row": [f_r1, f_r2],
+ "column": [f_c1, f_c2]
+ }
+
+ if(filter != null){
+ newFilterObj.filter = filter;
+ }
+ }
+ }
+ }
+
+ if(newFilterObj != null && newFilterObj.filter != null){
+ cfg["rowhidden"] = {};
+
+ for(let k in newFilterObj.filter){
+ let f_rowhidden = newFilterObj.filter[k].rowhidden;
+
+ for(let n in f_rowhidden){
+ cfg["rowhidden"][n] = 0;
+ }
+ }
+ }
+ else{
+ delete cfg["rowhidden"];
+ }
+
+ //条件格式配置变动
+ let CFarr = file.luckysheet_conditionformat_save;
+ let newCFarr = [];
+ if(CFarr != null && CFarr.length > 0){
+ for(let i = 0; i < CFarr.length; i++){
+ let cf_range = CFarr[i].cellrange;
+ let cf_new_range = [];
+
+ for(let j = 0; j < cf_range.length; j++){
+ let CFr1 = cf_range[j].row[0],
+ CFr2 = cf_range[j].row[1],
+ CFc1 = cf_range[j].column[0],
+ CFc2 = cf_range[j].column[1];
+
+ if(!(str > CFr2 || edr < CFr1) || !(stc > CFc2 || edc < CFc1)){
+ let range = conditionformat.CFSplitRange(
+ cf_range[j],
+ { "row": [str, edr], "column": [stc, edc] },
+ { "row": [str, edr], "column": [stc, edc] },
+ "restPart"
+ );
+
+ cf_new_range.concat(range);
+ }
+ else{
+ cf_new_range.push(cf_range[j]);
+ }
+ }
+
+ if(cf_new_range.length > 0){
+ let cf = $.extend(true, {}, CFarr[i]);
+ cf.cellrange = cf_new_range;
+
+ newCFarr.push(cf);
+ }
+ }
+ }
+
+ //边框配置变动
+ if(cfg["borderInfo"] && cfg["borderInfo"].length > 0){
+ let borderInfo = [];
+
+ for(let i = 0; i < cfg["borderInfo"].length; i++){
+ let rangeType = cfg["borderInfo"][i].rangeType;
+
+ if(rangeType == "range"){
+ let borderRange = cfg["borderInfo"][i].range;
+
+ let emptyRange = [];
+
+ for(let j = 0; j < borderRange.length; j++){
+ let bd_r1 = borderRange[j].row[0],
+ bd_r2 = borderRange[j].row[1],
+ bd_c1 = borderRange[j].column[0],
+ bd_c2 = borderRange[j].column[1];
+
+ if(!(str > bd_r2 || edr < bd_r1) || !(stc > bd_c2 || edc < bd_c1)){
+ let range = conditionformat.CFSplitRange(
+ borderRange[j],
+ { "row": [str, edr], "column": [stc, edc] },
+ { "row": [str, edr], "column": [stc, edc] },
+ "restPart"
+ );
+
+ emptyRange.concat(range);
+ }
+ else{
+ emptyRange.push(borderRange[j]);
+ }
+ }
+
+ if(emptyRange.length > 0){
+ let bd_obj = {
+ "rangeType": "range",
+ "borderType": cfg["borderInfo"][i].borderType,
+ "style": cfg["borderInfo"][i].style,
+ "color": cfg["borderInfo"][i].color,
+ "range": emptyRange
+ }
+
+ borderInfo.push(bd_obj);
+ }
+ }
+ else if(rangeType == "cell"){
+ let row_index = cfg["borderInfo"][i].value.row_index;
+ let col_index = cfg["borderInfo"][i].value.col_index;
+
+ if(row_index < str || col_index < stc){
+ borderInfo.push(cfg["borderInfo"][i]);
+ }
+ else if(row_index > edr || col_index > edc){
+ if(row_index > edr){
+ row_index -= rlen;
+ cfg["borderInfo"][i].value.row_index = row_index;
+ }
+
+ if(col_index > edc){
+ col_index -= clen;
+ cfg["borderInfo"][i].value.col_index = col_index;
+ }
+
+ borderInfo.push(cfg["borderInfo"][i]);
+ }
+ }
+ }
+
+ cfg["borderInfo"] = borderInfo;
+ }
+
+ //空白列模板
+ let addcol = [];
+ for (let c = stc; c <= edc; c++) {
+ addcol.push(null);
+ }
+
+ if(type == 'moveUp'){//上移
+ let data = [];
+
+ for(let r = str; r <= d.length - 1; r++){
+ let row = [];
+
+ for(let c = stc; c <= edc; c++){
+ row.push(d[r][c]);
+ }
+
+ data.push(row);
+ }
+
+ data.splice(0, rlen);
+
+ //空白行模板
+ let addrow = [];
+ for (let r = str; r <= edr; r++) {
+ addrow.push(addcol);
+ }
+
+ data = data.concat(addrow);
+
+ for(let r = str; r <= d.length - 1; r++){
+ for(let c = stc; c <= edc; c++){
+ d[r][c] = data[r - str][c - stc];
+ }
+ }
+ }
+ else if(type == 'moveLeft'){//左移
+ for(let r = str; r <= edr; r++){
+ d[r].splice(stc, clen);
+ d[r] = d[r].concat(addcol);
+ }
+ }
+
+ jfrefreshgrid_deleteCell(
+ d,
+ cfg,
+ { type: type, 'str': str, 'edr': edr, 'stc': stc, 'edc': edc },
+ newCalcChain,
+ newFilterObj,
+ newCFarr
+ );
+}
+
export {
luckysheetextendtable,
luckysheetextendData,
luckysheetdeletetable,
+ luckysheetDeleteCell,
}
\ No newline at end of file
diff --git a/src/global/refresh.js b/src/global/refresh.js
index 274953b..a6b7d7b 100644
--- a/src/global/refresh.js
+++ b/src/global/refresh.js
@@ -519,6 +519,162 @@ function jfrefreshgrid_adRC(data, cfg, ctrlType, ctrlValue, calc, filterObj, cf,
jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
}
+//删除单元格 刷新表格
+function jfrefreshgrid_deleteCell(data, cfg, ctrl, calc, filterObj, cf){
+ let file = Store.luckysheetfile[getSheetIndex(Store.currentSheetIndex)];
+
+ //merge改变对应的单元格值改变
+ let mcData = [];
+ if(JSON.stringify(cfg["merge"]) == "{}"){
+ for(let r = 0; r < data.length; r++){
+ for(let c = 0; c < data[0].length; c++){
+ let cell = data[r][c];
+
+ if(cell != null && cell.mc != null){
+ delete cell.mc;
+ mcData.push({ "r": r, "c": c });
+ }
+ }
+ }
+ }
+ else{
+ for(let m in cfg["merge"]){
+ let mc = cfg["merge"][m];
+
+ for(let r = mc.r; r <= mc.r + mc.rs - 1; r++){
+ for(let c = mc.c; c <= mc.c + mc.cs - 1; c++){
+ if(data[r][c] == null){
+ data[r][c] = {};
+ }
+
+ if(r == mc.r && c == mc.c){
+ data[r][c].mc = mc;
+ }
+ else{
+ data[r][c].mc = { "r": mc.r, "c": mc.c };
+ }
+
+ mcData.push({ "r": r, "c": c });
+ }
+ }
+ }
+ }
+
+ //公式链中公式范围改变对应单元格值的改变
+ let funcData = [];
+ if(calc.length > 0){
+ formula.execFunctionGroupData = data;
+
+ for(let i = 0; i < calc.length; i++){
+ let clc = calc[i];
+ let clc_r = clc.r, clc_c = clc.c, clc_i = clc.index, clc_funcStr = clc.func[2];
+ let clc_result = formula.execfunction(clc_funcStr, clc_r, clc_c, null, true);
+ clc.func = clc_result;
+
+ if(data[clc_r][clc_c].f == clc_funcStr){
+ setcellvalue(clc_r, clc_c, data, clc_result[1]);
+ funcData.push({ "r": clc_r, "c": clc_c });
+ }
+ }
+ }
+
+ if(Store.clearjfundo){
+ Store.jfundo = [];
+
+ Store.jfredo.push({
+ "type": "deleteCell",
+ "sheetIndex": Store.currentSheetIndex,
+ "ctrl": ctrl,
+ "data": Store.flowdata,
+ "curData": data,
+ "config": $.extend(true, {}, Store.config),
+ "curConfig": cfg,
+ "mcData": mcData,
+ "calc": $.extend(true, [], file.calcChain),
+ "curCalc": calc,
+ "funcData": funcData,
+ "filterObj": { "filter_select": $.extend(true, {}, file.filter_select), "filter": $.extend(true, {}, file.filter) },
+ "curFilterObj": filterObj,
+ "cf": $.extend(true, [], file.luckysheet_conditionformat_save),
+ "curCf": cf,
+ });
+ }
+
+ //Store.flowdata
+ Store.flowdata = data;
+ editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
+ file.data = data;
+
+ //共享编辑模式
+ if(server.allowUpdate){
+ let type = ctrl.type,
+ str = ctrl.str,
+ edr = ctrl.edr,
+ stc = ctrl.stc,
+ edc = ctrl.edc;
+
+ let range;
+ if(type == 'moveUp'){
+ range = {
+ "row": [str, data.length - 1],
+ "column": [stc, edc]
+ }
+ }
+ else if(type == 'moveLeft'){
+ range = {
+ "row": [str, edr],
+ "column": [stc, data[0].length - 1]
+ };
+ }
+
+ server.historyParam(Store.flowdata, Store.currentSheetIndex, range);
+ }
+
+ //config
+ Store.config = cfg;
+ file.config = Store.config;
+ server.saveParam("all", Store.currentSheetIndex, cfg, { "k": "config" });
+
+ //mcData
+ for(let i = 0; i < mcData.length; i++){
+ let mcData_r = mcData[i].r,
+ mcData_c = mcData[i].c;
+
+ server.saveParam("v", Store.currentSheetIndex, Store.flowdata[mcData_r][mcData_c], { "r": mcData_r, "c": mcData_c });
+ }
+
+ //calc函数链
+ file.calcChain = calc;
+ server.saveParam("all", Store.currentSheetIndex, calc, { "k": "calcChain" });
+ for(let i = 0; i < funcData.length; i++){
+ let funcData_r = funcData[i].r,
+ funcData_c = funcData[i].c;
+
+ server.saveParam("v", Store.currentSheetIndex, Store.flowdata[funcData_r][funcData_c], { "r": funcData_r, "c": funcData_c });
+ }
+
+ //筛选配置
+ if(filterObj != null){
+ file.filter_select = filterObj.filter_select;
+ file.filter = filterObj.filter;
+ }
+ else{
+ file.filter_select = null;
+ file.filter = null;
+ }
+ createFilterOptions(file.filter_select, file.filter);
+ server.saveParam("all", Store.currentSheetIndex, file.filter_select, { "k": "filter_select" });
+ server.saveParam("all", Store.currentSheetIndex, file.filter, { "k": "filter" });
+
+ //条件格式配置
+ file.luckysheet_conditionformat_save = cf;
+ server.saveParam("all", Store.currentSheetIndex, file.luckysheet_conditionformat_save, { "k": "luckysheet_conditionformat_save" });
+
+ setTimeout(function () {
+ luckysheetrefreshgrid();
+ }, 1);
+}
+
//复制剪切 刷新表格
function jfrefreshgrid_pastcut(source, target, RowlChange){
//单元格数据更新联动
@@ -1002,6 +1158,7 @@ export {
jfrefreshgridall,
jfrefreshrange,
jfrefreshgrid_adRC,
+ jfrefreshgrid_deleteCell,
jfrefreshgrid_pastcut,
jfrefreshgrid_rhcw,
luckysheetrefreshgrid,
diff --git a/src/global/rhchInit.js b/src/global/rhchInit.js
index 90066fa..f8622b3 100644
--- a/src/global/rhchInit.js
+++ b/src/global/rhchInit.js
@@ -8,21 +8,19 @@ export default function rhchInit(rowheight, colwidth) {
Store.visibledatarow = [];
Store.rh_height = 0;
- for (let i = 0; i < rowheight; i++) {
+ for (let r = 0; r < rowheight; r++) {
let rowlen = Store.defaultrowlen;
- if (Store.config["rowlen"] != null && Store.config["rowlen"][i] != null) {
- rowlen = Store.config["rowlen"][i];
+ if (Store.config["rowlen"] != null && Store.config["rowlen"][r] != null) {
+ rowlen = Store.config["rowlen"][r];
}
- if (Store.config["rowhidden"] != null && Store.config["rowhidden"][i] != null) {
- rowlen = Store.config["rowhidden"][i];
+ if (Store.config["rowhidden"] != null && Store.config["rowhidden"][r] != null) {
Store.visibledatarow.push(Store.rh_height);
continue;
}
- else {
- Store.rh_height += Math.round((rowlen + 1)*Store.zoomRatio);
- }
+
+ Store.rh_height += Math.round((rowlen + 1) * Store.zoomRatio);
Store.visibledatarow.push(Store.rh_height); //行的临时长度分布
}
@@ -37,14 +35,14 @@ export default function rhchInit(rowheight, colwidth) {
let maxColumnlen = 120;
- for (let i = 0; i < colwidth; i++) {
+ for (let c = 0; c < colwidth; c++) {
let firstcolumnlen = Store.defaultcollen;
- if (Store.config["columnlen"] != null && Store.config["columnlen"][i] != null) {
- firstcolumnlen = Store.config["columnlen"][i];
+ if (Store.config["columnlen"] != null && Store.config["columnlen"][c] != null) {
+ firstcolumnlen = Store.config["columnlen"][c];
}
else {
- if (Store.flowdata[0] != null && Store.flowdata[0][i] != null) {
+ if (Store.flowdata[0] != null && Store.flowdata[0][c] != null) {
if (firstcolumnlen > 300) {
firstcolumnlen = 300;
}
@@ -57,11 +55,16 @@ export default function rhchInit(rowheight, colwidth) {
Store.config["columnlen"] = {};
}
- Store.config["columnlen"][i] = firstcolumnlen;
+ Store.config["columnlen"][c] = firstcolumnlen;
}
}
}
+ if(Store.config["colhidden"] != null && Store.config["colhidden"][c] != null){
+ Store.visibledatacolumn.push(Store.ch_width);
+ continue;
+ }
+
Store.ch_width += Math.round((firstcolumnlen + 1)*Store.zoomRatio);
Store.visibledatacolumn.push(Store.ch_width);//列的临时长度分布
diff --git a/src/locale/en.js b/src/locale/en.js
index 824cd48..6897422 100644
--- a/src/locale/en.js
+++ b/src/locale/en.js
@@ -492,15 +492,18 @@ export default {
paste: 'Paste',
insert: 'Insert',
delete: 'Delete',
+ deleteCell: 'Delete cell',
deleteSelected: 'Delete selected ',
hide: 'Hide',
hideSelected: 'Hide selected ',
- showHide: 'Show hide',
+ showHide: 'Show hide ',
to: 'Towards',
left: 'Left',
right: 'Right',
top: 'Top',
bottom: 'Bottom',
+ moveLeft: 'Move left',
+ moveUp: 'Move up',
add: 'Add',
row: 'Row',
column: 'Column',
diff --git a/src/locale/zh.js b/src/locale/zh.js
index e76c2d7..6efde0d 100644
--- a/src/locale/zh.js
+++ b/src/locale/zh.js
@@ -509,6 +509,7 @@ export default {
paste: '粘贴',
insert: '插入',
delete: '删除',
+ deleteCell: '删除单元格',
deleteSelected: '删除选中',
hide: '隐藏',
hideSelected: '隐藏选中',
@@ -518,6 +519,8 @@ export default {
right: '右',
top: '上',
bottom: '下',
+ moveLeft: '左移',
+ moveUp: '上移',
add: '增加',
row: '行',
column: '列',