From 66aecbe7fe16be03c9c62e1ebbf941c1a9f4bac7 Mon Sep 17 00:00:00 2001 From: lrz <1414556676@qq.com> Date: Fri, 11 Sep 2020 21:16:16 +0800 Subject: [PATCH] feat(api): api setCellValue --- README-zh.md | 3 +- README.md | 3 +- docs/zh/guide/api.md | 193 +++++++++++++++++++---- docs/zh/guide/sheet.md | 42 ++++- src/core.js | 3 +- src/function/functionlist.js | 1 - src/global/api.js | 294 +++++++++++++++++++---------------- src/global/formula.js | 82 +++++++++- 8 files changed, 441 insertions(+), 180 deletions(-) diff --git a/README-zh.md b/README-zh.md index ebe5d23..e3de471 100644 --- a/README-zh.md +++ b/README-zh.md @@ -10,10 +10,11 @@ 🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。 ## 文档 -[在线demo](https://mengshukeji.github.io/LuckysheetDemo/) [在线文档](https://mengshukeji.github.io/LuckysheetDocs/zh/) +[在线demo](https://mengshukeji.github.io/LuckysheetDemo/) / [导入excel demo](https://mengshukeji.github.io/LuckyexcelDemo/) +  ## 插件 diff --git a/README.md b/README.md index c3003d8..bdfcb80 100644 --- a/README.md +++ b/README.md @@ -16,10 +16,11 @@ English| [简体中文](./README-zh.md) 🚀Luckysheet is an online spreadsheet like excel that is powerful, simple to configure, and completely open source. ## Documentation -[Online demo](https://mengshukeji.github.io/LuckysheetDemo/) [Online documentation](https://mengshukeji.github.io/LuckysheetDocs/) +[Online demo](https://mengshukeji.github.io/LuckysheetDemo/) / [Import excel demo](https://mengshukeji.github.io/LuckyexcelDemo/) +  ## Plugins diff --git a/docs/zh/guide/api.md b/docs/zh/guide/api.md index df06f14..a4d9b00 100644 --- a/docs/zh/guide/api.md +++ b/docs/zh/guide/api.md @@ -10,7 +10,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ## 单元格操作 ### getCellValue(row, column [,setting])
-- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -39,7 +39,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setCellValue(row, column, value [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -48,6 +48,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 - {Object | String | Number} [value]: 要设置的值;可以为字符串或数字,或为符合Luckysheet单元格格式的对象,参考 [单元格属性表](/zh/guide/cell.html) - {PlainObject} [setting]: 可选参数 + {Number} [order]: 工作表索引;默认值为当前工作表索引 + + {Boolean} [isRefresh]: 是否刷新界面;默认为`true`;用于多个单元格赋值时候控制节流,前面单元格赋值的时候应设置为 `false`,最后一个单元格赋值时设置为`true`。 + {Function} [success]: 操作结束的回调函数 - **说明**: @@ -58,13 +59,23 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 - **示例**: - - 设置当前工作表"A1"单元格的值为"abc" - `luckysheet.setCellValue(0, 0, 'abc');` + - 设置当前工作表"A1"单元格的值为"1" + `luckysheet.setCellValue(0, 0, 1);` + + - 设置当前工作表"B1"单元格的值为公式"=sum(A1)" + `luckysheet.setCellValue(0, 1, "=sum(A1)");` + + - 设置当前工作表"C1"单元格的值为公式"=sum(A1:B1",并带有红色背景,单元格对象可以不带v和m值,Luckysheet会根据公式信息自动计算结果,如果带了未更新或者是非公式结果的v和m值,Luckysheet也仍然会根据公式实际关联的数据计算出准备的结果。 + `luckysheet.setCellValue(0, 2, {f: "=sum(A1:B1)", bg:"#FF0000"})` + + 再次设置"C1"单元格新的公式仍然可以生效 + + `luckysheet.setCellValue(0, 2, {f: "=sum(A1)", bg:"#00FF00"})` ------------ ### clearCell(row, column [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -86,7 +97,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### deleteCell(move, row, column [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: - {String} [move]: 删除后,右侧还是下方的单元格移动 @@ -114,7 +125,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setCellFormat(row, column, attr, value [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -157,7 +168,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### find(content [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -180,7 +191,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### replace(content, replaceContent [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -207,7 +218,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ## 行和列操作 ### setHorizontalFrozen(isRange [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -240,7 +251,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setVerticalFrozen(isRange [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -269,7 +280,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setBothFrozen(isRange [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -298,7 +309,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### cancelFrozen([setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -319,7 +330,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### insertRow(row [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -343,7 +354,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### insertColumn( column [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -367,7 +378,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### deleteRow(rowStart, rowEnd [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -393,7 +404,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### deleteColumn(columnStart, columnEnd [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -419,7 +430,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### hideRow(rowStart, rowEnd [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -445,7 +456,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### hideColumn(columnStart, columnEnd [,setting])(TODO) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -471,7 +482,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### showRow(rowStart, rowEnd [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -495,7 +506,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### showColumn(columnStart, columnEnd [,setting])(TODO) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -521,7 +532,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ## 选区操作 ### getRange() -- [x] $\color{#FF3030}已实现$ + - **说明**: @@ -544,7 +555,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### getRangeValue([setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -630,6 +641,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getRangeHtml([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -677,7 +691,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### getRangeJson(title [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -723,7 +737,10 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### getRangeArray(dimensional [,setting]) -- [ ] $\color{green} TODO$ + +[todo] + + - **参数**: @@ -819,7 +836,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### getRangeDiagonal(type [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -899,7 +916,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### getRangeBoolean([setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -929,6 +946,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setRangeShow(range [,setting]) +[todo] + + - **参数**: - {Array | Object | String} [range]: 选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,允许多个选区组成的数组;默认为当前选区 @@ -967,7 +987,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setRangeValue(data [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -975,6 +995,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 - {PlainObject} [setting]: 可选参数 + {Array | Object | String} [range]: 选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区 + {Number} [order]: 工作表索引;默认值为当前工作表索引 + + {Boolean} [isRefresh]: 是否刷新界面;默认为`true`;用于多个单元格赋值时候控制节流,前面单元格赋值的时候应设置为 `false`,最后一个单元格赋值时设置为`true`。 + {Function} [success]: 操作结束的回调函数 - **说明**: @@ -1032,7 +1053,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setRangeFormat(attr, value [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -1074,6 +1095,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setRangeFilter(type [,setting]) +[todo] + + - **参数**: - {String} [type]: 打开还是关闭筛选功能 @@ -1098,7 +1122,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setRangeMerge(type [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -1152,7 +1176,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### cancelRangeMerge( [setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -1174,7 +1198,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setRangeSort(type [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -1203,7 +1227,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ------------ ### setRangeSortMulti(title, sort [,setting]) -- [x] $\color{#FF3030}已实现$ + - **参数**: @@ -1228,6 +1252,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setRangeConditionalFormatDefault(conditionName, conditionValue [,setting]) +[todo] + + - **参数**: - {String} [conditionName]: 条件格式规则类型 @@ -1330,6 +1357,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setRangeConditionalFormat(type [,setting]) +[todo] + + - **参数**: - {String} [type]: 条件格式规则类型 @@ -1448,6 +1478,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### deleteRangeConditionalFormat(itemIndex [,setting]) +[todo] + + - **参数**: - {Number} [itemIndex]: 条件格式规则索引 @@ -1470,6 +1503,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### clearRange([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1490,6 +1526,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### deleteRange(move [,setting]) +[todo] + + - **参数**: - {String} [move]: 删除后,右侧还是下方的单元格移动 @@ -1516,6 +1555,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### insertRange(move [,setting]) +[todo] + + - **参数**: - {String} [move]: 活动单元格右移或者下移 @@ -1549,6 +1591,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### matrixOperation(type [,setting]) +[todo] + + - **参数**: - {String} [type]: 矩阵操作的类型 @@ -1591,6 +1636,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### matrixCalculation(type, number [,setting]) +[todo] + + - **参数**: - {String} [type]: 计算方式 @@ -1633,6 +1681,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getAllSheets() +[todo] + + - **说明**: 返回所有工作表配置,格式同[工作表配置](/zh/guide/sheet.html),得到的结果可用于表格初始化时作为`options.data`使用。 @@ -1648,6 +1699,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getLuckysheetfile() +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1666,6 +1720,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getSheetData([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1679,6 +1736,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getConfig([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1692,6 +1752,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setConfig([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1706,6 +1769,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetAdd([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1726,6 +1792,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetDelete([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1745,6 +1814,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetCopy([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1765,6 +1837,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetHide([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1786,6 +1861,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetShow([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1805,6 +1883,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetActive(order [,setting]) +[todo] + + - **参数**: - {Number} [order]: 要激活的工作表索引 @@ -1824,6 +1905,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetName(name [,setting]) +[todo] + + - **参数**: - {String} [name]: 新的工作表名称 @@ -1844,6 +1928,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetColor(color [,setting]) +[todo] + + - **参数**: - {String} [color]: 工作表颜色 @@ -1864,6 +1951,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetMove(type [,setting]) +[todo] + + - **参数**: - {String | Number} [type]: 工作表移动方向或者移动的目标索引, @@ -1891,6 +1981,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setSheetOrder(orderList [,setting]) +[todo] + + - **参数**: - {Array} [orderList]: 工作表顺序,设置工作表的index和order来指定位置,如: @@ -1943,6 +2036,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### refresh([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1969,6 +2065,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getScreenshot([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -1983,6 +2082,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setWorkbookName(name [,setting]) +[todo] + + - **参数**: - {Number} [name]: 工作簿名称 @@ -1997,6 +2099,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### undo([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -2010,6 +2115,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### redo([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -2025,6 +2133,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### insertChart([setting]) +[todo] + + - **参数**: - {PlainObject} [setting]: 可选参数 @@ -2040,6 +2151,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### setChart(chartId, attr, value [,setting]) +[todo] + + - **参数**: - {String} [chartId]: 指定要修改的图表id @@ -2065,6 +2179,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### getChart(chartId) +[todo] + + - **参数**: - {String} [chartId]: 指定要获取的图表id @@ -2077,6 +2194,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### deleteChart(chartId [,setting]) +[todo] + + - **参数**: - {String} [chartId]: 要删除的图表id @@ -2094,6 +2214,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### transToCellData(data [,setting]) +[todo] + + - **参数**: - {Array} [data]: data数据 @@ -2109,6 +2232,8 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### transToData(celldata [,setting]) +[todo] + - **参数**: - {Array} [celldata]: data数据 @@ -2124,6 +2249,8 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开 ### toJson() +[todo] + - **说明**: 导出的json字符串可以直接当作`luckysheet.create(options)`初始化工作簿时的参数`options`使用,使用场景在用户自己操作表格后想要手动保存全部的参数,再去别处初始化这个表格使用,类似一个luckysheet专有格式的导入导出。 diff --git a/docs/zh/guide/sheet.md b/docs/zh/guide/sheet.md index 3417dc2..e16f3c0 100644 --- a/docs/zh/guide/sheet.md +++ b/docs/zh/guide/sheet.md @@ -41,6 +41,7 @@ options.data示例如下: "chart": [], //图表配置 "allowEdit": true, //是否允许编辑 "zoomRatio":1, // 缩放比例 + "image":[], //图片 }, { "name": "Sheet2", @@ -381,7 +382,10 @@ options.data示例如下: ### calcChain - 类型:Array - 默认值:[] -- 作用: 公式链,用于公式所链接的单元格改变后,所有引用此单元格的公式都会联动刷新 +- 作用: 公式链是一个由用户指定顺序排列的公式信息数组,Luckysheet会根据此顺序来决定公式执行的顺序。 + + 注意,在初始化工作簿的时候,如果有单元格包含公式,请务必添加对应单元格位置的公式链,否则Luckysheet无法识别公式。 + - 示例: ```js [{ @@ -1206,6 +1210,42 @@ options.data示例如下: - 作用: 此sheet页的缩放比例,为0~1之间的二位小数数字。比如`0.1`、`0.56` ------------ +### image +- 类型:Array +- 默认值:[] +- 作用: 插入表格中图片信息,包含图片地址、宽高、位置、裁剪等信息 +- 示例: + 以下为一个`imageItem`案例,通常一个工作表中可能存在多个图片,所以`image`的格式为数组`[imageItem,imageItem,...]` + ```json + { + type: '3', //1移动并调整单元格大小 2移动并且不调整单元格的大小 3不要移动单元格并调整其大小 + src: '', //图片url + originWidth: 1484, //图片原始宽度 + originHeight: 834, //图片原始高度 + default: { + width: 293, //图片 宽度 + height: 196, //图片 高度 + left: 409, //图片离表格左边的 位置 + top: 248, //图片离表格顶部的 位置 + }, + crop: { + width: 293, //图片裁剪后 宽度 + height: 196, //图片裁剪后 高度 + offsetLeft: 0, //图片裁剪后离未裁剪时 左边的位移 + offsetTop: 0, //图片裁剪后离未裁剪时 顶部的位移 + }, + isFixedPos: false, //固定位置 + fixedLeft: 507, //固定位置 左位移 + fixedTop: 141, //固定位置 右位移 + border: { + width: 0, //边框宽度 + radius: 0, //边框半径 + style: 'solid', //边框类型 + color: '#000', //边框颜色 + } + } + ``` +------------ ## 调试信息 diff --git a/src/core.js b/src/core.js index f0b6e89..897d765 100644 --- a/src/core.js +++ b/src/core.js @@ -37,7 +37,8 @@ import * as api from './global/api'; let luckysheet = {}; // mount api -luckysheet.api = api; +// luckysheet.api = api; +Object.assign(luckysheet, api); //创建luckysheet表格 luckysheet.create = function (setting) { diff --git a/src/function/functionlist.js b/src/function/functionlist.js index 00f2016..071636c 100644 --- a/src/function/functionlist.js +++ b/src/function/functionlist.js @@ -1,6 +1,5 @@ import functionImplementation from './functionImplementation'; import Store from '../store/index' - //{"0":"数学","1":"统计","2":"查找","3":"Luckysheet内置","4":"数据挖掘","5":"数据源","6":"日期","7":"过滤器","8":"财务","9":"工程计算","10":"逻辑","11":"运算符","12":"文本","13":"转换工具","14":"数组"} const functionlist_zh = [{ 'n': 'SUMIF', diff --git a/src/global/api.js b/src/global/api.js index 8363b0e..878f28d 100644 --- a/src/global/api.js +++ b/src/global/api.js @@ -20,6 +20,7 @@ import json from "./json"; import { orderbydata } from "./sort"; import editor from "./editor"; import { rowlenByRange } from "./getRowlen"; +import luckysheetformula from './formula' const IDCardReg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i; @@ -68,6 +69,9 @@ export function getCellValue(row, column, options = {}) { /** * 设置单元格的值 + * + * 关键点:如果设置了公式,则需要更新公式链insertUpdateFunctionGroup,如果设置了不是公式,判断之前是公式,则需要清除公式delFunctionGroup + * * @param {Number} row 单元格所在行数;从0开始的整数,0表示第一行 * @param {Number} column 单元格所在列数;从0开始的整数,0表示第一列 * @param {Object | String | Number} value 要设置的值;可以为字符串或数字,或为符合Luckysheet单元格格式的对象 @@ -75,6 +79,156 @@ export function getCellValue(row, column, options = {}) { * @param {Number} options.order 工作表索引;默认值为当前工作表索引 * @param {Function} options.success 操作结束的回调函数 */ +// export function setCellValue(row, column, value, options = {}) { +// if (row == null && column == null) { +// return console.error('Arguments row or column cannot be null or undefined.') +// } +// let curSheetOrder = getSheetIndex(Store.currentSheetIndex); +// let { +// order = curSheetOrder, +// success +// } = {...options} +// let targetSheetData = Store.luckysheetfile[order].data; +// let cell = targetSheetData[row][column]; +// let vupdate; + +// if (getObjType(value) == 'object') { +// cell = value; + +// if (getObjType(value.v) == 'object') { +// vupdate = vaule.v.v; +// } else { +// vupdate = value.v; +// } +// } else { +// vupdate = value; +// } + +// if (isRealNull(vupdate)) { +// if (getObjType(cell) == 'object') { +// delete cell.m; +// delete cell.v; +// } else { +// cell = null; +// } +// return; +// } + +// if (isRealNull(cell)) { +// cell = {} +// } + +// if (vupdate.toString().substring(0, 1) == "'") { +// cell.m = vupdate.toString().substring(1); +// cell.ct = { "fa": "@", "t": "s" }; +// cell.v = vupdate.toString().substring(1); +// } else if (vupdate.toString().toUpperCase() === 'TRUE') { +// cell.m = "TRUE"; +// cell.ct = { "fa": "General", "t": "b" }; +// cell.v = true; +// } else if (vupdate.toString().toUpperCase() === 'FALSE') { +// cell.m = "FALSE"; +// cell.ct = { "fa": "General", "t": "b" }; +// cell.v = false; +// } else if (valueIsError(vupdate)) { +// cell.m = vupdate.toString(); +// cell.ct = { "fa": "General", "t": "e" }; +// cell.v = vupdate; +// } else { +// if (cell.f != null && isRealNum(vupdate) && !IDCardReg.test(vupdate)) { +// cell.v = parseFloat(vupdate); +// if (cell.ct == null) { +// cell.ct = { +// 'fa': 'General', +// 't': 'n' +// } +// } + +// if (cell.v == Infinity || cell.v == -Infinity) { +// cell.m = cell.v.toString(); +// } else { +// if (cell.v.toString().indexOf('e') > -1) { +// let len = cell.v.toString().split('.')[1].split('e')[0].length; +// if (len > 5) { +// len = 5; +// } + +// cell.m = cell.v.toExponential(len).toString(); +// } else { +// let v_p = Math.round(cell.v * 1000000000) / 1000000000; +// if (cell.ct == null) { +// let mask = genarate(v_p); +// cell.m = mask[0].toString(); +// } else { +// let mask = update(cell.ct.fa, v_p); +// cell.m = mask.toString(); +// } +// } +// } +// } else if (cell.ct != null && cell.ct.fa == '@') { +// cell.m = vupdate.toString(); +// cell.v = vupdate; +// } else if (cell.ct != null && cell.ct.fa != null && cell.ct.fa != 'General') { +// if (isRealNum(vupdate)) { +// vupdate = parseFloat(vupdate); +// } + +// let mask = update(cell.ct.fa, vupdate); + +// if (mask === vupdate) {// 若原来单元格格式 应用不了 要更新的值,则获取更新值的 格式 +// mask = genarate(vupdate); + +// cell.m = mask[0].toString(); +// cell.ct = mask[1]; +// cell.v = mask[2]; +// } else { +// cell.m = mask.toString(); +// cell.v = vupdate; +// } +// } else { +// if (isRealNum(vupdate) && !IDCardReg.test(vupdate)) { +// vupdate = parseFloat(vupdate); +// cell.v = parseFloat(vupdate); +// cell.ct = { +// 'fa': 'General', +// 't': 'n' +// } +// if (cell.v == Infinity || cell.v == -Infinity) { +// cell.m = cell.v.toString(); +// } else { +// let mask = genarate(cell.v); +// cell.m = mask[0].toString(); +// } +// } else { +// let mask = genarate(vupdate); +// cell.m = mask[0].toString(); +// cell.ct = mask[1]; +// cell.v = mask[2]; +// } +// } +// } +// if (!server.allowUpdate && !luckysheetConfigsetting.pointEdit) { +// if (cell.ct != null && !/^(w|W)((0?)|(0\.0+))$/.test(cell.ct.fa) && cell.ct.t == 'n' && cell.v != null && parseInt(cell.v).toString().length > 4) { +// let autoFormatw = luckysheetConfigsetting.autoFormatw.toString().toUpperCase(); +// let accuracy = luckysheetConfigsetting.accuracy; +// let sfmt = setAccuracy(autoFormatw, accuracy); + +// if (sfmt != 'General') { +// cell.ct.fa = sfmt; +// cell.m = update(sfmt, cell.v); +// } +// } +// } +// // refresh +// jfrefreshgrid(targetSheetData, { +// row: [row], +// column: [column] +// }) + +// if (success && typeof success === 'function') { +// success(); +// } +// } export function setCellValue(row, column, value, options = {}) { if (row == null && column == null) { return console.error('Arguments row or column cannot be null or undefined.') @@ -84,142 +238,10 @@ export function setCellValue(row, column, value, options = {}) { order = curSheetOrder, success } = {...options} - let targetSheetData = Store.luckysheetfile[order].data; - let cell = targetSheetData[row][column]; - let vupdate; - - if (getObjType(value) == 'object') { - cell = value; - - if (getObjType(value.v) == 'object') { - vupdate = vaule.v.v; - } else { - vupdate = value.v; - } - } else { - vupdate = value; - } - - if (isRealNull(vupdate)) { - if (getObjType(cell) == 'object') { - delete cell.m; - delete cell.v; - } else { - cell = null; - } - return; - } - - if (isRealNull(cell)) { - cell = {} - } - - if (vupdate.toString().substring(0, 1) == "'") { - cell.m = vupdate.toString().substring(1); - cell.ct = { "fa": "@", "t": "s" }; - cell.v = vupdate.toString().substring(1); - } else if (vupdate.toString().toUpperCase() === 'TRUE') { - cell.m = "TRUE"; - cell.ct = { "fa": "General", "t": "b" }; - cell.v = true; - } else if (vupdate.toString().toUpperCase() === 'FALSE') { - cell.m = "FALSE"; - cell.ct = { "fa": "General", "t": "b" }; - cell.v = false; - } else if (valueIsError(vupdate)) { - cell.m = vupdate.toString(); - cell.ct = { "fa": "General", "t": "e" }; - cell.v = vupdate; - } else { - if (cell.f != null && isRealNum(vupdate) && !IDCardReg.test(vupdate)) { - cell.v = parseFloat(vupdate); - if (cell.ct == null) { - cell.ct = { - 'fa': 'General', - 't': 'n' - } - } - - if (cell.v == Infinity || cell.v == -Infinity) { - cell.m = cell.v.toString(); - } else { - if (cell.v.toString().indexOf('e') > -1) { - let len = cell.v.toString().split('.')[1].split('e')[0].length; - if (len > 5) { - len = 5; - } - - cell.m = cell.v.toExponential(len).toString(); - } else { - let v_p = Math.round(cell.v * 1000000000) / 1000000000; - if (cell.ct == null) { - let mask = genarate(v_p); - cell.m = mask[0].toString(); - } else { - let mask = update(cell.ct.fa, v_p); - cell.m = mask.toString(); - } - } - } - } else if (cell.ct != null && cell.ct.fa == '@') { - cell.m = vupdate.toString(); - cell.v = vupdate; - } else if (cell.ct != null && cell.ct.fa != null && cell.ct.fa != 'General') { - if (isRealNum(vupdate)) { - vupdate = parseFloat(vupdate); - } - - let mask = update(cell.ct.fa, vupdate); - - if (mask === vupdate) {// 若原来单元格格式 应用不了 要更新的值,则获取更新值的 格式 - mask = genarate(vupdate); - - cell.m = mask[0].toString(); - cell.ct = mask[1]; - cell.v = mask[2]; - } else { - cell.m = mask.toString(); - cell.v = vupdate; - } - } else { - if (isRealNum(vupdate) && !IDCardReg.test(vupdate)) { - vupdate = parseFloat(vupdate); - cell.v = parseFloat(vupdate); - cell.ct = { - 'fa': 'General', - 't': 'n' - } - if (cell.v == Infinity || cell.v == -Infinity) { - cell.m = cell.v.toString(); - } else { - let mask = genarate(cell.v); - cell.m = mask[0].toString(); - } - } else { - let mask = genarate(vupdate); - cell.m = mask[0].toString(); - cell.ct = mask[1]; - cell.v = mask[2]; - } - } - } - if (!server.allowUpdate && !luckysheetConfigsetting.pointEdit) { - if (cell.ct != null && !/^(w|W)((0?)|(0\.0+))$/.test(cell.ct.fa) && cell.ct.t == 'n' && cell.v != null && parseInt(cell.v).toString().length > 4) { - let autoFormatw = luckysheetConfigsetting.autoFormatw.toString().toUpperCase(); - let accuracy = luckysheetConfigsetting.accuracy; - let sfmt = setAccuracy(autoFormatw, accuracy); - - if (sfmt != 'General') { - cell.ct.fa = sfmt; - cell.m = update(sfmt, cell.v); - } - } - } - // refresh - jfrefreshgrid(targetSheetData, { - row: [row], - column: [column] - }) + + + luckysheetformula.updatecell(row, column, value); + if (success && typeof success === 'function') { success(); diff --git a/src/global/formula.js b/src/global/formula.js index 40c5e8d..c4f0955 100644 --- a/src/global/formula.js +++ b/src/global/formula.js @@ -1189,13 +1189,15 @@ const luckysheetformula = { "opacity": "0.13" }); }, - updatecell: function(r, c) { + updatecell: function(r, c, value) { let _this = this; - let $input = $("#luckysheet-rich-text-editor"), - value = $input.text(); + let $input = $("#luckysheet-rich-text-editor"); + + // API, we get value from user + value = value || $input.text(); - if (_this.rangetosheet != Store.currentSheetIndex) { + if (_this.rangetosheet != null && _this.rangetosheet != Store.currentSheetIndex) { sheetmanage.changeSheetExec(_this.rangetosheet); } @@ -1218,7 +1220,7 @@ const luckysheetformula = { } } - if (value.slice(0, 1) == "=" && value.length > 1) { + if (getObjType(value) == "string" && value.slice(0, 1) == "=" && value.length > 1) { } else if(getObjType(curv) == "object" && curv.ct != null && curv.ct.fa != null && curv.ct.fa != "@" && !isRealNull(value)){ @@ -1257,6 +1259,42 @@ const luckysheetformula = { } } } + // from API setCellValue,luckysheet.setCellValue(0, 0, {f: "=sum(D1)", bg:"#0188fb"}),value is an object, so get attribute f as value + else if(getObjType(value) == "object"){ + let valueFunction = value.f; + + if(getObjType(valueFunction) == "string" && valueFunction.slice(0, 1) == "=" && valueFunction.length > 1){ + let v = _this.execfunction(valueFunction, r, c, true); + + // get v/m/ct + curv = _this.execFunctionGroupData[r][c]; + + // get f + curv.f = v[2]; + + // get other cell style attribute + delete value.v; + delete value.m; + delete value.f; + Object.assign(curv,value); + + //打进单元格的sparklines的配置串, 报错需要单独处理。 + if(v.length == 4 && v[3].type == "sparklines"){ + delete curv.m; + delete curv.v; + + let curCalv = v[3].data; + + if(getObjType(curCalv) == "array" && getObjType(curCalv[0]) != "object"){ + curv.v = curCalv[0]; + } + else{ + curv.spl = v[3].data; + } + } + } + + } else{ _this.delFunctionGroup(r, c); _this.execFunctionGroup(r, c, value); @@ -1266,7 +1304,7 @@ const luckysheetformula = { delete curv.f; delete curv.spl; - if(curv.qp == 1 && value.substr(0,1)!="'"){//if quotePrefix is 1, cell is force string, cell clear quotePrefix when it is updated + if(curv.qp == 1 && ('' + value).substr(0,1)!="'"){//if quotePrefix is 1, cell is force string, cell clear quotePrefix when it is updated curv.qp = 0; if(curv.ct!=null){ curv.ct.fa = "General"; @@ -1298,6 +1336,36 @@ const luckysheetformula = { } } } + // from API setCellValue,luckysheet.setCellValue(0, 0, {f: "=sum(D1)", bg:"#0188fb"}),value is an object, so get attribute f as value + else if(getObjType(value) == "object"){ + let valueFunction = value.f; + + if(getObjType(valueFunction) == "string" && valueFunction.slice(0, 1) == "=" && valueFunction.length > 1){ + let v = _this.execfunction(valueFunction, r, c, true); + + // value = { + // "v": v[1], + // "f": v[2] + // }; + + // update attribute v + value.v = v[1]; + value.f = v[2]; + + //打进单元格的sparklines的配置串, 报错需要单独处理。 + if(v.length == 4 && v[3].type == "sparklines"){ + let curCalv = v[3].data; + + if(getObjType(curCalv) == "array" && getObjType(curCalv[0]) != "object"){ + value.v = curCalv[0]; + } + else{ + value.spl = v[3].data; + } + } + } + + } else{ _this.delFunctionGroup(r, c); _this.execFunctionGroup(r, c, value); @@ -1305,6 +1373,7 @@ const luckysheetformula = { } } + // value maybe an object setcellvalue(r, c, d, value); _this.cancelNormalSelected(); @@ -4451,6 +4520,7 @@ const luckysheetformula = { this.execFunctionGroup(); } }, + // When set origin_r and origin_c, that mean just refresh cell value link to [origin_r,origin_c] cell execFunctionGroup: function(origin_r, origin_c, value, index, data, isForce=false) { let _this = this;