wbfsa 5 years ago
parent
commit
d8a18338c5
  1. 28
      docs/guide/FAQ.md
  2. 30
      docs/zh/guide/FAQ.md
  3. 8
      docs/zh/guide/api.md
  4. 146
      docs/zh/guide/config.md
  5. 2
      docs/zh/guide/sheet.md
  6. 29
      src/controllers/handler.js
  7. 49
      src/controllers/sheetmanage.js
  8. 6
      src/demoData/sheetCell.js
  9. 31
      src/function/func.js
  10. 2
      src/global/formula.js
  11. 2
      src/global/validate.js
  12. 2
      src/index.html
  13. 3
      src/store/index.js
  14. 13
      src/utils/util.js

28
docs/guide/FAQ.md

@ -42,8 +42,32 @@ luckysheet.buildGridData(luckysheetfile)
------------
## **<span style="font-size:20px;">Q</span>** How to understand the `index` and `order` of each worksheet?
## **<span style="font-size:20px;">Q</span>** What is the difference between `index` and `order` for each sheet page?
**<span style="font-size:20px;">A</span>**: Each worksheet has a unique id, which is `index`, which can be incremented by numbers or a random string. And `order` is the order of all worksheets, starting from 0.
**<span style="font-size:20px;">A</span>**: Each sheet page has a unique id, which is `index`, which can be incremented by numbers or a random string. And `order` is the sorting situation of all sheets, starting from 0, can only be numbers `0,1,2...`.
------------
## **<span style="font-size:20px;">Q</span>** Why can’t I run the project directly under the dist folder?
**<span style="font-size:20px;">A</span>**: Need to start the local server
- [Node build a local server](https://github.com/JacksonTian/anywhere)
- [Python build local server](https://developer.mozilla.org/en-US/docs/Learn/Common_questions/set_up_a_local_testing_server)
------------
## **<span style="font-size:20px;">Q</span>** How to import and export excel?
**<span style="font-size:20px;">A</span>**: You can refer to the following cases at this stage
- Luckysheet import: https://www.cnblogs.com/DuShuSir/p/13179483.html
- Luckysheet export: https://www.cnblogs.com/recode-hyh/p/13168226.html
Later, we will open another import and export library for adaptation, so stay tuned!
------------
## **<span style="font-size:20px;">Q</span>** How to merge cells during initialization?
**<span style="font-size:20px;">A</span>**: Refer to the following case
- Luckysheet initializes data with merged cells: https://www.cnblogs.com/DuShuSir/p/13272397.html

30
docs/zh/guide/FAQ.md

@ -42,8 +42,32 @@ luckysheet.buildGridData(luckysheetfile)
------------
## **<span style="font-size:20px;">Q</span>** 如何理解每个sheet页的`index`和`order`?
## **<span style="font-size:20px;">Q</span>** 每个sheet页的`index`和`order`有什么区别
**<span style="font-size:20px;">A</span>** : 每个sheet页都有一个唯一id,就是`index`,可以用数字递增,也可以使用随机字符串,而`order`是所有的sheet的排序情况,从0开始,即为索引
**<span style="font-size:20px;">A</span>** : 每个sheet页都有一个唯一id,就是`index`,可以用数字递增,也可以使用随机字符串,而`order`是所有的sheet的排序情况,从0开始,只能为数字`0,1,2...`
------------
------------
## **<span style="font-size:20px;">Q</span>** dist文件夹下为什么不能直接运行项目?
**<span style="font-size:20px;">A</span>** :需要启动本地服务器
- [Node搭建本地服务器](https://github.com/JacksonTian/anywhere)
- [Python搭建本地服务器](https://developer.mozilla.org/zh-CN/docs/Learn/Common_questions/set_up_a_local_testing_server)
------------
## **<span style="font-size:20px;">Q</span>** excel导入导出怎么做?
**<span style="font-size:20px;">A</span>** :现阶段可以参考以下案例
- Luckysheet导入: https://www.cnblogs.com/DuShuSir/p/13179483.html
- Luckysheet导出 : https://www.cnblogs.com/recode-hyh/p/13168226.html
后期会另外开源一个导入导出库做适配,敬请期待!
------------
## **<span style="font-size:20px;">Q</span>** 初始化时合并单元格怎么做?
**<span style="font-size:20px;">A</span>** :参考以下案例
- Luckysheet初始化含合并单元格的数据: https://www.cnblogs.com/DuShuSir/p/13272397.html

8
docs/zh/guide/api.md

@ -2010,6 +2010,14 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
### toJson()
- **说明**
导出的json字符串可以直接当作`luckysheet.create(options)`初始化工作簿时的参数`options`使用,使用场景在用户自己操作表格后想要手动保存全部的参数,再去别处初始化这个表格使用,类似一个luckysheet专有格式的导入导出。
------------
## 旧版API
::: warning

146
docs/zh/guide/config.md

@ -43,9 +43,12 @@ luckysheet.create(options)
- [accuracy](#accuracy)
- [allowCopy](#allowCopy)
- [showtoolbar](#showtoolbar)
- [showtoolbarConfig](#showtoolbarConfig)
- [showinfobar](#showinfobar)
- [showsheetbar](#showsheetbar)
- [showsheetbarConfig](#showsheetbarConfig)
- [showstatisticBar](#showstatisticBar)
- [showstatisticBarConfig](#showstatisticBarConfig)
- [allowEdit](#allowEdit)
- [enableAddRow](#enableAddRow)
- [enableAddCol](#enableAddCol)
@ -60,6 +63,7 @@ luckysheet.create(options)
- [beforeCreateDom](#beforeCreateDom)
- [fireMousedown](#fireMousedown)
- [forceCalculation](#forceCalculation)
- [rightClickConfig](#rightClickConfig)
### container
- 类型:String
@ -162,6 +166,48 @@ luckysheet.create(options)
- 默认值:true
- 作用:是否第二列显示工具栏
------------
#### showtoolbarConfig
- 类型:Object
- 默认值:{}
- 作用:自定义配置工具栏
- 格式:
```json
{
undoRedo: false, //撤销重做
paintFormat: false, //格式刷
currencyFormat: false, //货币格式
percentageFormat: false, //百分比格式
numberDecrease: false, // '减少小数位数'
numberIncrease: false, // '增加小数位数
moreFormats: false, // '更多格式'
font: false, // '字体'
fontSize: false, // '字号大小'
bold: false, // '粗体 (Ctrl+B)'
italic: false, // '斜体 (Ctrl+I)'
strikethrough: false, // '删除线 (Alt+Shift+5)'
textColor: false, // '文本颜色'
fillColor: false, // '单元格颜色'
border: false, // '边框'
mergeCell: false, // '合并单元格'
horizontalAlignMode: false, // '水平对齐方式'
verticalAlignMode: false, // '垂直对齐方式'
textWrapMode: false, // '换行方式'
textRotateMode: false, // '文本旋转方式'
frozenMode: false, // '冻结方式'
sort: false, // '排序'
filter: false, // '筛选'
findAndReplace: false, // '查找替换'
function: false, // '公式'
conditionalFormat: false, // '条件格式'
postil: false, //'批注'
pivotTable: false, //'数据透视表'
chart: false, // '图表'(图标隐藏,但是如果配置了chart插件,右击仍然可以新建图表)
screenshot: false, // '截图'
splitColumn: false, // '分列'
}
```
------------
### showinfobar
- 类型:Boolean
@ -174,12 +220,38 @@ luckysheet.create(options)
- 默认值:true
- 作用:是否显示底部表格名称区域
------------
### showsheetbarConfig
- 类型:Object
- 默认值:{}
- 作用:自定义配置底部表格名称区域
- 格式:
```json
{
add: false, //新增sheet
menu: false, //sheet管理菜单
sheet: false //sheet页显示
}
```
------------
### showstatisticBar
- 类型:Boolean
- 默认值:true
- 作用:是否显示底部计数栏
------------
### showstatisticBarConfig
- 类型:Object
- 默认值:{}
- 作用:自定义配置底部计数栏
- 格式:
```json
{
count: false, // 计数栏
zoom: false // 缩放
}
------------
### allowEdit
- 类型:Boolean
@ -270,4 +342,76 @@ luckysheet.create(options)
⚠️提醒,公式较多时会有性能问题,慎用!
------------
------------
### rightClickConfig
- 类型: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, // '图表生成',
}
## 钩子函数
钩子函数应用于二次开发时,会在各个常用鼠标或者键盘操作时植入钩子,调用开发者传入的函数,起到扩展Luckysheet功能的作用。
钩子函数统一配置在`options.hook`下,可以分别针对单元格、sheet页、表格创建配置hook
### cellHover
- 类型:Function
- 默认值:null
- 作用:鼠标移过单元格时(hover)触发
- 参数:
- {Number} [r]: 单元格所在行数
- {Number} [c]: 单元格所在列数
- {Object} [v]: 单元格对象
------------
### cellClickBefore
- 类型:Function
- 默认值:null
- 作用:点击单元格前触发,即在点击单元格的时候,最先触发这个方法
------------
### cellClickAfter
- 类型:Function
- 默认值:null
- 作用:点击单元格后触发,即在点击单元格的时候,最后触发这个方法
------------
### sheetClickBefore
- 类型:Function
- 默认值:null
- 作用:点击sheet页前触发
------------
### sheetClickAfter
- 类型:Function
- 默认值:null
- 作用:点击sheet页后触发
------------
### sheetClickAfter
- 类型:Function
- 默认值:null
- 作用:点击sheet页后触发
------------

2
docs/zh/guide/sheet.md

@ -148,6 +148,8 @@ options.data示例如下:
- 默认值:{}
- 作用:表格行高、列宽、合并单元格、边框、隐藏行等设置
注意,config如果为空,必须为空对象`{}`,不能为字符串或者null
#### config.merge
- 类型:Object
- 默认值:{}

29
src/controllers/handler.js

@ -108,7 +108,7 @@ export default function luckysheetHandler() {
const _locale = locale();
const locale_drag = _locale.drag;
const locale_info = _locale.info;
let prev
let prev, mousewheelArrayUniqueTimeout;
$("#luckysheet-grid-window-1").mousewheel(function (event, delta) {
let scrollLeft = $("#luckysheet-scrollbar-x").scrollLeft(),
scrollTop = $("#luckysheet-scrollbar-y").scrollTop();
@ -123,8 +123,26 @@ export default function luckysheetHandler() {
visibledatacolumn_c = luckysheetFreezen.freezenverticaldata[3];
}
visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);
visibledatarow_c = ArrayUnique(visibledatarow_c);
clearTimeout(mousewheelArrayUniqueTimeout);
if(Store.visibledatacolumn_unique!=null){
visibledatacolumn_c = Store.visibledatacolumn_unique;
}
else{
visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);
Store.visibledatacolumn_unique = visibledatacolumn_c;
}
if(Store.visibledatarow_unique!=null){
visibledatarow_c = Store.visibledatarow_unique;
}
else{
visibledatarow_c = ArrayUnique(visibledatarow_c);
Store.visibledatarow_unique = visibledatarow_c;
}
// visibledatacolumn_c = ArrayUnique(visibledatacolumn_c);
// visibledatarow_c = ArrayUnique(visibledatarow_c);
let col_st = luckysheet_searcharray(visibledatacolumn_c, scrollLeft);
let row_st = luckysheet_searcharray(visibledatarow_c, scrollTop);
@ -179,6 +197,11 @@ export default function luckysheetHandler() {
$("#luckysheet-scrollbar-x").scrollLeft(scrollLeft);
}
mousewheelArrayUniqueTimeout = setTimeout(() => {
Store.visibledatacolumn_unique = null;
Store.visibledatarow_unique = null;
}, 200);
});
$("#luckysheet-scrollbar-x").scroll(function(){

49
src/controllers/sheetmanage.js

@ -694,6 +694,7 @@ const sheetmanage = {
}
let execF = function(){
_this.mergeCalculation(file["index"]);
_this.storeSheetParam();
_this.restoreselect();
_this.CacheNotLoadControll = [];
@ -903,6 +904,48 @@ const sheetmanage = {
Store.luckysheetfile[index]["data"] = Store.flowdata;
Store.luckysheetfile[index]["config"] = $.extend(true, {}, Store.config);
},
mergeCalculationSheet:{},
mergeCalculation:function(index){
let file = Store.luckysheetfile[this.getSheetIndex(index)];
let config = file.config, data = file.data, mergeConfig = config.merge;
if(mergeConfig==null || index in this.mergeCalculationSheet || file["autoCalculationMerge"]===false){
return;
}
this.mergeCalculationSheet[index] = 1;
for(let x in mergeConfig){
let r = parseInt(x.substr(0, x.indexOf('_')));
let c = parseInt(x.substr(x.indexOf('_') + 1));
let mcInfo = mergeConfig[x];
if(data[r][c]==null){
data[r][c] = {};
}
data[r][c]["mc"] = {
r:r,
c:c,
rs:mcInfo.rs,
cs:mcInfo.cs,
}
for(let ir=r;ir<r+mcInfo.rs;ir++){
for(let ic=c;ic<c+mcInfo.cs;ic++){
if(ir==r && ic==c){
continue;
}
if(data[ir][ic]==null){
data[ir][ic] = {};
}
data[ir][ic]["mc"] = {
r:r,
c:c,
}
}
}
}
},
changeSheet: function(index, isPivotInitial, isNewSheet) {
if(isEditMode()){
// alert("非编辑模式下不允许该操作!");
@ -941,7 +984,7 @@ const sheetmanage = {
if (load != null) {
_this.setSheetParam(true);
_this.showSheet();
_this.mergeCalculation(index);
setTimeout(function () {
formula.execFunctionGroup();
luckysheetrefreshgrid();
@ -958,7 +1001,7 @@ const sheetmanage = {
_this.setSheetParam();
_this.showSheet();
_this.mergeCalculation(index);
setTimeout(function () {
_this.restoreCache();
formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);
@ -1001,7 +1044,7 @@ const sheetmanage = {
_this.setSheetParam();
_this.showSheet();
_this.mergeCalculation(index);
setTimeout(function () {
_this.restoreCache();
formula.execFunctionGroupForce(luckysheetConfigsetting.forceCalculation);

6
src/demoData/sheetCell.js

@ -20,6 +20,12 @@ const sheetCell = {
"c": 2,
"rs": 1,
"cs": 2
},
"15_10": {
"r": 15,
"c": 10,
"rs": 4,
"cs": 3
}
},
"borderInfo": [{

31
src/function/func.js

@ -1,7 +1,7 @@
import func_methods from '../global/func_methods';
import formula from '../global/formula';
import tooltip from '../global/tooltip';
import { isRealNum, valueIsError } from '../global/validate';
import { isRealNum, valueIsError,error } from '../global/validate';
import { getdatabyselectionD } from '../global/getdata';
import { genarate } from '../global/format';
import { inverse } from '../function/matrix_methods';
@ -9,17 +9,6 @@ import { getSheetIndex, getluckysheetfile, getRangetxt } from '../methods/get';
import { getObjType, ABCatNum } from '../utils/util';
import Store from '../store';
const error = {
v: "#VALUE!", //错误的参数或运算符
n: "#NAME?", //公式名称错误
na: "#N/A", //函数或公式中没有可用数值
r: "#REF!", //删除了由其他公式引用的单元格
d: "#DIV/0!", //除数是0或空单元格
nm: "#NUM!", //当公式或函数中某个数字有问题时
nl: "#NULL!", //交叉运算符(空格)使用不正确
sp: "#SPILL!" //数组范围有其它值
}
//函数功能:比较或运算
function luckysheet_compareWith() {
//第一个参数和第三个参数,返回比较结果的布尔值或者运算值
@ -89,7 +78,19 @@ function luckysheet_compareWith() {
sp = "==";
}
if(sp == "-" && fp == null){
if(fp==null && tp==null){
return "#INVERSE!";
}
else if(fp=="#INVERSE!"){
fp =0;
if(sp=="-"){
sp = "+";
}
else if(sp=="+"){
sp = "-";
}
}
else if(sp == "-" && fp == null){
fp = 0;
}
@ -965,7 +966,7 @@ function luckysheet_compareWith() {
value = error.d;
}
else{
value = eval(parseFloat(fp[n]) + sp + parseFloat(tp[n]));
value = eval(parseFloat(fp[n]) + sp + "(" + parseFloat(tp[n]) + ")" );
}
}
else{
@ -1096,7 +1097,7 @@ function luckysheet_compareWith() {
result = error.d;
}
else{
result = eval(parseFloat(fp) + sp + parseFloat(tp));
result = eval(parseFloat(fp) + sp + "(" + parseFloat(tp) + ")");
}
}
else{

2
src/global/formula.js

@ -3845,7 +3845,7 @@ const luckysheetformula = {
i++;
}
console.log(function_str);
return function_str;
},
addFunctionGroup: function(r, c, func, index) {

2
src/global/validate.js

@ -1,7 +1,7 @@
import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';
import Store from '../store';
const error = {
export const error = {
v: "#VALUE!", //错误的参数或运算符
n: "#NAME?", //公式名称错误
na: "#N/A", //函数或公式中没有可用数值

2
src/index.html

@ -33,7 +33,7 @@
luckysheet.create({
container: 'luckysheet',
lang: 'en',
lang: 'zh',
allowEdit:true,
forceCalculation:false,
plugins: ['chart'],

3
src/store/index.js

@ -118,6 +118,9 @@ const Store = {
measureTextCacheTimeOut:null,
zoomRatio:1,
visibledatacolumn_unique:null,
visibledatarow_unique:null,
}
export default Store;

13
src/utils/util.js

@ -278,17 +278,18 @@ function getByteLen(val) {
//数组去重
function ArrayUnique(dataArr) {
let arr = [];
let result = [];
let obj = {};
if (dataArr.length > 0) {
for (let i = 0; i < dataArr.length; i++) {
if (arr.indexOf(dataArr[i]) == -1) {
arr.push(dataArr[i]);
let item = dataArr[i];
if (!obj[item]) {
result.push(item);
obj[item] = 1;
}
}
}
return arr;
return result
}
//获取字体配置

Loading…
Cancel
Save