danny 5 years ago
parent
commit
147afb6236
  1. 21
      README-zh.md
  2. 22
      README.md
  3. 7
      docs/guide/FAQ.md
  4. 28
      docs/guide/README.md
  5. 7
      docs/zh/guide/FAQ.md
  6. 29
      docs/zh/guide/README.md
  7. 178
      docs/zh/guide/api.md
  8. 11
      docs/zh/guide/cell.md
  9. 465
      docs/zh/guide/config.md
  10. 42
      docs/zh/guide/sheet.md
  11. 25
      src/controllers/handler.js
  12. 12
      src/controllers/menuButton.js
  13. 3
      src/core.js
  14. 2
      src/function/functionImplementation.js
  15. 1
      src/function/functionlist.js
  16. 1585
      src/global/api.js
  17. 1395
      src/global/draw.js
  18. 11
      src/global/editor.js
  19. 82
      src/global/formula.js
  20. 1292
      src/global/getRowlen.js
  21. 15
      src/global/getdata.js
  22. 83
      src/index.html
  23. 1
      src/store/index.js

21
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/)
![演示](/docs/.vuepress/public/img/LuckysheetDemo.gif)
## 插件
@ -123,23 +124,21 @@ npm run build
## 用法
#### 第一步
`npm run build`后`dist`文件夹下的所有文件复制到项目目录
通过CDN引入依赖
#### 第二步
引入依赖
```
<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./plugins/plugins.css' />
<link rel='stylesheet' href='./css/luckysheet.css' />
<script src="./plugins/js/plugin.js"></script>
<script src="./luckysheet.umd.js"></script>
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' />
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>
```
#### 第
#### 第
指定一个表格容器
```
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;"></div>
```
#### 第
#### 第
创建一个表格
```
<script>

22
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/)
![Demo](/docs/.vuepress/public/img/LuckysheetDemo.gif)
## Plugins
@ -129,23 +130,20 @@ npm run build
## Usage
#### First step
Copy all files in the `dist` folder after `npm run build` to the project directory
#### Second step
Introduce dependencies
Introduce dependencies through CDN
```
<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./plugins/plugins.css' />
<link rel='stylesheet' href='./css/luckysheet.css' />
<script src="./plugins/js/plugin.js"></script>
<script src="./luckysheet.umd.js"></script>
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' />
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>
```
#### Third step
#### Second step
Specify a table container
```
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;"></div>
```
#### Fourth step
#### Third step
Create a table
```
<script>

7
docs/guide/FAQ.md

