diff --git a/README-zh.md b/README-zh.md
index ebc83e7..bb58550 100644
--- a/README-zh.md
+++ b/README-zh.md
@@ -150,11 +150,17 @@ npm run build
```
## 加入共建
-如果你想为 Luckysheet 实现一个重要功能,需要先撰写 RFC 文档,按照Luckysheet的 [RFC](https://github.com/mengshukeji/Luckysheet-rfcs) 机制进行操作,在经过社区讨论完善后才可以进行代码的提交。
-
-## 联系
-- 欢迎提交 PR 或者 [Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose)
-- Email: mengshu@office2.cn
+1. 任何疑问或者建议,欢迎提交[Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose)
+2. 如果您想为 Luckysheet 实现一个重要功能,需要先撰写 RFC 文档,按照Luckysheet的 [RFC](https://github.com/mengshukeji/Luckysheet-rfcs) 机制进行操作,在经过社区讨论完善后才可以进行代码的提交。
+3. 如果您对Luckysheet感兴趣,非常欢迎加入开发组,一起来完善这个插件(下方扫码添加小编微信备注:共建),有4类任务可以认领
+ - BUG修复
+ - 新功能添加
+ - 文档
+ - 推广
+
+ 您将收获:
+ - Luckysheet官方readme文档贡献者链接
+ - 参与大型开源项目,技术和视野提升
## 交流
@@ -171,7 +177,10 @@ npm run build
[英文社群](./README.md)
## 贡献者和感谢
+- [@wbfsa](https://github.com/wbfsa)
- [@wpxp123456](https://github.com/wpxp123456)
+- [@swen-xiong](https://github.com/swen-xiong)
+- [@tonytonychopper123](https://github.com/tonytonychopper123)
- [@Dushusir](https://github.com/Dushusir)
## 版权信息
diff --git a/README.md b/README.md
index 8bcf504..b988d9e 100644
--- a/README.md
+++ b/README.md
@@ -154,13 +154,20 @@ Create a table
})
```
-## Join the co-construction
-If you want to implement an important function for Luckysheet, you need to write an RFC document first, follow Luckysheet's [RFC](https://github.com/mengshukeji/Luckysheet-rfcs) to operate, and submit the code after community discussion and improvement.
+## Co-construction
-## Contact
-- Welcome to submit PR or [Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose)
-- Email: mengshu@office2.cn
+1. Any questions or suggestions are welcome to submit [Issues](https://github.com/mengshukeji/Luckysheet/issues/new/choose)
+2. If you want to implement an important function for Luckysheet, you need to write an RFC document first, follow Luckysheet's [RFC](https://github.com/mengshukeji/Luckysheet-rfcs) mechanism to operate, and only after community discussion and improvement, you can submit the code.
+3. If you are interested in Luckysheet, you are very welcome to join the development team to improve this plugin together (Email: alexads@foxmail.com), there are 4 types of tasks that can be claimed
+ - BUG
+ - New features
+ - Documentation
+ - Popularize
+
+ You will gain:
+ - Luckysheet official readme document contributor link
+ - Participate in large open source projects, improve technology and vision
## Communication
@@ -169,7 +176,10 @@ If you want to implement an important function for Luckysheet, you need to write
[Chinese community](./README-zh.md)
## Authors and acknowledgment
+- [@wbfsa](https://github.com/wbfsa)
- [@wpxp123456](https://github.com/wpxp123456)
+- [@swen-xiong](https://github.com/swen-xiong)
+- [@tonytonychopper123](https://github.com/tonytonychopper123)
- [@Dushusir](https://github.com/Dushusir)
## License
diff --git a/docs/guide/data.md b/docs/guide/data.md
index 845a08d..9774abf 100644
--- a/docs/guide/data.md
+++ b/docs/guide/data.md
@@ -26,7 +26,7 @@
"rowlen":{}, //Table row height
"columnlen":{}, //Table column width
"rowhidden":{}, //hidden rows
- "columnhidden":{}, //hidden columns
+ "colhidden":{}, //hidden columns
"borderInfo":{}, //borders
},
"celldata": [], //initialize the cell data used
@@ -204,15 +204,15 @@
}
```
- ### config.columnhidden
+ ### config.colhidden
- Type:Object
- Default:{}
- - Usage:Hidden column information, Columns:`columnhidden[Columns]: 0`,
+ - Usage:Hidden column information, Columns:`colhidden[Columns]: 0`,
`key` specify the number of columns,`value` is always `0`
- example:
```js
- "columnhidden": {
+ "colhidden": {
"30": 0,
"31": 0
}
diff --git a/docs/zh/guide/README.md b/docs/zh/guide/README.md
index e7dfdd4..ec7089a 100644
--- a/docs/zh/guide/README.md
+++ b/docs/zh/guide/README.md
@@ -171,7 +171,7 @@ luckysheetfile = [ {sheet1设置}, {sheet2设置}, {sheet3设置} ]`
"rowlen":{}, //表格行高
"columnlen":{}, //表格列宽
"rowhidden":{}, //隐藏行
- "columnhidden":{}, //隐藏列
+ "colhidden":{}, //隐藏列
"borderInfo":{}, //边框
},
"celldata": [], //初始化使用的单元格数据
diff --git a/docs/zh/guide/cell.md b/docs/zh/guide/cell.md
index b048210..3751860 100644
--- a/docs/zh/guide/cell.md
+++ b/docs/zh/guide/cell.md
@@ -147,6 +147,15 @@
+
+ ae
+ allowEdit
+ 是否允许编辑
+
+ 0: 只读,不可编辑 1:可以编辑,默认为 1
+
+
+
一个规范的单元格对象如下:
diff --git a/docs/zh/guide/config.md b/docs/zh/guide/config.md
index dc908d4..fe9d623 100644
--- a/docs/zh/guide/config.md
+++ b/docs/zh/guide/config.md
@@ -22,48 +22,59 @@ luckysheet.create(options)
这里的`options`配置项会作用于整个表格,特别的,单个sheet的配置则需要在`options.data`数组中,分别设置对应更详细的参数,参考[工作表配置](/zh/guide/sheet.html)
+针对个性化的需求,除了允许配置名称栏([showinfobar](#showinfobar))、工具栏([showtoolbar](#showtoolbar))、底部sheet页([showsheetbar](#showsheetbar))、底部计数栏([showstatisticBar](#showstatisticBar))之外,
+Luckysheet开放了更细致的自定义配置选项,分别有
+
+- 自定义工具栏([showtoolbarConfig](#showtoolbarConfig))
+- 自定义底部sheet页([showsheetbarConfig](#showsheetbarConfig))
+- 自定义计数栏([showstatisticBarConfig](#showstatisticBarConfig))
+- 自定义添加行和回到顶部([sheetBottomConfig](#sheetBottomConfig))
+- 自定义单元格右键菜单([cellRightClickConfig](#cellRightClickConfig))
+- 自定义sheet页右击菜单([sheetRightClickConfig](#sheetRightClickConfig))
+
+
## 配置项
以下为所有支持的设置参数
-- [container](#container)
-- [title](#title)
-- [lang](#lang)
-- [gridKey](#gridKey)
-- [loadUrl](#loadUrl)
-- [loadSheetUrl](#loadSheetUrl)
-- [allowUpdate](#allowUpdate)
-- [updateUrl](#updateUrl)
-- [updateImageUrl](#updateImageUrl)
-- [data](#data)
-- [plugins](#plugins)
-- [column](#column)
-- [row](#row)
-- [autoFormatw](#autoFormatw)
-- [accuracy](#accuracy)
-- [allowCopy](#allowCopy)
-- [showtoolbar](#showtoolbar)
-- [showtoolbarConfig](#showtoolbarConfig)
-- [showinfobar](#showinfobar)
-- [showsheetbar](#showsheetbar)
-- [showsheetbarConfig](#showsheetbarConfig)
-- [showstatisticBar](#showstatisticBar)
-- [showstatisticBarConfig](#showstatisticBarConfig)
-- [allowEdit](#allowEdit)
-- [enableAddRow](#enableAddRow)
-- [enableAddCol](#enableAddCol)
-- [userInfo](#userInfo)
-- [userMenuItem](#userMenuItem)
-- [myFolderUrl](#myFolderUrl)
-- [devicePixelRatio](#devicePixelRatio)
-- [functionButton](#functionButton)
-- [showConfigWindowResize](#showConfigWindowResize)
-- [enablePage](#enablePage)
-- [fullscreenmode](#fullscreenmode)
-- [beforeCreateDom](#beforeCreateDom)
-- [fireMousedown](#fireMousedown)
-- [forceCalculation](#forceCalculation)
-- [rightClickConfig](#rightClickConfig)
+- 容器ID [container](#container)
+- 工作簿名称 [title](#title)
+- 语言 [lang](#lang)
+- 唯一key [gridKey](#gridKey)
+- 加载整个工作簿 [loadUrl](#loadUrl)
+- 加载其它页celldata [loadSheetUrl](#loadSheetUrl)
+- 允许更新 [allowUpdate](#allowUpdate)
+- 更新地址 [updateUrl](#updateUrl)
+- 缩略图更新地址 [updateImageUrl](#updateImageUrl)
+- 工作表配置 [data](#data)
+- 插件 [plugins](#plugins)
+- 列数 [column](#column)
+- 行数 [row](#row)
+- 亿万格式 [autoFormatw](#autoFormatw)
+- 精度 [accuracy](#accuracy)
+- 允许复制 [allowCopy](#allowCopy)
+- 工具栏 [showtoolbar](#showtoolbar)
+- 自定义工具栏[showtoolbarConfig](#showtoolbarConfig)
+- 名称栏 [showinfobar](#showinfobar)
+- 底部sheet页 [showsheetbar](#showsheetbar)
+- 自定义底部sheet页 [showsheetbarConfig](#showsheetbarConfig)
+- 底部计数栏 [showstatisticBar](#showstatisticBar)
+- 自定义计数栏 [showstatisticBarConfig](#showstatisticBarConfig)
+- 自定义添加行和回到顶部 [sheetBottomConfig](#sheetBottomConfig)
+- 允许编辑 [allowEdit](#allowEdit)
+- 允许增加行 [enableAddRow](#enableAddRow)
+- 允许增加列 [enableAddCol](#enableAddCol)
+- 用户信息 [userInfo](#userInfo)
+- 用户信息菜单 [userMenuItem](#userMenuItem)
+- 返回按钮链接 [myFolderUrl](#myFolderUrl)
+- 比例 [devicePixelRatio](#devicePixelRatio)
+- 功能按钮 [functionButton](#functionButton)
+- 自动缩进界面 [showConfigWindowResize](#showConfigWindowResize)
+- 加载下一页 [enablePage](#enablePage)
+- 全屏模式 [fullscreenmode](#fullscreenmode)
+- 刷新公式 [forceCalculation](#forceCalculation)
+- 自定义单元格右键菜单 [cellRightClickConfig](#cellRightClickConfig)
+- 自定义sheet页右击菜单 [sheetRightClickConfig](#sheetRightClickConfig)
### container
- 类型:String
@@ -74,7 +85,7 @@ luckysheet.create(options)
### title
- 类型:String
- 默认值:"Luckysheet Demo"
-- 作用:表格的名称
+- 作用:工作簿名称
------------
### lang
@@ -167,7 +178,7 @@ luckysheet.create(options)
- 作用:是否第二列显示工具栏
------------
-#### showtoolbarConfig
+### showtoolbarConfig
- 类型:Object
- 默认值:{}
- 作用:自定义配置工具栏
@@ -218,13 +229,13 @@ luckysheet.create(options)
### showsheetbar
- 类型:Boolean
- 默认值:true
-- 作用:是否显示底部表格名称区域
+- 作用:是否显示底部sheet页按钮
------------
### showsheetbarConfig
- 类型:Object
- 默认值:{}
-- 作用:自定义配置底部表格名称区域
+- 作用:自定义配置底部sheet页按钮
- 格式:
```json
{
@@ -252,6 +263,18 @@ luckysheet.create(options)
zoom: false // 缩放
}
+------------
+### sheetBottomConfig
+- 类型:Object
+- 默认值:{}
+- 作用:sheet页下方的添加行按钮和回到顶部按钮配置
+- 格式:
+ ```json
+ {
+ addRow: false, // 添加行按钮
+ backTop: false // 回到顶部
+ }
+
------------
### allowEdit
- 类型:Boolean
@@ -318,18 +341,6 @@ luckysheet.create(options)
- 默认值:true
- 作用:是否全屏模式。非全屏模式下,标记框不会强制选中
-------------
-### beforeCreateDom
-- 类型:Function
-- 默认值:null
-- 作用:表格创建之前自定义方法
-
-------------
-### fireMousedown
-- 类型:Function
-- 默认值:null
-- 作用:单元格数据下钻自定义方法
-
------------
### forceCalculation
- 类型:Boolean
@@ -343,33 +354,54 @@ luckysheet.create(options)
⚠️提醒,公式较多时会有性能问题,慎用!
------------
-### rightClickConfig
+### cellRightClickConfig
- 类型:Object
- 默认值:{}
-- 作用:自定义配置右击菜单
+- 作用:自定义配置单元格右击菜单
- 格式:
```json
{
- copy:false, // '复制'
- copyAs:false, // '复制为'
- paste:false, // '粘贴',
- insert:false, // '插入',
- delete:false, // '删除',
- hide:false, // '隐藏',
- deleteCell:false, // '删除单元格',
- clear:false, // '清除内容',
- matrix:false, // '矩阵操作选区',
- sort:false, // '排序选区',
- filter:false, //'筛选选区',
- chart:false, // '图表生成',
+ copy: false, // '复制'
+ copyAs: false, // '复制为'
+ paste: false, // '粘贴'
+ insert: false, // '插入'
+ delete: false, // '删除'
+ hide: false, // '隐藏'
+ deleteCell: false, // '删除单元格'
+ clear: false, // '清除内容'
+ matrix: false, // '矩阵操作选区'
+ sort: false, // '排序选区'
+ filter: false, //'筛选选区'
+ chart: false // '图表生成'
}
-## 钩子函数
+------------
+### sheetRightClickConfig
+- 类型:Object
+- 默认值:{}
+- 作用:自定义配置sheet页右击菜单
+- 格式:
+ ```json
+ {
+ delete: false, // '删除'
+ copy: false, // '复制'
+ rename: false, //重命名
+ color: false, //更改颜色
+ hide: false, //隐藏
+ show: false, //取消隐藏
+ left: false, //向左移
+ right: false //向右移
+ }
+
+------------
+
+## 钩子函数(TODO)
钩子函数应用于二次开发时,会在各个常用鼠标或者键盘操作时植入钩子,调用开发者传入的函数,起到扩展Luckysheet功能的作用。
-钩子函数统一配置在`options.hook`下,可以分别针对单元格、sheet页、表格创建配置hook
+钩子函数统一配置在`options.hook`下,可以分别针对单元格、sheet页、表格创建配置hook。
+------------
### cellHover
- 类型:Function
- 默认值:null
@@ -380,38 +412,116 @@ luckysheet.create(options)
- {Object} [v]: 单元格对象
------------
-
### cellClickBefore
- 类型:Function
- 默认值:null
- 作用:点击单元格前触发,即在点击单元格的时候,最先触发这个方法
+- 参数:
+ - {Number} [r]: 单元格所在行数
+ - {Number} [c]: 单元格所在列数
+ - {Object} [v]: 单元格对象
------------
-
-### cellClickAfter
+### cellClicked
- 类型:Function
- 默认值:null
- 作用:点击单元格后触发,即在点击单元格的时候,最后触发这个方法
+- 参数:
+ - {Number} [r]: 单元格所在行数
+ - {Number} [c]: 单元格所在列数
+ - {Object} [v]: 单元格对象
------------
+### cellEditBefore
+- 类型:Function
+- 默认值:null
+- 作用:双击单元格后触发,即在双击单元格编辑内容的时候,最先触发这个方法
+- 参数:
+ - {Number} [r]: 单元格所在行数
+ - {Number} [c]: 单元格所在列数
+ - {Object} [v]: 单元格对象
+------------
+### cellEdited
+- 类型:Function
+- 默认值:null
+- 作用:双击单元格后触发,即在双击单元格编辑内容的时候,最后触发这个方法
+- 参数:
+ - {Number} [r]: 单元格所在行数
+ - {Number} [c]: 单元格所在列数
+ - {Object} [oldV]: 修改前单元格对象
+ - {Object} [newV]: 修改后单元格对象
+
+------------
### sheetClickBefore
- 类型:Function
- 默认值:null
- 作用:点击sheet页前触发
+- 参数:
+ - {Number} [i]: sheet页的index
+ - {Object} [sheet]: sheet页的配置
------------
-
-### sheetClickAfter
+### sheetClicked
- 类型:Function
- 默认值:null
- 作用:点击sheet页后触发
+- 参数:
+ - {Number} [i]: sheet页的index
+ - {Object} [sheet]: sheet页的配置
------------
-
-### sheetClickAfter
+### workbookCreateBefore
- 类型:Function
- 默认值:null
-- 作用:点击sheet页后触发
-
+- 作用:表格创建之前触发。旧的钩子函数叫做`beforeCreateDom`
+- 参数:
+ - {Object} [book]: 整个工作簿的配置(options)
+
+------------
+### workbookCreated
+- 类型:Function
+- 默认值:null
+- 作用:表格创建之后触发
+- 参数:
+ - {Object} [book]: 整个工作簿的配置(options)
+
+------------
+### workbookUpdated
+- 类型:Function
+- 默认值:null
+- 作用:表格创建之后触发
+- 参数:
+ - {Object} [book]: 整个工作簿的配置(options)
+
+------------
+### workbookDestroyBefore
+- 类型:Function
+- 默认值:null
+- 作用:表格创建之后触发
+- 参数:
+ - {Object} [book]: 整个工作簿的配置(options)
+
------------
+### workbookDestroyed
+- 类型:Function
+- 默认值:null
+- 作用:表格创建之后触发
+- 参数:
+ - {Object} [book]: 整个工作簿的配置(options)
+
+------------
+### updated
+- 类型:Function
+- 默认值:null
+- 作用:每次操作更新后执行的方法,即客户端每执行一次表格操作,Luckysheet将这次操作存到历史记录中后触发,撤销时因为也算一次操作,当然也会触发此钩子函数。
+- 参数:
+ - {Object} [operate]: 本次操作的历史记录信息,根据不同的操作,会有不同的历史记录,参考源码 [历史记录](https://github.com/mengshukeji/Luckysheet/blob/master/src/controllers/controlHistory.js)
+
+------------
+### fireMousedown
+- 类型:Function
+- 默认值:null
+- 作用:单元格数据下钻自定义方法
+
+------------
\ No newline at end of file
diff --git a/docs/zh/guide/operate.md b/docs/zh/guide/operate.md
index 59288b1..01802f4 100644
--- a/docs/zh/guide/operate.md
+++ b/docs/zh/guide/operate.md
@@ -8,6 +8,8 @@
以下为所有的支持传输到后台的操作类型,并且以MongoDB做存储示例,讲解如何做前后端交互。
+注意一点,对象中的i为当前sheet的index值,而不是order。
+
## 单元格刷新
### 单个单元格刷新
@@ -33,7 +35,7 @@
|参数|说明|
| ------------ | ------------ |
|t|操作类型表示符号|
- |i|当前sheet的索引值|
+ |i|当前sheet的index值|
|v|单元格的值,数字、字符串或着对象格式,对象参考 [单元格属性表](/zh/guide/cell.html#基本单元格)|
|r|单元格的行号|
|c|单元格的列号|
@@ -113,7 +115,7 @@
|t|操作类型表示符号|
|i|当前sheet的index值|
|v|需要更新value值|
- |k|操作的key值,可选 边框:`'borderInfo'` / :行隐藏:`'rowhidden'` / 列隐藏:`'columnhidden'` / 行高:`'rowlen'` / 列宽:`'columnlen'` |
+ |k|操作的key值,可选 边框:`'borderInfo'` / :行隐藏:`'rowhidden'` / 列隐藏:`'colhidden'` / 行高:`'rowlen'` / 列宽:`'columnlen'` |
- **后台更新**:
@@ -1079,4 +1081,188 @@
- **后台更新**:
- Luckysheet配置,修改title为`"Luckysheet Demo1"`
\ No newline at end of file
+ Luckysheet配置,修改title为`"Luckysheet Demo1"`
+
+## 图表(TODO)
+
+图表操作类型有4种,分别为新增图表"add"、移动图表位置"xy"、缩放图表"wh"、修改图表配置"update"
+
+### 新增图表
+
+- **格式**:
+
+ ```json
+ {
+ "t": "c",
+ "i": 0,
+ "op":"add",
+ "v": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "width": 400,
+ "height": 250,
+ "left": 20,
+ "top": 120,
+ "sheetIndex": "Sheet_6az6nei65t1i_1596209937084",
+ "needRangeShow": true,
+ "chartOptions": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "chartAllType": "echarts|line|default",
+ "rangeArray": [ { "row": [ 0, 4 ], "column": [ 0, 7 ] } ],
+ "rangeColCheck": { "exits": true, "range": [ 0, 0 ] },
+ "rangeRowCheck": { "exits": true, "range": [ 0, 0 ] },
+ "rangeConfigCheck": false,
+ "defaultOption": {
+ "title": {
+ "show": true,
+ "text": "默认标题"
+ }
+ }
+ },
+ "isShow": true
+ }
+ }
+ ```
+
+- **说明**:
+
+ |参数|说明|
+ | ------------ | ------------ |
+ |t|操作类型表示符号|
+ |i|当前sheet的index值|
+ |op|操作选项|
+ |v|图表的配置信息|
+
+- **后台更新**:
+
+ 更新对应sheet页中的图表设置,如果`luckysheetfile[i].chart`为null,则初始化为空数组 `[]`
+
+ ```json
+ luckysheetfile[0].chart.push(v)
+ ```
+
+### 移动图表位置
+
+- **格式**:
+
+ ```json
+ {
+ "t": "c",
+ "i": 0,
+ "op":"xy",
+ "v": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "left": 20,
+ "top": 120
+ }
+ }
+ ```
+
+- **说明**:
+
+ |参数|说明|
+ | ------------ | ------------ |
+ |t|操作类型表示符号|
+ |i|当前sheet的index值|
+ |op|操作选项|
+ |v|图表的配置信息|
+
+- **后台更新**:
+
+ 更新对应sheet页中的图表设置
+
+ ```js
+ luckysheetfile[0].chart[v.chart_id].left = v.left;
+ luckysheetfile[0].chart[v.chart_id].top = v.top;
+ ```
+
+### 缩放图表
+
+- **格式**:
+
+ ```json
+ {
+ "t": "c",
+ "i": 0,
+ "op":"wh",
+ "v": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "width": 400,
+ "height": 250,
+ "left": 20,
+ "top": 120
+ }
+ }
+ ```
+
+- **说明**:
+
+ |参数|说明|
+ | ------------ | ------------ |
+ |t|操作类型表示符号|
+ |i|当前sheet的index值|
+ |op|操作选项|
+ |v|图表的配置信息|
+
+- **后台更新**:
+
+ 更新对应sheet页中的图表设置
+
+ ```js
+ luckysheetfile[0].chart[v.chart_id].left = v.left;
+ luckysheetfile[0].chart[v.chart_id].top = v.top;
+ luckysheetfile[0].chart[v.chart_id].width = v.width;
+ luckysheetfile[0].chart[v.chart_id].height = v.height;
+ ```
+
+### 修改图表配置
+
+- **格式**:
+
+ ```json
+ {
+ "t": "c",
+ "i": 0,
+ "op":"update",
+ "v": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "width": 400,
+ "height": 250,
+ "left": 20,
+ "top": 120,
+ "sheetIndex": "Sheet_6az6nei65t1i_1596209937084",
+ "needRangeShow": true,
+ "chartOptions": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "chartAllType": "echarts|line|default",
+ "rangeArray": [ { "row": [ 0, 4 ], "column": [ 0, 7 ] } ],
+ "rangeColCheck": { "exits": true, "range": [ 0, 0 ] },
+ "rangeRowCheck": { "exits": true, "range": [ 0, 0 ] },
+ "rangeConfigCheck": false,
+ "defaultOption": {
+ "title": {
+ "show": true,
+ "text": "默认标题"
+ }
+ }
+ },
+ "isShow": true
+ }
+ }
+ ```
+
+- **说明**:
+
+ |参数|说明|
+ | ------------ | ------------ |
+ |t|操作类型表示符号|
+ |i|当前sheet的index值|
+ |op|操作选项|
+ |v|图表的配置信息|
+
+- **后台更新**:
+
+ 更新对应sheet页中的图表设置
+
+ ```js
+ luckysheetfile[0].chart[v.chart_id] = v;
+ ```
diff --git a/docs/zh/guide/sheet.md b/docs/zh/guide/sheet.md
index 41ce8f4..4616848 100644
--- a/docs/zh/guide/sheet.md
+++ b/docs/zh/guide/sheet.md
@@ -23,7 +23,7 @@ options.data示例如下:
"rowlen":{}, //表格行高
"columnlen":{}, //表格列宽
"rowhidden":{}, //隐藏行
- "columnhidden":{}, //隐藏列
+ "colhidden":{}, //隐藏列
"borderInfo":{}, //边框
},
"scrollLeft": 0, //左右滚动条位置
@@ -37,8 +37,10 @@ options.data示例如下:
"luckysheet_alternateformat_save": [], //交替颜色
"luckysheet_alternateformat_save_modelCustom": [], //自定义交替颜色
"luckysheet_conditionformat_save": {},//条件格式
- "frozen": {}, //冻结行列
+ "frozen": {}, //冻结行列配置
"chart": [], //图表配置
+ "allowEdit": true, //是否允许编辑
+ "zoomRatio":1, // 缩放比例
},
{
"name": "Sheet2",
@@ -219,16 +221,16 @@ options.data示例如下:
}
```
-#### config.columnhidden
+#### config.colhidden
- 类型:Object
- 默认值:{}
- 作用:隐藏列
- 格式为:`columnhidden[列数]: 0`,
+ 格式为:`colhidden[列数]: 0`,
`key`指定列数即可,`value`总是为`0`
- 示例:
```js
- "columnhidden": {
+ "colhidden": {
"30": 0,
"31": 0
}
@@ -383,11 +385,11 @@ options.data示例如下:
- 示例:
```js
[{
- "r": 6,
- "c": 3,
- "index": 1,
- "func": [true, 23.75, "=AVERAGE(D3:D6)"],
- "color": "w",
+ "r": 6, //行数
+ "c": 3, //列数
+ "index": 1, //工作表id
+ "func": [true, 23.75, "=AVERAGE(D3:D6)"], //公式信息,包含公式计算结果和公式字符串
+ "color": "w", //"w":采用深度优先算法 "b":普通计算
"parent": null,
"chidren": {},
"times": 0
@@ -421,7 +423,7 @@ options.data示例如下:
"row": [0, 12],
"column": [0, 4]
},
- "pivotDataSheetIndex": 6, //The sheet index where the source data is located
+ "pivotDataSheetIndex": 6, //源数据所在的sheet页
"column": [{
"index": 3,
"name": "subject",
@@ -441,7 +443,7 @@ options.data示例如下:
"nameindex": 0
}],
"showType": "column",
- "pivotDatas": [
+ "pivotDatas": [ //数据透视表的源数据
["count:score", "science", "mathematics", "foreign language", "English", "total"],
["Alex", 1, 1, 1, 1, 4],
["Joy", 1, 1, 1, 1, 4],
@@ -510,30 +512,30 @@ options.data示例如下:
- 示例:
```js
[{
- "cellrange": {
+ "cellrange": { //单元格范围
"row": [1, 6],
"column": [1, 5]
},
"format": {
- "head": {
+ "head": { //页眉颜色
"fc": "#000",
"bc": "#5ed593"
},
- "one": {
+ "one": { //第一种颜色
"fc": "#000",
"bc": "#ffffff"
},
- "two": {
+ "two": { //第二种颜色
"fc": "#000",
"bc": "#e5fbee"
},
- "foot": {
+ "foot": { //页脚颜色
"fc": "#000",
"bc": "#a5efcc"
}
},
- "hasRowHeader": false,
- "hasRowFooter": false
+ "hasRowHeader": false, //含有页眉
+ "hasRowFooter": false //含有页脚
}, {
"cellrange": {
"row": [1, 6],
@@ -570,19 +572,19 @@ options.data示例如下:
- 示例:
```js
[{
- "head": {
+ "head": { //页眉颜色
"fc": "#6aa84f",
"bc": "#ffffff"
},
- "one": {
+ "one": { //第一种颜色
"fc": "#000",
"bc": "#ffffff"
},
- "two": {
+ "two": { //第二种颜色
"fc": "#000",
"bc": "#e5fbee"
},
- "foot": {
+ "foot": { //页脚颜色
"fc": "#000",
"bc": "#a5efcc"
}
@@ -603,22 +605,23 @@ options.data示例如下:
"colorGradation": 色阶
+ API中对此设置也有介绍[API setRangeConditionalFormat](/zh/guide/api.html)
- 示例:
```js
[
{
"type": "default",
- "cellrange": [
+ "cellrange": [ //应用的范围
{
"row": [ 2, 7 ],
"column": [ 2, 2 ]
}
],
- "format": {
+ "format": { //type 为 default 时 应设置文本颜色和单元格颜色
"textColor": "#000000",
"cellColor": "#ff0000"
},
- "conditionName": "betweenness",
+ "conditionName": "betweenness", //类型
"conditionRange": [
{
"row": [ 4, 4 ],
@@ -721,7 +724,486 @@ options.data示例如下:
### chart
- 类型:Array
- 默认值:[]
-- 作用: 图表配置
+- 作用: 图表配置,参照chartMix的配置格式,允许只设置想要的图表属性,一个完整的配置案例如下。
+- 示例:
+ :::::: details
+ ```json
+ {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "width": 400,
+ "height": 250,
+ "left": 20,
+ "top": 120,
+ "sheetIndex": "Sheet_6az6nei65t1i_1596209937084",
+ "needRangeShow": true,
+ "chartOptions": {
+ "chart_id": "chart_p145W6i73otw_1596209943446",
+ "chartAllType": "echarts|line|default",
+ "rangeArray": [ { "row": [ 0, 4 ], "column": [ 0, 7 ] } ],
+ "rangeColCheck": { "exits": true, "range": [ 0, 0 ] },
+ "rangeRowCheck": { "exits": true, "range": [ 0, 0 ] },
+ "rangeConfigCheck": false,
+ "defaultOption": {
+ "title": {
+ "show": false,
+ "text": "默认标题",
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "position": {
+ "value": "left-top",
+ "offsetX": 40,
+ "offsetY": 50
+ }
+ },
+ "subtitle": {
+ "show": false,
+ "text": "",
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "distance": {
+ "value": "auto",
+ "cusGap": 40
+ }
+ },
+ "config": {
+ "color": "transparent",
+ "fontFamily": "Sans-serif",
+ "grid": {
+ "value": "normal",
+ "top": 5,
+ "left": 10,
+ "right": 20,
+ "bottom": 10
+ }
+ },
+ "legend": {
+ "show": true,
+ "selectMode": "multiple",
+ "selected": [
+ {
+ "seriesName": "衣服",
+ "isShow": true
+ },
+ {
+ "seriesName": "食材",
+ "isShow": true
+ },
+ {
+ "seriesName": "图书",
+ "isShow": true
+ }
+ ],
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "position": {
+ "value": "left-top",
+ "offsetX": 40,
+ "offsetY": 50,
+ "direction": "horizontal"
+ },
+ "width": {
+ "value": "auto",
+ "cusSize": 25
+ },
+ "height": {
+ "value": "auto",
+ "cusSize": 14
+ },
+ "distance": {
+ "value": "auto",
+ "cusGap": 10
+ },
+ "itemGap": 10,
+ "data": [
+ "Mon",
+ "Tues",
+ "Wed",
+ "Thur",
+ "Fri",
+ "Sat",
+ "Sun"
+ ]
+ },
+ "tooltip": {
+ "show": true,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "backgroundColor": "rgba(50,50,50,0.7)",
+ "triggerOn": "mousemove",
+ "triggerType": "item",
+ "axisPointer": {
+ "type": "line",
+ "style": {
+ "color": "#555",
+ "width": "normal",
+ "type": "solid"
+ }
+ },
+ "format": [
+ {
+ "seriesName": "衣服",
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto"
+ },
+ {
+ "seriesName": "食材",
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto"
+ },
+ {
+ "seriesName": "图书",
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto"
+ }
+ ],
+ "position": "auto"
+ },
+ "axis": {
+ "axisType": "xAxisDown",
+ "xAxisUp": {
+ "show": false,
+ "title": {
+ "showTitle": false,
+ "text": "",
+ "nameGap": 15,
+ "rotate": 0,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "fzPosition": "end"
+ },
+ "name": "显示X轴",
+ "inverse": false,
+ "tickLine": {
+ "show": true,
+ "width": 1,
+ "color": "auto"
+ },
+ "tick": {
+ "show": true,
+ "position": "outside",
+ "length": 5,
+ "width": 1,
+ "color": "auto"
+ },
+ "tickLabel": {
+ "show": true,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "rotate": 0,
+ "prefix": "",
+ "suffix": "",
+ "optimize": 0,
+ "distance": 0,
+ "min": "auto",
+ "max": "auto",
+ "ratio": 1,
+ "digit": "auto"
+ },
+ "netLine": {
+ "show": false,
+ "width": 1,
+ "type": "solid",
+ "color": "auto",
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ }
+ },
+ "netArea": {
+ "show": false,
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ },
+ "colorOne": "auto",
+ "colorTwo": "auto"
+ },
+ "axisLine": {
+ "onZero": false
+ }
+ },
+ "xAxisDown": {
+ "show": true,
+ "title": {
+ "showTitle": false,
+ "text": "",
+ "nameGap": 15,
+ "rotate": 0,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "fzPosition": "end"
+ },
+ "name": "显示X轴",
+ "inverse": false,
+ "tickLine": {
+ "show": true,
+ "width": 1,
+ "color": "auto"
+ },
+ "tick": {
+ "show": true,
+ "position": "outside",
+ "length": 5,
+ "width": 1,
+ "color": "auto"
+ },
+ "tickLabel": {
+ "show": true,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "rotate": 0,
+ "prefix": "",
+ "suffix": "",
+ "optimize": 0,
+ "distance": 0,
+ "min": null,
+ "max": null,
+ "ratio": 1,
+ "digit": "auto"
+ },
+ "netLine": {
+ "show": false,
+ "width": 1,
+ "type": "solid",
+ "color": "auto",
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ }
+ },
+ "netArea": {
+ "show": false,
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ },
+ "colorOne": "auto",
+ "colorTwo": "auto"
+ },
+ "data": [
+ "BUS",
+ "UBER",
+ "TAXI",
+ "SUBWAY"
+ ],
+ "type": "category"
+ },
+ "yAxisLeft": {
+ "show": true,
+ "title": {
+ "showTitle": false,
+ "text": "",
+ "nameGap": 15,
+ "rotate": 0,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "fzPosition": "end"
+ },
+ "name": "显示Y轴",
+ "inverse": false,
+ "tickLine": {
+ "show": true,
+ "width": 1,
+ "color": "auto"
+ },
+ "tick": {
+ "show": true,
+ "position": "outside",
+ "length": 5,
+ "width": 1,
+ "color": "auto"
+ },
+ "tickLabel": {
+ "show": true,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "rotate": 0,
+ "formatter": {
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto"
+ },
+ "split": 5,
+ "min": null,
+ "max": null,
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto",
+ "distance": 0
+ },
+ "netLine": {
+ "show": false,
+ "width": 1,
+ "type": "solid",
+ "color": "auto",
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ }
+ },
+ "netArea": {
+ "show": false,
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ },
+ "colorOne": "auto",
+ "colorTwo": "auto"
+ },
+ "type": "value"
+ },
+ "yAxisRight": {
+ "show": false,
+ "title": {
+ "showTitle": false,
+ "text": "",
+ "nameGap": 15,
+ "rotate": 0,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "fzPosition": "end"
+ },
+ "name": "显示Y轴",
+ "inverse": false,
+ "tickLine": {
+ "show": true,
+ "width": 1,
+ "color": "auto"
+ },
+ "tick": {
+ "show": true,
+ "position": "outside",
+ "length": 5,
+ "width": 1,
+ "color": "auto"
+ },
+ "tickLabel": {
+ "show": true,
+ "label": {
+ "fontSize": 12,
+ "color": "#333",
+ "fontFamily": "sans-serif",
+ "fontGroup": [],
+ "cusFontSize": 12
+ },
+ "rotate": 0,
+ "formatter": {
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto"
+ },
+ "split": 5,
+ "min": null,
+ "max": null,
+ "prefix": "",
+ "suffix": "",
+ "ratio": 1,
+ "digit": "auto",
+ "distance": 0
+ },
+ "netLine": {
+ "show": false,
+ "width": 1,
+ "type": "solid",
+ "color": "auto",
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ }
+ },
+ "netArea": {
+ "show": false,
+ "interval": {
+ "value": "auto",
+ "cusNumber": 0
+ },
+ "colorOne": "auto",
+ "colorTwo": "auto"
+ }
+ }
+ }
+ }
+ },
+ "isShow": true
+ }
+ ```
+ :::
+
+------------
+### allowEdit
+- 类型:Boolean
+- 默认值:true
+- 作用: 此sheet页是否允许编辑
+
+------------
+### zoomRatio
+- 类型:Number
+- 默认值:1
+- 作用: 此sheet页的缩放比例,为0~1之间的二位小数数字。比如`0.1`、`0.56`
------------
@@ -751,7 +1233,7 @@ Luckysheet在初始化完成之后进行的一系列操作,会将更多本地
"rowlen":{}, //表格行高
"columnlen":{}, //表格列宽
"rowhidden":{}, //隐藏行
- "columnhidden":{}, //隐藏列
+ "colhidden":{}, //隐藏列
"borderInfo":{}, //边框
},
"scrollLeft": 0, //左右滚动条位置
@@ -765,8 +1247,12 @@ Luckysheet在初始化完成之后进行的一系列操作,会将更多本地
"luckysheet_alternateformat_save": [], //交替颜色
"luckysheet_alternateformat_save_modelCustom": [], //自定义交替颜色
"luckysheet_conditionformat_save": {},//条件格式
- "freezen": {}, //冻结行列
+ "frozen": {}, //冻结行列配置
+ "freezen": {}, //冻结行列的渲染数据存储
"chart": [], //图表配置
+ "allowEdit": true, //是否允许编辑
+ "zoomRatio":1, // 缩放比例
+
"visibledatarow": [], //所有行的位置
"visibledatacolumn": [], //所有列的位置
diff --git a/src/controllers/constant.js b/src/controllers/constant.js
index 3731014..12739a5 100644
--- a/src/controllers/constant.js
+++ b/src/controllers/constant.js
@@ -127,6 +127,57 @@ const gridHTML = function(){
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\${flow}
@@ -1209,6 +1260,10 @@ function menuToolBar (){
${toolbar.splitColumn}
+
+
+ 插入图片
+
`;
}
diff --git a/src/controllers/handler.js b/src/controllers/handler.js
index 2f9291d..c0b93b1 100644
--- a/src/controllers/handler.js
+++ b/src/controllers/handler.js
@@ -4,6 +4,7 @@ import luckysheetFreezen from './freezen';
import pivotTable from './pivotTable';
import luckysheetDropCell from './dropCell';
import luckysheetPostil from './postil';
+import imageCtrl from './imageCtrl';
import menuButton from './menuButton';
import conditionformat from './conditionformat';
import alternateformat from './alternateformat';
@@ -1945,6 +1946,119 @@ export default function luckysheetHandler() {
// resize chart
Store.resizeChart(Store.chartparam.luckysheetCurrentChart)
}
+ //image move
+ else if (imageCtrl.move) {
+ let mouse = mouseposition(event.pageX, event.pageY);
+ let x = mouse[0] + $("#luckysheet-cell-main").scrollLeft();
+ let y = mouse[1] + $("#luckysheet-cell-main").scrollTop();
+
+ let myh = $("#luckysheet-modal-dialog-activeImage").outerHeight(),
+ myw = $("#luckysheet-modal-dialog-activeImage").outerWidth();
+
+ let top = y - imageCtrl.moveXY[1],
+ left = x - imageCtrl.moveXY[0];
+
+ if (top < 0) {
+ top = 0;
+ }
+
+ if (top + myh + 42 + 6 > imageCtrl.currentWinH) {
+ top = imageCtrl.currentWinH - myh - 42 - 6;
+ }
+
+ if (left < 0) {
+ left = 0;
+ }
+
+ if (left + myw + 22 + 36 > imageCtrl.currentWinW) {
+ left = imageCtrl.currentWinW - myw - 22 - 36;
+ }
+
+ $("#luckysheet-modal-dialog-activeImage").css({ "left": left, "top": top });
+ }
+ //image resize
+ else if (!!imageCtrl.resize) {
+ let mouse = mouseposition(event.pageX, event.pageY);
+ let x = mouse[0] + $("#luckysheet-cell-main").scrollLeft();
+ let y = mouse[1] + $("#luckysheet-cell-main").scrollTop();
+
+ if (x < 0 || y < 0) {
+ return false;
+ }
+
+ let resizeXY = imageCtrl.resizeXY;
+
+ let topchange = y - resizeXY[1],
+ leftchange = x - resizeXY[0];
+
+ let top = resizeXY[5],
+ height = resizeXY[3],
+ left = resizeXY[4],
+ width = resizeXY[2];
+
+ let resize = imageCtrl.resize;
+
+ if (resize == "lm" || resize == "lt" || resize == "lb") {
+ left = x;
+ width = resizeXY[2] - leftchange;
+
+ if (left > resizeXY[2] + resizeXY[4] - 60) {
+ left = resizeXY[2] + resizeXY[4] - 60;
+ width = resizeXY[2] - (resizeXY[2] + resizeXY[4] - 60 - resizeXY[0]);
+ }
+ else if (left <= 0) {
+ left = 0;
+ width = resizeXY[2] + resizeXY[0];
+ }
+ }
+
+ if (resize == "rm" || resize == "rt" || resize == "rb") {
+ width = resizeXY[2] + leftchange;
+
+ if (width < 60) {
+ width = 60;
+ }
+ else if (width >= imageCtrl.currentWinW - resizeXY[4] - 22 - 36) {
+ width = imageCtrl.currentWinW - resizeXY[4] - 22 - 36;
+ }
+ }
+
+ if (resize == "mt" || resize == "lt" || resize == "rt") {
+ top = y;
+ height = resizeXY[3] - topchange;
+
+ if (top > resizeXY[3] + resizeXY[5] - 60) {
+ top = resizeXY[3] + resizeXY[5] - 60;
+ height = resizeXY[3] - (resizeXY[3] + resizeXY[5] - 60 - resizeXY[1]);
+ }
+ else if (top <= 0) {
+ top = 0;
+ height = resizeXY[3] + resizeXY[1];
+ }
+ }
+
+ if (resize == "mb" || resize == "lb" || resize == "rb") {
+ height = resizeXY[3] + topchange;
+
+ if (height < 60) {
+ height = 60;
+ }
+ else if (height >= imageCtrl.currentWinH - resizeXY[5] - 42 - 6) {
+ height = imageCtrl.currentWinH - resizeXY[5] - 42 - 6;
+ }
+ }
+
+ $("#luckysheet-modal-dialog-activeImage").css({
+ "width": width,
+ "height": height,
+ "left": left,
+ "top": top
+ });
+ $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content").css({
+ "background-size": width + "px " + height + "px",
+ "background-position": "0px 0px"
+ })
+ }
else if (luckysheetPostil.move) {
let mouse = mouseposition(event.pageX, event.pageY);
let x = mouse[0] + $("#luckysheet-cell-main").scrollLeft();
@@ -2052,7 +2166,8 @@ export default function luckysheetHandler() {
}
else if (!!formula.rangeMove) {
formula.rangeMoveDraging(event, formula.rangeMovexy, formula.rangeMoveObj.data("range"), formula.rangeMoveObj, Store.sheetBarHeight, Store.statisticBarHeight);
- } else if (!!Store.chart_selection.rangeResize) {
+ }
+ else if (!!Store.chart_selection.rangeResize) {
Store.chart_selection.rangeResizeDraging(event, Store.sheetBarHeight, Store.statisticBarHeight);
}
else if (!!Store.chart_selection.rangeMove) {
@@ -2231,6 +2346,16 @@ export default function luckysheetHandler() {
formula.rangeResizeDragged(event, formula.rangeResizeObj, formula.rangeResize, formula.rangeResizexy, formula.rangeResizeWinW, formula.rangeResizeWinH);
}
+ //image move
+ if (imageCtrl.move) {
+ imageCtrl.moveImgItem();
+ }
+
+ //image resize
+ if (imageCtrl.resize) {
+ imageCtrl.resizeImgItem();
+ }
+
//批注框 移动
if (luckysheetPostil.move) {
luckysheetPostil.move = false;
@@ -3437,6 +3562,48 @@ export default function luckysheetHandler() {
splitColumn.init();
});
+ //菜单栏 插入图片按钮
+ $("#luckysheet-insertImg-btn-title").click(function () {
+ $("#luckysheet-imgUpload").click();
+ });
+ $("#luckysheet-imgUpload").click(function (e) {
+ e.stopPropagation();
+ });
+ $("#luckysheet-imgUpload").on("change", function(e){
+ let file = e.currentTarget.files[0];
+ let render = new FileReader();
+ render.readAsDataURL(file);
+
+ render.onload = function(event){
+ let src = event.target.result;
+
+ let rowIndex = Store.luckysheet_select_save[0].row_focus;
+ let colIndex = Store.luckysheet_select_save[0].column_focus;
+ let left = colIndex == 0 ? 0 : Store.visibledatacolumn[colIndex - 1];
+ let top = rowIndex == 0 ? 0 : Store.visibledatarow[rowIndex - 1];
+
+ let image = new Image();
+ image.onload = function(){
+ let width = image.width,
+ height = image.height;
+
+ let img = {
+ src: src,
+ left: left,
+ top: top,
+ originWidth: width,
+ originHeight: height
+ }
+
+ imageCtrl.addImgItem(img);
+ $("#luckysheet-imgUpload").val("");
+ }
+ image.src = src;
+ }
+ });
+
+
+
//冻结行列
$("#luckysheet-freezen-btn-horizontal").click(function () {
if ($.trim($(this).text()) == locale().freezen.freezenCancel) {
diff --git a/src/controllers/imageCtrl.js b/src/controllers/imageCtrl.js
new file mode 100644
index 0000000..c4fe94a
--- /dev/null
+++ b/src/controllers/imageCtrl.js
@@ -0,0 +1,283 @@
+import {
+ rowLocation,
+ colLocation,
+ mouseposition
+} from '../global/location';
+import { setluckysheet_scroll_status } from '../methods/set';
+
+const imageCtrl = {
+ imgItem: {
+ src: '', //图片url
+ originWidth: null, //图片原始宽度
+ originHeight: null, //图片原始高度
+ default: {
+ width: null, //图片 宽度
+ height: null, //图片 高度
+ left: null, //图片离表格左边的 位置
+ top: null, //图片离表格顶部的 位置
+ },
+ crop: {
+ width: null, //图片裁剪后 宽度
+ height: null, //图片裁剪后 高度
+ offsetLeft: 0, //图片裁剪后离未裁剪时 左边的位移
+ offsetTop: 0, //图片裁剪后离未裁剪时 顶部的位移
+ }
+ },
+ images: null,
+ currentImgId: null,
+ currentWinW: null,
+ currentWinH: null,
+ resize: null,
+ resizeXY: null,
+ move: false,
+ moveXY: null,
+ generateRandomId: function(prefix) {
+ if(prefix == null){
+ prefix = "img";
+ }
+
+ let userAgent = window.navigator.userAgent.replace(/[^a-zA-Z0-9]/g, "").split("");
+
+ let mid = "";
+
+ for(let i = 0; i < 12; i++){
+ mid += userAgent[Math.round(Math.random() * (userAgent.length - 1))];
+ }
+
+ let time = new Date().getTime();
+
+ return prefix + "_" + mid + "_" + time;
+ },
+ modelHtml: function(id, imgItem) {
+ let src = imgItem.src;
+
+ let width = imgItem.default.width,
+ height = imgItem.default.height,
+ left = imgItem.default.left,
+ top = imgItem.default.top;
+
+ return `
+
+
+
+
`;
+ },
+ init: function() {
+ let _this = this;
+
+ //image active
+ $("#luckysheet-image-showBoxs").off("mousedown.active").on("mousedown.active", ".luckysheet-modal-dialog-image", function(e) {
+ $(this).hide();
+
+ let id = $(this).attr("id");
+ _this.currentImgId = id;
+
+ let item = _this.images[id];
+
+ let width = item.default.width,
+ height = item.default.height,
+ left = item.default.left,
+ top = item.default.top;
+
+ if(item.crop.width != width || item.crop.height != height){
+ width = item.crop.width;
+ height = item.crop.height;
+ left = left + item.crop.offsetLeft;
+ top = top + item.crop.offsetTop;
+ }
+
+ $("#luckysheet-modal-dialog-activeImage").show().css({
+ "width": width,
+ "height": height,
+ "left": left,
+ "top": top
+ });
+
+ $("#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content").css({
+ "background-image": "url(" + item.src + ")",
+ "background-size": item.default.width + "px " + item.default.height + "px",
+ "background-position": -item.crop.offsetLeft + "px " + -item.crop.offsetTop + "px"
+ })
+
+ e.stopPropagation();
+ })
+
+ //image move
+ $("#luckysheet-modal-dialog-activeImage").off("mousedown.move").on("mousedown.move", ".luckysheet-modal-dialog-content", function(e) {
+ _this.move = true;
+
+ _this.currentWinW = $("#luckysheet-cell-main")[0].scrollWidth;
+ _this.currentWinH = $("#luckysheet-cell-main")[0].scrollHeight;
+
+ let scrollTop = $("#luckysheet-cell-main").scrollTop(),
+ scrollLeft = $("#luckysheet-cell-main").scrollLeft();
+
+ let offset = $("#luckysheet-modal-dialog-activeImage").offset();
+ let position = $("#luckysheet-modal-dialog-activeImage").position();
+
+ _this.moveXY = [
+ e.pageX - offset.left,
+ e.pageY - offset.top,
+ position.left,
+ position.top,
+ scrollLeft,
+ scrollTop
+ ];
+
+ setluckysheet_scroll_status(true);
+
+ e.stopPropagation();
+ })
+
+ //image resize
+ $("#luckysheet-modal-dialog-activeImage").off("mousedown.resize").on("mousedown.resize", ".luckysheet-modal-dialog-resize-item", function(e) {
+ _this.currentWinW = $("#luckysheet-cell-main")[0].scrollWidth;
+ _this.currentWinH = $("#luckysheet-cell-main")[0].scrollHeight;
+
+ _this.resize = $(this).data("type");
+
+ let scrollTop = $("#luckysheet-cell-main").scrollTop(),
+ scrollLeft = $("#luckysheet-cell-main").scrollLeft();
+ let mouse = mouseposition(e.pageX, e.pageY);
+ let x = mouse[0] + scrollLeft;
+ let y = mouse[1] + scrollTop;
+
+ let position = $("#luckysheet-modal-dialog-activeImage").position();
+ let width = $("#luckysheet-modal-dialog-activeImage").width();
+ let height = $("#luckysheet-modal-dialog-activeImage").height();
+
+ _this.resizeXY = [
+ x,
+ y,
+ width,
+ height,
+ position.left + scrollLeft,
+ position.top + scrollTop,
+ scrollLeft,
+ scrollTop
+ ];
+
+ setluckysheet_scroll_status(true);
+
+ e.stopPropagation();
+ })
+
+ //image crop
+ $("#luckysheet-modal-dialog-activeImage").off("mousedown.crop").on("mousedown.crop", ".luckysheet-modal-controll-crop", function(e) {
+ $("#luckysheet-modal-dialog-activeImage").hide();
+
+ let item = _this.images[_this.currentImgId];
+
+ let width = item.default.width,
+ height = item.default.height,
+ left = item.default.left,
+ top = item.default.top;
+
+ if(item.crop.width != width || item.crop.height != height){
+ width = item.crop.width;
+ height = item.crop.height;
+ left = left + item.crop.offsetLeft;
+ top = top + item.crop.offsetTop;
+ }
+
+ $("#luckysheet-modal-dialog-cropping").show().css({
+ "width": width,
+ "height": height,
+ "left": left,
+ "top": top
+ });
+
+ $("#luckysheet-modal-dialog-cropping .cropping-mask").css({
+ "width": item.default.width,
+ "height": item.default.height,
+ "background-image": "url(" + item.src + ")",
+ "left": -item.crop.offsetLeft,
+ "top": -item.crop.offsetTop
+ })
+
+ $("#luckysheet-modal-dialog-cropping .cropping-content").css({
+ "background-image": "url(" + item.src + ")",
+ "background-size": item.default.width + "px " + item.default.height + "px",
+ "background-position": -item.crop.offsetLeft + "px " + -item.crop.offsetTop + "px"
+ })
+
+ e.stopPropagation();
+ })
+
+ //image delete
+ $("#luckysheet-modal-dialog-activeImage").off("mousedown.delete").on("mousedown.delete", ".luckysheet-modal-controll-del", function(e) {
+ _this.removeImgItem();
+ })
+
+ },
+ addImgItem: function(img) {
+ let _this = this;
+
+ let width, height;
+ let max = 400;
+
+ if(img.originHeight < img.originWidth){
+ height = Math.round(img.originHeight * (max / img.originWidth));
+ width = max;
+ }
+ else{
+ width = Math.round(img.originWidth * (max / img.originHeight));
+ height = max;
+ }
+
+ if(_this.images == null){
+ _this.images = {};
+ }
+
+ let imgItem = $.extend(true, {}, _this.imgItem);
+ imgItem.src = img.src;
+ imgItem.originWidth = img.originWidth;
+ imgItem.originHeight = img.originHeight;
+ imgItem.default.width = width;
+ imgItem.default.height = height;
+ imgItem.default.left = img.left;
+ imgItem.default.top = img.top;
+ imgItem.crop.width = width;
+ imgItem.crop.height = height;
+
+ let id = _this.generateRandomId();
+ let modelHtml = _this.modelHtml(id, imgItem);
+
+ $("#luckysheet-image-showBoxs").append(modelHtml);
+
+ _this.images[id] = imgItem;
+
+ _this.init();
+ },
+ moveImgItem: function() {
+ let _this = this;
+
+ _this.move = false;
+
+ let position = $("#luckysheet-modal-dialog-activeImage").position();
+ _this.images[_this.currentImgId].left = position.left;
+ _this.images[_this.currentImgId].top = position.top;
+ },
+ resizeImgItem: function() {
+ let _this = this;
+
+ _this.resize = null;
+
+ let position = $("#luckysheet-modal-dialog-activeImage").position();
+ let width = $("#luckysheet-modal-dialog-activeImage").outerWidth();
+ let height = $("#luckysheet-modal-dialog-activeImage").outerHeight();
+
+ _this.images[_this.currentImgId].width = width;
+ _this.images[_this.currentImgId].height = height;
+ _this.images[_this.currentImgId].left = position.left;
+ _this.images[_this.currentImgId].top = position.top;
+ },
+ removeImgItem: function() {
+ let _this = this;
+
+ delete _this.images[_this.currentImgId];
+ $("#luckysheet-modal-dialog-activeImage").hide();
+ },
+}
+
+export default imageCtrl;
\ No newline at end of file
diff --git a/src/controllers/server.js b/src/controllers/server.js
index f0ee730..340a906 100644
--- a/src/controllers/server.js
+++ b/src/controllers/server.js
@@ -660,7 +660,7 @@ const server = {
$("#luckysheet-sheets-item" + index).show();
}
}
- else if(type == "c"){ //图表操作
+ else if(type == "c"){ //图表操作 TODO
let op = item.op, cid = item.cid;
if(op == "add"){ //插入
diff --git a/src/controllers/sheetmanage.js b/src/controllers/sheetmanage.js
index d618271..ae27a66 100644
--- a/src/controllers/sheetmanage.js
+++ b/src/controllers/sheetmanage.js
@@ -695,6 +695,7 @@ const sheetmanage = {
let execF = function(){
_this.mergeCalculation(file["index"]);
+ editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
_this.storeSheetParam();
_this.restoreselect();
_this.CacheNotLoadControll = [];
@@ -981,10 +982,11 @@ const sheetmanage = {
}
let load = file["load"];
- if (load != null) {
+ if (load != null) {
+ _this.mergeCalculation(index);
_this.setSheetParam(true);
_this.showSheet();
- _this.mergeCalculation(index);
+
setTimeout(function () {
formula.execFunctionGroup();
luckysheetrefreshgrid();
@@ -998,10 +1000,10 @@ const sheetmanage = {
file["data"] = data;
file["load"] = "1";
-
+ _this.mergeCalculation(index);
_this.setSheetParam();
_this.showSheet();
- _this.mergeCalculation(index);
+
setTimeout(function () {
_this.restoreCache();
formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);
@@ -1041,10 +1043,10 @@ const sheetmanage = {
file["data"] = data;
file["load"] = "1";
-
+ _this.mergeCalculation(index);
_this.setSheetParam();
_this.showSheet();
- _this.mergeCalculation(index);
+
setTimeout(function () {
_this.restoreCache();
formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);
diff --git a/src/css/luckysheet-core.css b/src/css/luckysheet-core.css
index 9965371..777039e 100644
--- a/src/css/luckysheet-core.css
+++ b/src/css/luckysheet-core.css
@@ -6397,3 +6397,221 @@ fieldset[disabled] a.btn {
background: #FC6666;
cursor: pointer;
}
+
+/* 图片 */
+#luckysheet-modal-dialog-activeImage .luckysheet-modal-dialog-content{
+ width: 100%;
+ height: 100%;
+ position: absolute;
+ left: 0;
+ top: 0;
+ cursor: move;
+}
+#luckysheet-modal-dialog-cropping::before{
+ content: "";
+ outline: 1px solid #fff;
+ position: absolute;
+ left: 33.3%;
+ right: 33.3%;
+ top: 0;
+ bottom: 0;
+ z-index: 1;
+ pointer-events: none;
+}
+#luckysheet-modal-dialog-cropping::after{
+ content: "";
+ outline: 1px solid #fff;
+ position: absolute;
+ left: 0;
+ right: 0;
+ top: 33.3%;
+ bottom: 33.3%;
+ z-index: 1;
+ pointer-events: none;
+}
+#luckysheet-modal-dialog-cropping .cropping-mask{
+ filter: brightness(.5);
+ position: absolute;
+ background-size: 100% 100%;
+ left: 0;
+ top: 0;
+}
+#luckysheet-modal-dialog-cropping .cropping-content{
+ position: absolute;
+ overflow: hidden;
+ background-position: 0 0;
+ left: 0;
+ top: 0;
+ width: 100%;
+ height: 100%;
+}
+#luckysheet-modal-dialog-cropping .luckysheet-modal-dialog-resize{
+ border: none;
+ position: absolute;
+ margin: 0px;
+ padding: 0px;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ right: 0;
+}
+#luckysheet-modal-dialog-cropping .resize-item{
+ width: 0;
+ height: 0;
+ background: none;
+ border: none;
+ position: absolute;
+ z-index: 3;
+}
+#luckysheet-modal-dialog-cropping .resize-item::before{
+ content: "";
+ display: block;
+ position: absolute;
+ background: #000;
+}
+#luckysheet-modal-dialog-cropping .resize-item::after{
+ content: "";
+ display: block;
+ position: absolute;
+ background: #000;
+}
+#luckysheet-modal-dialog-cropping .lt{
+ left: 0;
+ top: 0;
+ cursor: nwse-resize;
+}
+#luckysheet-modal-dialog-cropping .lt::before{
+ width: 18px;
+ height: 4px;
+ left: 0;
+ top: 0;
+ border-right: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .lt::after{
+ width: 4px;
+ height: 14px;
+ left: 0;
+ top: 4px;
+ border-right: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .mt{
+ left: 50%;
+ top: 0;
+ cursor: ns-resize;
+}
+#luckysheet-modal-dialog-cropping .mt::before{
+ width: 18px;
+ height: 4px;
+ left: -11px;
+ top: 0;
+ border-left: 2px solid #fff;
+ border-right: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .rt{
+ right: 0;
+ top: 0;
+ cursor: nesw-resize;
+}
+#luckysheet-modal-dialog-cropping .rt::before{
+ width: 18px;
+ height: 4px;
+ right: 0;
+ top: 0;
+ border-left: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .rt::after{
+ width: 4px;
+ height: 14px;
+ right: 0;
+ top: 4px;
+ border-left: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .lm{
+ left: 0;
+ top: 50%;
+ cursor: ew-resize;
+}
+#luckysheet-modal-dialog-cropping .lm::before{
+ width: 4px;
+ height: 18px;
+ left: 0;
+ top: -11px;
+ border-right: 2px solid #fff;
+ border-top: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .rm{
+ right: 0;
+ top: 50%;
+ cursor: ew-resize;
+}
+#luckysheet-modal-dialog-cropping .rm::before{
+ width: 4px;
+ height: 18px;
+ right: 0;
+ top: -11px;
+ border-left: 2px solid #fff;
+ border-top: 2px solid #fff;
+ border-bottom: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .lb{
+ left: 0;
+ bottom: 0;
+ cursor: nesw-resize;
+}
+#luckysheet-modal-dialog-cropping .lb::before{
+ width: 18px;
+ height: 4px;
+ left: 0;
+ bottom: 0;
+ border-right: 2px solid #fff;
+ border-top: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .lb::after{
+ width: 4px;
+ height: 14px;
+ left: 0;
+ bottom: 4px;
+ border-right: 2px solid #fff;
+ border-top: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .rb{
+ right: 0;
+ bottom: 0;
+ cursor: nwse-resize;
+}
+#luckysheet-modal-dialog-cropping .rb::before{
+ width: 18px;
+ height: 4px;
+ right: 0;
+ bottom: 0;
+ border-left: 2px solid #fff;
+ border-top: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .rb::after{
+ width: 4px;
+ height: 14px;
+ right: 0;
+ bottom: 4px;
+ border-left: 2px solid #fff;
+ border-top: 2px solid #fff;
+}
+#luckysheet-modal-dialog-cropping .mb{
+ left: 50%;
+ bottom: 0;
+ cursor: ns-resize;
+}
+#luckysheet-modal-dialog-cropping .mb::before{
+ width: 18px;
+ height: 4px;
+ left: -11px;
+ bottom: 0;
+ border-left: 2px solid #fff;
+ border-right: 2px solid #fff;
+ border-top: 2px solid #fff;
+}
\ No newline at end of file
diff --git a/src/expendPlugins/chart/plugin.js b/src/expendPlugins/chart/plugin.js
index 0132c46..adc57b8 100644
--- a/src/expendPlugins/chart/plugin.js
+++ b/src/expendPlugins/chart/plugin.js
@@ -1387,10 +1387,10 @@ function selectRangeBorderShow(chart_id) {
//luckysheet取cell-main,后续扩展到其他的用户自定义元素
$('#luckysheet-cell-main')
- .find('.luckysheet-modal-dialog-resize')
+ .find('.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize')
.hide()
$('#luckysheet-cell-main')
- .find('.luckysheet-modal-dialog-controll')
+ .find('.luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll')
.hide()
$t.css('z-index', chartInfo.chartparam.luckysheetCurrentChartZIndexRank++)
@@ -1413,7 +1413,7 @@ function selectRangeBorderShow(chart_id) {
//选择区域高亮隐藏
function selectRangeBorderHide(settingShow) {
- $('#luckysheet-cell-main .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-controll').hide()
+ $('#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll').hide()
$('#luckysheet-cell-main').find('.luckysheet-datavisual-selection-set div').remove()
chartInfo.chartparam.luckysheetCurrentChartActive = false
@@ -1447,7 +1447,7 @@ function hideChartSettingComponent(refresh) {
//隐藏设置界面
$('.chartSetting').hide();
//.luckysheet-modal-dialog-resize为图表显示框的缩放框,.luckysheet-modal-dialog-controll为显示框右边的控制按钮
- $('#luckysheet-cell-main .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-controll').hide()
+ $('#luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-resize, #luckysheet-cell-main .luckysheet-modal-dialog-chart .luckysheet-modal-dialog-controll').hide()
$('#luckysheet-cell-main').find('.luckysheet-datavisual-selection-set div').remove()
diff --git a/src/global/createdom.js b/src/global/createdom.js
index a603965..4531bcd 100644
--- a/src/global/createdom.js
+++ b/src/global/createdom.js
@@ -50,8 +50,6 @@ export default function luckysheetcreatedom(colwidth, rowheight, data, menu, tit
else {
Store.flowdata = data;
}
-
- editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据
let flowHTML = flow;
if(Store.config == null){
diff --git a/src/global/draw.js b/src/global/draw.js
index 3974103..4da0812 100644
--- a/src/global/draw.js
+++ b/src/global/draw.js
@@ -716,7 +716,7 @@ function luckysheetDrawMain(scrollWidth, scrollHeight, drawWidth, drawHeight, of
let end_c = Store.visibledatacolumn[c] - scrollWidth;
- //数据透视表\
+ //数据透视表
if (!!Store.luckysheetcurrentisPivotTable && pivotTable.drawPivotTable) {
if ((c == 0 || c == 5) && r <= 11) {
luckysheetTableContent.beginPath();
diff --git a/src/index.html b/src/index.html
index dcfe427..9d07bf7 100644
--- a/src/index.html
+++ b/src/index.html
@@ -33,7 +33,7 @@
luckysheet.create({
container: 'luckysheet',
- lang: 'zh',
+ lang: 'en',
allowEdit:true,
forceCalculation:false,
plugins: ['chart'],