@ -24,9 +24,12 @@ luckysheet.buildGridData(luckysheetfile)
------------
## **<span style="font-size:20px;">Q</span>** How to use Luckysheet in vue project?
## **<span style="font-size:20px;">Q</span>** How to use Luckysheet in Vue/React project?
**<span style="font-size:20px;">A</span>** : Reference [Luckysheet-vue-demo](https://github.com/Dushusir/vue-demo)
**<span style="font-size:20px;">A</span>**:
- Vue case: [luckysheet-vue](https://github.com/mengshukeji/luckysheet-vue)
- React case: [luckysheet-react](https://github.com/mengshukeji/luckysheet-react)
------------

28
docs/guide/README.md

@ -6,7 +6,7 @@ Luckysheet is an online spreadsheet like excel that is powerful, simple to confi
## Demo
[Online demo](https://mengshukeji.github.io/LuckysheetDemo/)
![Demo](/img/LuckysheetDemo.gif)
![Demo](/LuckysheetDocs/img/LuckysheetDemo.gif)
## Features
@ -113,10 +113,24 @@ npm run build
## Steps for usage
### First step
After `npm run build`, all files in the `dist` folder are copied to the project directory
### Second step
Introduce dependencies
There are two ways to introduce dependencies
#### CDN
```html
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' />
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>
```
Note that `https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js` will pull the latest luckysheet code. If you want to specify the luckysheet version, please add the version number after the luckysheet , Such as: `https://cdn.jsdelivr.net/npm/luckysheet@2.0.0/dist/luckysheet.umd.js`
If it is not convenient to access jsdelivr.net, you can also import it locally
#### Import locally
After `npm run build`, all files in the `dist` folder are copied to the project directory
```html
<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./plugins/plugins.css' />
@ -124,12 +138,12 @@ Introduce dependencies
<script src="./plugins/js/plugin.js"></script>
<script src="./luckysheet.umd.js"></script>
```
### Third step
### Second step
Specify a table container
```html
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;"></div>
```
### Fourth step
### Third step
Create a table
```javascript
<script>
@ -153,7 +167,7 @@ An example of a Luckysheet file is as follows, the table contains 3 sheets:`
luckysheetfile = [{sheet1 settings}, {sheet2 settings}, {sheet3 settings}]`
Equivalent to 3 sheets of excel
![excel sheet](/docs/.vuepress/public/img/excel.png)
![excel sheet](/LuckysheetDocs/img/excel.png)
An example of a sheet in the file is as follows:
```javascript

7
docs/zh/guide/FAQ.md

@ -24,9 +24,12 @@ luckysheet.buildGridData(luckysheetfile)
------------
## **<span style="font-size:20px;">Q</span>** 如何在vue项目中使用Luckysheet?
## **<span style="font-size:20px;">Q</span>** 如何在Vue/React项目中使用Luckysheet?
**<span style="font-size:20px;">A</span>** : 参考 [Luckysheet-vue-demo](https://github.com/Dushusir/vue-demo)
**<span style="font-size:20px;">A</span>** : 
- Vue案例:[luckysheet-vue](https://github.com/mengshukeji/luckysheet-vue)
- React案例:[luckysheet-react](https://github.com/mengshukeji/luckysheet-react)
------------

29
docs/zh/guide/README.md

@ -6,7 +6,7 @@ Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置
## Demo
[在线demo](https://mengshukeji.github.io/LuckysheetDemo/)
![演示](/img/LuckysheetDemo.gif)
![演示](/LuckysheetDocs/img/LuckysheetDemo.gif)
## 特性
@ -113,10 +113,25 @@ npm run build
## 使用步骤
### 第一步
`npm run build`后`dist`文件夹下的所有文件复制到项目目录
引入依赖,有2种方式
#### CDN
```html
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' />
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' />
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script>
<script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script>
```
注意,`https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js`这个路径会拉取到最新的luckysheet代码,想要指定luckysheet版本,请在luckysheet后面加上版本号,如:`https://cdn.jsdelivr.net/npm/luckysheet@2.0.0/dist/luckysheet.umd.js`
如果不方便访问 jsdelivr.net,还可以采用本地方式引入
#### 本地引入
`npm run build`后`dist`文件夹下的所有文件复制到项目目录,然后通过相对路径引入
### 第二步
引入依赖
```html
<link rel='stylesheet' href='./plugins/css/pluginsCss.css' />
<link rel='stylesheet' href='./plugins/plugins.css' />
@ -124,12 +139,12 @@ npm run build
<script src="./plugins/js/plugin.js"></script>
<script src="./luckysheet.umd.js"></script>
```
### 第
### 第
指定一个表格容器
```html
<div id="luckysheet" style="margin:0px;padding:0px;position:absolute;width:100%;height:100%;left: 0px;top: 0px;"></div>
```
### 第
### 第
创建一个表格
```javascript
<script>
@ -153,7 +168,7 @@ npm run build
luckysheetfile = [ {sheet1设置}, {sheet2设置}, {sheet3设置} ]`
相当于excel的3个sheet
![excel sheet](/img/excel.png)
![excel sheet](/LuckysheetDocs/img/excel.png)
文件中的一个sheet的数据`luckysheetfile[0]`的结构如下:
```json

178
docs/zh/guide/api.md

@ -10,6 +10,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
## 单元格操作
### getCellValue(row, column [,setting])<div id='getCellValue'></div>
- **参数**
@ -38,6 +39,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setCellValue(row, column, value [,setting])
- **参数**
@ -46,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]: 操作结束的回调函数
- **说明**
@ -56,12 +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])
- **参数**
@ -83,6 +97,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### deleteCell(move, row, column [,setting])
- **参数**
- {String} [move]: 删除后,右侧还是下方的单元格移动
@ -110,6 +125,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setCellFormat(row, column, attr, value [,setting])
- **参数**
@ -152,6 +168,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### find(content [,setting])
- **参数**
@ -174,6 +191,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### replace(content, replaceContent [,setting])
- **参数**
@ -200,6 +218,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
## 行和列操作
### setHorizontalFrozen(isRange [,setting])
- **参数**
@ -232,6 +251,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setVerticalFrozen(isRange [,setting])
- **参数**
@ -260,6 +280,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setBothFrozen(isRange [,setting])
- **参数**
@ -288,6 +309,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### cancelFrozen([setting])
- **参数**
@ -308,6 +330,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### insertRow(row [,setting])
- **参数**
@ -331,6 +354,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### insertColumn( column [,setting])
- **参数**
@ -354,6 +378,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### deleteRow(rowStart, rowEnd [,setting])
- **参数**
@ -379,6 +404,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### deleteColumn(columnStart, columnEnd [,setting])
- **参数**
@ -404,6 +430,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### hideRow(rowStart, rowEnd [,setting])
- **参数**
@ -429,6 +456,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### hideColumn(columnStart, columnEnd [,setting])(TODO)
- **参数**
@ -454,6 +482,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### showRow(rowStart, rowEnd [,setting])
- **参数**
@ -477,6 +506,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### showColumn(columnStart, columnEnd [,setting])(TODO)
- **参数**
@ -502,6 +532,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
## 选区操作
### getRange()
- **说明**
@ -524,6 +555,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### getRangeValue([setting])
- **参数**
@ -609,6 +641,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getRangeHtml([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -656,6 +691,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### getRangeJson(title [,setting])
- **参数**
@ -702,6 +738,10 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getRangeArray(dimensional [,setting])
[todo]
- **参数**
- {String} [dimensional]: 数组维度
@ -796,6 +836,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### getRangeDiagonal(type [,setting])
- **参数**
@ -875,6 +916,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### getRangeBoolean([setting])
- **参数**
@ -904,6 +946,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setRangeShow(range [,setting])<div id='setRangeShow'></div>
[todo]
- **参数**
- {Array | Object | String} [range]: 选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,允许多个选区组成的数组;默认为当前选区
@ -942,6 +987,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setRangeValue(data [,setting])
- **参数**
@ -949,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]: 操作结束的回调函数
- **说明**
@ -1006,6 +1053,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setRangeFormat(attr, value [,setting])
- **参数**
@ -1047,6 +1095,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setRangeFilter(type [,setting])
[todo]
- **参数**
- {String} [type]: 打开还是关闭筛选功能
@ -1071,6 +1122,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setRangeMerge(type [,setting])
- **参数**
@ -1124,6 +1176,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### cancelRangeMerge( [setting])
- **参数**
@ -1145,6 +1198,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setRangeSort(type [,setting])
- **参数**
@ -1173,6 +1227,7 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### setRangeSortMulti(title, sort [,setting])
- **参数**
@ -1191,12 +1246,15 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
- **示例**:
- 设置当前工作表当前选区为自定义排序,数据具有标题行,且按第一列升序第二列降序的规则进行排序
`luckysheet.setRangeSortMulti(true,{sort:[{ i:0,sort:'asc' },{ i:1,sort:'des' }]})`
`luckysheet.setRangeSortMulti(true,[{ i:0,sort:'asc' },{ i:1,sort:'des' }])`
------------
### setRangeConditionalFormatDefault(conditionName, conditionValue [,setting])
[todo]
- **参数**
- {String} [conditionName]: 条件格式规则类型
@ -1299,6 +1357,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setRangeConditionalFormat(type [,setting])
[todo]
- **参数**
- {String} [type]: 条件格式规则类型
@ -1417,6 +1478,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### deleteRangeConditionalFormat(itemIndex [,setting])
[todo]
- **参数**
- {Number} [itemIndex]: 条件格式规则索引
@ -1439,6 +1503,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### clearRange([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1459,6 +1526,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### deleteRange(move [,setting])
[todo]
- **参数**
- {String} [move]: 删除后,右侧还是下方的单元格移动
@ -1485,6 +1555,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### insertRange(move [,setting])
[todo]
- **参数**
- {String} [move]: 活动单元格右移或者下移
@ -1518,6 +1591,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### matrixOperation(type [,setting])
[todo]
- **参数**
- {String} [type]: 矩阵操作的类型
@ -1536,7 +1612,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
+ `"newMatrix"`: 生产新矩阵
- {PlainObject} [setting]: 可选参数
+ {Array | Object | String} [range]: 选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区
+ {Number} [order]: 工作表索引;默认值为当前工作表索引
+ {Function} [success]: 操作结束的回调函数
- **说明**
@ -1561,6 +1636,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### matrixCalculation(type, number [,setting])
[todo]
- **参数**
- {String} [type]: 计算方式
@ -1603,6 +1681,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getAllSheets()
[todo]
- **说明**
返回所有工作表配置,格式同[工作表配置](/zh/guide/sheet.html),得到的结果可用于表格初始化时作为`options.data`使用。
@ -1618,6 +1699,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getLuckysheetfile()
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1636,6 +1720,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getSheetData([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1649,6 +1736,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getConfig([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1662,6 +1752,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setConfig([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1676,6 +1769,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetAdd([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1696,6 +1792,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetDelete([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1715,6 +1814,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetCopy([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1735,6 +1837,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetHide([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1756,6 +1861,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetShow([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1775,6 +1883,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetActive(order [,setting])
[todo]
- **参数**
- {Number} [order]: 要激活的工作表索引
@ -1794,6 +1905,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetName(name [,setting])
[todo]
- **参数**
- {String} [name]: 新的工作表名称
@ -1814,6 +1928,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetColor(color [,setting])
[todo]
- **参数**
- {String} [color]: 工作表颜色
@ -1834,6 +1951,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetMove(type [,setting])
[todo]
- **参数**
- {String | Number} [type]: 工作表移动方向或者移动的目标索引,
@ -1861,6 +1981,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetOrder(orderList [,setting])
[todo]
- **参数**
- {Array} [orderList]: 工作表顺序,设置工作表的index和order来指定位置,如:
@ -1913,6 +2036,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### refresh([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1924,6 +2050,19 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### resize([setting])
- **参数**
- {PlainObject} [setting]: 可选参数
+ {Function} [success]: 操作结束的回调函数
- **说明**
根据窗口大小自动resize画布
------------
### destroy([setting])
- **参数**
@ -1939,6 +2078,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getScreenshot([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1953,6 +2095,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setWorkbookName(name [,setting])
[todo]
- **参数**
- {Number} [name]: 工作簿名称
@ -1967,6 +2112,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### undo([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1980,6 +2128,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### redo([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -1995,6 +2146,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### insertChart([setting])
[todo]
- **参数**
- {PlainObject} [setting]: 可选参数
@ -2010,6 +2164,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setChart(chartId, attr, value [,setting])
[todo]
- **参数**
- {String} [chartId]: 指定要修改的图表id
@ -2035,6 +2192,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### getChart(chartId)
[todo]
- **参数**
- {String} [chartId]: 指定要获取的图表id
@ -2047,6 +2207,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### deleteChart(chartId [,setting])
[todo]
- **参数**
- {String} [chartId]: 要删除的图表id
@ -2064,6 +2227,9 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### transToCellData(data [,setting])<div id='transToCellData'></div>
[todo]
- **参数**
- {Array} [data]: data数据
@ -2079,6 +2245,8 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### transToData(celldata [,setting])<div id='transToData'></div>
[todo]
- **参数**
- {Array} [celldata]: data数据
@ -2094,6 +2262,8 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### toJson()
[todo]
- **说明**
导出的json字符串可以直接当作`luckysheet.create(options)`初始化工作簿时的参数`options`使用,使用场景在用户自己操作表格后想要手动保存全部的参数,再去别处初始化这个表格使用,类似一个luckysheet专有格式的导入导出。

11
docs/zh/guide/cell.md

@ -97,8 +97,15 @@
<tr>
<td>tr</td>
<td>textrotate</td>
<td>文字旋转</td>
<td>0: 0、1: 45 、2:-45、3 竖排文字、4: 90 、5:-90</td>
<td>竖排文字</td>
<td>3</td>
<td>setRotationAngle</td>
</tr>
<tr>
<td>rt</td>
<td>rotatetext</td>
<td>文字旋转角度</td>
<td>介于0~180之间的整数,包含0和180</td>
<td>setRotationAngle</td>
</tr>
<tr>

465
docs/zh/guide/config.md

@ -179,6 +179,9 @@ Luckysheet开放了更细致的自定义配置选项,分别有
------------
### showtoolbarConfig
[todo]
- 类型:Object
- 默认值:{}
- 作用:自定义配置工具栏
@ -233,6 +236,9 @@ Luckysheet开放了更细致的自定义配置选项,分别有
------------
### showsheetbarConfig
[todo]
- 类型:Object
- 默认值:{}
- 作用:自定义配置底部sheet页按钮
@ -253,6 +259,9 @@ Luckysheet开放了更细致的自定义配置选项,分别有
------------
### showstatisticBarConfig
[todo]
- 类型:Object
- 默认值:{}
- 作用:自定义配置底部计数栏
@ -265,6 +274,9 @@ Luckysheet开放了更细致的自定义配置选项,分别有
------------
### sheetBottomConfig
[todo]
- 类型:Object
- 默认值:{}
- 作用:sheet页下方的添加行按钮和回到顶部按钮配置
@ -355,6 +367,9 @@ Luckysheet开放了更细致的自定义配置选项,分别有
------------
### cellRightClickConfig
[todo]
- 类型:Object
- 默认值:{}
- 作用:自定义配置单元格右击菜单
@ -377,6 +392,9 @@ Luckysheet开放了更细致的自定义配置选项,分别有
------------
### sheetRightClickConfig
[todo]
- 类型:Object
- 默认值:{}
- 作用:自定义配置sheet页右击菜单
@ -401,7 +419,8 @@ Luckysheet开放了更细致的自定义配置选项,分别有
钩子函数统一配置在`options.hook`下,可以分别针对单元格、sheet页、表格创建配置hook。
------------
## 单元格
### cellRenderAfter
- 类型:Function
- 默认值:null
@ -422,88 +441,303 @@ Luckysheet开放了更细致的自定义配置选项,分别有
- {Object} [v]: 单元格对象
------------
### cellClickBefore
### cellEditBefore
- 类型:Function
- 默认值:null
- 作用:点击单元格前触发,即在点击单元格的时候,最先触发这个方法
- 作用:双击单元格后触发,即在双击单元格编辑内容的时候,最先触发这个方法
- 参数:
- {Number} [r]: 单元格所在行数
- {Number} [c]: 单元格所在列数
- {Object} [v]: 单元格对象
------------
### cellClicked
### cellEditAfter
- 类型:Function
- 默认值:null
- 作用:点击单元格后触发,即在点击单元格的时候,最后触发这个方法
- 作用:双击单元格后触发,即在双击单元格编辑内容的时候,最后触发这个方法
- 参数:
- {Number} [r]: 单元格所在行数
- {Number} [c]: 单元格所在列数
- {Object} [v]: 单元格对象
- {Object} [oldV]: 修改前单元格对象
- {Object} [newV]: 修改后单元格对象
------------
### cellEditBefore
### fireMousedown
- 类型:Function
- 默认值:null
- 作用:双击单元格后触发,即在双击单元格编辑内容的时候,最先触发这个方法
- 作用:单元格数据下钻自定义方法
------------
## 选区
### rangeSelectBefore
- 类型:Function
- 默认值:null
- 作用:框选或者设置选区前触发
- 参数:
- {Number} [r]: 单元格所在行数
- {Number} [c]: 单元格所在列数
- {Object} [v]: 单元格对象
- {Object || Array} [range]: 选区范围,可能为多个选区
------------
### cellEdited
### rangeSelectAfter
- 类型:Function
- 默认值:null
- 作用:双击单元格后触发,即在双击单元格编辑内容的时候,最后触发这个方法
- 作用:框选或者设置选区后触发
- 参数:
- {Number} [r]: 单元格所在行数
- {Number} [c]: 单元格所在列数
- {Object} [oldV]: 修改前单元格对象
- {Object} [newV]: 修改后单元格对象
- {Object || Array} [range]: 选区范围,可能为多个选区
------------
### rangeMoveBefore
- 类型:Function
- 默认值:null
- 作用:移动选区前,包括单个单元格
- 参数:
- {Array} [range]: 当前选区范围,只能为单个选区
------------
### rangeMoveAfter
- 类型:Function
- 默认值:null
- 作用:移动选区后,包括单个单元格
- 参数:
- {Array} [oldRange]: 移动前当前选区范围,只能为单个选区
- {Array} [newRange]: 移动后当前选区范围,只能为单个选区
------------
### rangeEditBefore
- 类型:Function
- 默认值:null
- 作用:选区修改前
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [data]: 选区范围所对应的数据
------------
### rangeEditAfter
- 类型:Function
- 默认值:null
- 作用:选区修改后
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [oldData]: 修改前选区范围所对应的数据
- {Object} [newData]: 修改后选区范围所对应的数据
------------
### rangeCopyBefore
- 类型:Function
- 默认值:null
- 作用:选区复制前
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [data]: 选区范围所对应的数据
------------
### rangeCopyAfter
- 类型:Function
- 默认值:null
- 作用:选区复制后
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [data]: 选区范围所对应的数据
------------
### rangePasteBefore
- 类型:Function
- 默认值:null
- 作用:选区粘贴前
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [data]: 要被粘贴的选区范围所对应的数据
------------
### rangePasteAfter
- 类型:Function
- 默认值:null
- 作用:选区粘贴后
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [originData]: 要被粘贴的选区范围所对应的数据
- {Object} [pasteData]: 要粘贴的数据
------------
### rangeCutBefore
- 类型:Function
- 默认值:null
- 作用:选区剪切前
- 参数:
- {Array} [range]: 选区范围,只能为单个范围
- {Object} [data]: 要被剪切的选区范围所对应的数据
------------
### rangeCutAfter
- 类型:Function
- 默认值:null
- 作用:选区剪切后
- 参数:
- {Array} [range]: 选区范围,只能为单个范围
- {Object} [data]: 被剪切的选区范围所对应的数据
------------
### rangeDeleteBefore
- 类型:Function
- 默认值:null
- 作用:选区删除前
- 参数:
- {Array} [range]: 选区范围,只能为单个范围
- {Object} [data]: 要被删除的选区范围所对应的数据
------------
### rangeDeleteAfter
- 类型:Function
- 默认值:null
- 作用:选区删除后
- 参数:
- {Array} [range]: 选区范围,只能为单个范围
- {Object} [data]: 被删除的选区范围所对应的数据
------------
### rangeClearBefore
- 类型:Function
- 默认值:null
- 作用:选区清除前
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [data]: 要被清除的选区范围所对应的数据
------------
### rangeClearAfter
- 类型:Function
- 默认值:null
- 作用:选区清除后
- 参数:
- {Object || Array} [range]: 选区范围,可能为多个选区
- {Object} [data]: 被清除的选区范围所对应的数据
------------
### rangePullBefore
- 类型:Function
- 默认值:null
- 作用:选区下拉前
- 参数:
- {Array} [range]: 当前选区范围,只能为单个范围
------------
### rangePullAfter
- 类型:Function
- 默认值:null
- 作用:选区下拉后
- 参数:
- {Array} [range]: 下拉后的选区范围,只能为单个范围
------------
## 工作表
### sheetCreatekBefore
- 类型:Function
- 默认值:null
- 作用:创建sheet页前触发,sheet页新建也包含数据透视表新建
------------
### sheetCreateAfter
- 类型:Function
- 默认值:null
- 作用:创建sheet页后触发,sheet页新建也包含数据透视表新建
- 参数:
- {Object} [sheet]: 当前新创建的sheet页的配置
------------
### sheetMoveBefore
- 类型:Function
- 默认值:null
- 作用:sheet移动前
- 参数:
- {Number} [i]: 当前sheet页的index
- {Number} [order]: 当前sheet页order
------------
### sheetClickBefore
### sheetMoveAfter
- 类型:Function
- 默认值:null
- 作用:点击sheet页前触发
- 作用:sheet移动后
- 参数:
- {Number} [i]: 当前sheet页的index
- {Number} [oldOrder]: 修改前当前sheet页order
- {Number} [newOrder]: 修改后当前sheet页order
------------
### sheetDeleteBefore
- 类型:Function
- 默认值:null
- 作用:sheet删除前
- 参数:
- {Object} [sheet]: 要被删除sheet页的配置
------------
### sheetDeleteAfter
- 类型:Function
- 默认值:null
- 作用:sheet删除后
- 参数:
- {Object} [sheet]: 已被删除sheet页的配置
------------
### sheetEditNameBefore
- 类型:Function
- 默认值:null
- 作用:sheet修改名称前
- 参数:
- {Number} [i]: sheet页的index
- {Object} [sheet]: sheet页的配置
- {String} [name]: 当前sheet页名称
------------
### sheetClicked
### sheetEditNameAfter
- 类型:Function
- 默认值:null
- 作用:点击sheet页后触发
- 作用:sheet修改名称后
- 参数:
- {Number} [i]: sheet页的index
- {Object} [sheet]: sheet页的配置
- {String} [oldName]: 修改前当前sheet页名称
- {String} [newName]: 修改后当前sheet页名称
------------
### workbookCreateBefore
### sheetEditColorBefore
- 类型:Function
- 默认值:null
- 作用:表格创建之前触发。旧的钩子函数叫做`beforeCreateDom`
- 作用:sheet修改颜色前
- 参数:
- {Object} [book]: 整个工作簿的配置(options)
- {Number} [i]: sheet页的index
- {String} [color]: 当前sheet页颜色
------------
### workbookCreated
### sheetEditColorAfter
- 类型:Function
- 默认值:null
- 作用:表格创建之后触发
- 作用:sheet修改颜色后
- 参数:
- {Number} [i]: sheet页的index
- {String} [oldColor]: 修改前当前sheet页颜色
- {String} [newColor]: 修改后当前sheet页颜色
------------
## 工作簿
### workbookCreateBefore
- 类型:Function
- 默认值:null
- 作用:表格创建之前触发。旧的钩子函数叫做`beforeCreateDom`
- 参数:
- {Object} [book]: 整个工作簿的配置(options)
------------
### workbookUpdated
### workbookCreateAfter
- 类型:Function
- 默认值:null
- 作用:表格创建之后触发
- 参数:
- {Object} [book]: 整个工作簿的配置(options)
------------
### workbookDestroyBefore
- 类型:Function
@ -513,7 +747,7 @@ Luckysheet开放了更细致的自定义配置选项,分别有
- {Object} [book]: 整个工作簿的配置(options)
------------
### workbookDestroyed
### workbookDestroyAfter
- 类型:Function
- 默认值:null
- 作用:表格创建之后触发
@ -524,14 +758,175 @@ Luckysheet开放了更细致的自定义配置选项,分别有
### updated
- 类型:Function
- 默认值:null
- 作用:每次操作更新后执行的方法,即客户端每执行一次表格操作,Luckysheet将这次操作存到历史记录中后触发,撤销时因为也算一次操作,当然也会触发此钩子函数。
- 作用:每次操作更新后执行的方法,在画布渲染之后执行,即客户端每执行一次表格操作,Luckysheet将这次操作存到历史记录中后触发,撤销重做时因为也算一次操作,当然也会触发此钩子函数。
- 参数:
- {Object} [operate]: 本次操作的历史记录信息,根据不同的操作,会有不同的历史记录,参考源码 [历史记录](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/controlHistory.js)
------------
### fireMousedown
### resized
- 类型:Function
- 默认值:null
- 作用:单元格数据下钻自定义方法
- 作用:resize执行之后
- 参数:
- {Object} [size]: 整个工作簿区域的宽高
------------
## 图片
### imageInsertBefore
- 类型:Function
- 默认值:null
- 作用:图片插入之前
- 参数:
- {Object} [url]: 图片地址
------------
### imageInsertAfter
- 类型:Function
- 默认值:null
- 作用:图片插入之后
- 参数:
- {Object} [item]]: 图片地址、宽高、位置等信息
------------
### imageUpdateBefore
- 类型:Function
- 默认值:null
- 作用:图片修改之前,修改的内容包括宽高、位置、裁剪等操作
- 参数:
- {Object} [item]]: 图片地址、宽高、位置等信息
------------
### imageUpdateAfter
- 类型:Function
- 默认值:null
- 作用:图片修改之后,修改的内容包括宽高、位置、裁剪等操作
- 参数:
- {Object} [oldItem]]: 修改前图片地址、宽高、位置等信息
- {Object} [newItem]]: 修改后图片地址、宽高、位置等信息
------------
### imageDeleteBefore
- 类型:Function
- 默认值:null
- 作用:图片删除之前
- 参数:
- {Object} [item]]: 图片地址、宽高、位置等信息
------------
### imageDeleteAfter
- 类型:Function
- 默认值:null
- 作用:图片删除之后
- 参数:
- {Object} [item]]: 图片地址、宽高、位置等信息
------------
## 批注
### commentInsertBefore
- 类型:Function
- 默认值:null
- 作用:插入批注之前
- 参数:
- {Object} [cell]: 要插入的批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`
------------
### commentInsertAfter
- 类型:Function
- 默认值:null
- 作用:插入批注之后
- 参数:
- {Object} [cell]: 被插入批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`,包含批注信息
------------
### commentDeleteBefore
- 类型:Function
- 默认值:null
- 作用:删除批注之前
- 参数:
- {Object} [cell]: 要删除的批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`
------------
### commentDeleteAfter
- 类型:Function
- 默认值:null
- 作用:删除批注之后
- 参数:
- {Object} [cell]: 被删除批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`
------------
### commentUpdateBefore
- 类型:Function
- 默认值:null
- 作用:修改批注之前
- 参数:
- {Object} [cell]: 批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`
------------
### commentUpdateAfter
- 类型:Function
- 默认值:null
- 作用:修改批注之后
- 参数:
- {Object} [oldCell]: 修改前批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`
- {Object} [newCell]: 修改后批注所在的单元格信息,如:`{ r:0,c:2,v:{m:'233',v:'233'}}`
------------
## 数据透视表
### pivotTableEditBefore
- 类型:Function
- 默认值:null
- 作用:修改数据透视表之前,操作如:拖动字段等
- 参数:
- {Object} [sheet]: 数据透视表所在sheet页配置
------------
### pivotTableEditAfter
- 类型:Function
- 默认值:null
- 作用:修改数据透视表之后,操作如:拖动字段等
- 参数:
- {Object} [oldSheet]: 修改前数据透视表所在sheet页配置
- {Object} [newSheet]: 修改后数据透视表所在sheet页配置
------------
## 冻结
### frozenCreateBefore
- 类型:Function
- 默认值:null
- 作用:设置冻结前
- 参数:
- {Object} [frozen]: 冻结类型信息
------------
### frozenCreateAfter
- 类型:Function
- 默认值:null
- 作用:设置冻结后
- 参数:
- {Object} [frozen]: 冻结类型信息
------------
### frozenCancelBefore
- 类型:Function
- 默认值:null
- 作用:取消冻结前
- 参数:
- {Object} [frozen]: 冻结类型信息
------------
### frozenCancelAfter
- 类型:Function
- 默认值:null
- 作用:取消冻结后
- 参数:
- {Object} [frozen]: 冻结类型信息
------------

42
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', //边框颜色
}
}
```
------------
## 调试信息

25
src/controllers/handler.js

@ -4396,18 +4396,7 @@ export default function luckysheetHandler() {
clipboardData = e.originalEvent.clipboardData;
}
//复制的是图片
if(clipboardData.files.length == 1 && clipboardData.files[0].type.indexOf('image') > -1){
let render = new FileReader();
render.readAsDataURL(clipboardData.files[0]);
render.onload = function(event){
let src = event.target.result;
imageCtrl.inserImg(src);
}
return;
}
let txtdata = clipboardData.getData("text/html");
@ -4726,6 +4715,18 @@ export default function luckysheetHandler() {
selection.pasteHandler(data, borderInfo);
$("#luckysheet-copy-content").empty();
}
//复制的是图片
else if(clipboardData.files.length == 1 && clipboardData.files[0].type.indexOf('image') > -1){
let render = new FileReader();
render.readAsDataURL(clipboardData.files[0]);
render.onload = function(event){
let src = event.target.result;
imageCtrl.inserImg(src);
}
return;
}
else {
txtdata = clipboardData.getData("text/plain");
selection.pasteHandler(txtdata);

12
src/controllers/menuButton.js

@ -2937,9 +2937,9 @@ const menuButton = {
d[r][c][attr] = foucsStatus;
}
if(attr == "tr" && d[r][c].tb != null){
d[r][c].tb = "0";
}
// if(attr == "tr" && d[r][c].tb != null){
// d[r][c].tb = "0";
// }
}
}
}
@ -2948,10 +2948,10 @@ const menuButton = {
}
if(attr == "tb" || attr == "tr" || attr == "fs"){
jfrefreshgrid(d, Store.luckysheet_select_save, cfg, null, true);
jfrefreshgrid(d, Store.luckysheet_select_save, cfg, null, true, false);
}
else{
jfrefreshgrid(d, Store.luckysheet_select_save);
jfrefreshgrid(d, Store.luckysheet_select_save, undefined, undefined,undefined,false);
}
},
updateFormat_mc: function(d, foucsStatus){
@ -3314,7 +3314,7 @@ const menuButton = {
},
checkstatusByCell:function(cell, a){
let foucsStatus =cell;
let tf = {"bl":1, "it":1 , "ff":1, "cl":1};
let tf = {"bl":1, "it":1 , "ff":1, "cl":1, "un":1};
if(a in tf){
if(foucsStatus == null){

3
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) {

2
src/function/functionImplementation.js

@ -15806,7 +15806,7 @@ const functionImplementation = {
values = values.concat(func_methods.getDataArr(data_values, false));
}
else if(getObjType(data_values) == "object" && data_values.startCell != null){
values = values.concat(func_methods.getCellDataArr(data_values, "number", false));
values = values.concat(func_methods.getCellDataArr(data_values, "number", true));
}
else{
values.push(data_values);

1
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',

1585
src/global/api.js

File diff suppressed because it is too large

1395
src/global/draw.js

File diff suppressed because it is too large

11
src/global/editor.js

@ -60,12 +60,19 @@ const editor = {
_this.deepCopyFlowDataCache = $.extend(true, [], flowData);
}
},
controlHandler: function (dataChe) {
/**
* @param {Array} dataChe
* @param {Object} range 是否指定选区默认为当前选区
* @since Add range parameter. Update by siwei@2020-09-10.
*/
controlHandler: function (dataChe, range) {
let _this = this;
let d = _this.deepCopyFlowData(Store.flowdata);//取数据
let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
// let last = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
let last = range || Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1];
let curR = last["row"] == null ? 0 : last["row"][0];
let curC = last["column"] == null ? 0 : last["column"][0];
let rlen = dataChe.length, clen = dataChe[0].length;

82
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;

1292
src/global/getRowlen.js

File diff suppressed because it is too large

15
src/global/getdata.js

@ -261,4 +261,19 @@ export function getOrigincell(r, c, i) {
return data[r][c];
}
export function getRealCellValue(r, c){
let value = getcellvalue(r, c, null, "m");
if(value == null){
value = getcellvalue(r, c);
if(value==null){
let ct = getcellvalue(r, c, null, "ct");
if(ct!=null && ct.t=="inlineStr" && ct.s!=null && ct.s.length>0){
value = ct.s;
}
}
}
return value;
}

83
src/index.html

@ -30,52 +30,55 @@
import sheetSparkline from './demoData/sheetSparkline.js'
import sheetChart from './demoData/sheetChart.js'
$(function () {
// [sheetCell,sheetFormula,sheetConditionFormat,sheetSparkline,sheetTable,sheetComment,sheetPivotTableData,sheetPivotTable,sheetChart]
// [{"name":"Sheet1","config":{"columnlen":{"0":241},"rowlen":{"0":81}},"index":"1","status":"1","order":"0","luckysheet_select_save":[{"row":[0,0],"column":[4,4],"sheetIndex":1}],"zoomRatio":1,"showGridLines":"1","defaultColWidth":72,"defaultRowHeight":18,"celldata":[
// {"r":0,"c":0,
// "v":{
// "ct":{
// "fa":"General",
// "t":"inlineStr",
// "s":[
// {
// "ff":"等线", //font family
// "fc":"#fff000",//font color
// "fs":12,//font size
// "cl":1,//strike
// "un":0,//underline
// "bl":0,//blod
// "it":1,//italic
// v:"我在\r\n"
// },
// {
// "ff":"等线", //font family
// "fc":"#ff0000",//font color
// "fs":14,//font size
// "cl":"1",//strike
// "un":"0",//underline
// "bl":"1",//blod
// "it":"0",//italic
// v:"马路边"
// },
// ]
// },
// "fs":11,
// "ff":"等线",
// "vt":0,
// "tb":2,
// "v":"",
// "qp":1,
// }
// },
// {"r":17,"c":2,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":"11","fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}}
// ],"calcChain":[]}]
luckysheet.create({
container: 'luckysheet',
lang: 'en',
allowEdit:true,
forceCalculation:false,
plugins: ['chart'],
data: [{"name":"Sheet1","config":{"columnlen":{"0":241},"rowlen":{"0":81}},"index":"1","status":"1","order":"0","luckysheet_select_save":[{"row":[0,0],"column":[4,4],"sheetIndex":1}],"zoomRatio":1,"showGridLines":"1","defaultColWidth":72,"defaultRowHeight":18,"celldata":[
{"r":0,"c":0,
"v":{
"ct":{
"fa":"General",
"t":"inlineStr",
"sharedStrings":[
{
"ff":"等线", //font family
"fc":"#fff000",//font color
"fs":12,//font size
"cl":1,//strike
"un":0,//underline
"bl":0,//blod
"it":1,//italic
v:"我在\r\n"
},
{
"ff":"等线", //font family
"fc":"#ff0000",//font color
"fs":14,//font size
"cl":"1",//strike
"un":"0",//underline
"bl":"1",//blod
"it":"0",//italic
v:"马路边"
},
]
},
"fs":11,
"ff":"等线",
"vt":0,
"tb":2,
"v":"",
"qp":1,
}
},
{"r":17,"c":2,"v":{"v":"Luckysheet","ct":{"fa":"General","t":"g"},"bg":null,"bl":0,"it":0,"ff":0,"fs":"11","fc":"rgb(51, 51, 51)","ht":1,"vt":1,"m":"Luckysheet"}}
],"calcChain":[]}]
data:
[sheetCell,sheetFormula,sheetConditionFormat,sheetSparkline,sheetTable,sheetComment,sheetPivotTableData,sheetPivotTable,sheetChart]
})
})

1
src/store/index.js

@ -116,6 +116,7 @@ const Store = {
scrollRefreshSwitch:true,
measureTextCache:{},
measureTextCellInfoCache:{},
measureTextCacheTimeOut:null,
zoomRatio:1,

Loading…
Cancel
Save