' +
'
' +
'
' +
@@ -507,10 +513,10 @@ const luckysheetPostil = {
let toX = col;
let toY = row_pre;
- let left = postil["left"] == null ? toX + 18 : postil["left"];
- let top = postil["top"] == null ? toY - 18 : postil["top"];
- let width = postil["width"] == null ? _this.defaultWidth : postil["width"];
- let height = postil["height"] == null ? _this.defaultHeight : postil["height"];
+ let left = postil["left"] == null ? toX + 18 * Store.zoomRatio : postil["left"] * Store.zoomRatio;
+ let top = postil["top"] == null ? toY - 18 * Store.zoomRatio : postil["top"] * Store.zoomRatio;
+ let width = postil["width"] == null ? _this.defaultWidth * Store.zoomRatio : postil["width"] * Store.zoomRatio;
+ let height = postil["height"] == null ? _this.defaultHeight * Store.zoomRatio : postil["height"] * Store.zoomRatio;
let value = postil["value"] == null ? "" : postil["value"];
if(top < 0){
@@ -609,10 +615,10 @@ const luckysheetPostil = {
let toX = col;
let toY = row_pre;
- let left = postil["left"] == null ? toX + 18 : postil["left"];
- let top = postil["top"] == null ? toY - 18 : postil["top"];
- let width = postil["width"] == null ? _this.defaultWidth : postil["width"];
- let height = postil["height"] == null ? _this.defaultHeight : postil["height"];
+ let left = postil["left"] == null ? toX + 18 * Store.zoomRatio : postil["left"] * Store.zoomRatio;
+ let top = postil["top"] == null ? toY - 18 * Store.zoomRatio : postil["top"] * Store.zoomRatio;
+ let width = postil["width"] == null ? _this.defaultWidth * Store.zoomRatio : postil["width"] * Store.zoomRatio;
+ let height = postil["height"] == null ? _this.defaultHeight * Store.zoomRatio : postil["height"] * Store.zoomRatio;
let value = postil["value"] == null ? "" : postil["value"];
if(top < 0){
@@ -723,10 +729,10 @@ const luckysheetPostil = {
let toX = col;
let toY = row_pre;
- let left = postil["left"] == null ? toX + 18 : postil["left"];
- let top = postil["top"] == null ? toY - 18 : postil["top"];
- let width = postil["width"] == null ? _this.defaultWidth : postil["width"];
- let height = postil["height"] == null ? _this.defaultHeight : postil["height"];
+ let left = postil["left"] == null ? toX + 18 * Store.zoomRatio : postil["left"] * Store.zoomRatio;
+ let top = postil["top"] == null ? toY - 18 * Store.zoomRatio : postil["top"] * Store.zoomRatio;
+ let width = postil["width"] == null ? _this.defaultWidth * Store.zoomRatio : postil["width"] * Store.zoomRatio;
+ let height = postil["height"] == null ? _this.defaultHeight * Store.zoomRatio : postil["height"] * Store.zoomRatio;
let value = postil["value"] == null ? "" : postil["value"];
if(top < 0){
diff --git a/src/controllers/zoom.js b/src/controllers/zoom.js
index 34d3569..711e395 100644
--- a/src/controllers/zoom.js
+++ b/src/controllers/zoom.js
@@ -5,6 +5,7 @@ import sheetmanage from './sheetmanage';
import {changeSheetContainerSize} from './resize';
import { jfrefreshgrid_rhcw } from '../global/refresh';
import server from './server';
+import luckysheetPostil from './postil';
import imageCtrl from './imageCtrl';
@@ -31,6 +32,9 @@ export function zoomChange(ratio){
let currentSheet = sheetmanage.getSheetByIndex();
+ //批注
+ luckysheetPostil.buildAllPs(currentSheet.data);
+
//图片
imageCtrl.images = currentSheet.images;
imageCtrl.allImagesShow();
diff --git a/src/global/draw.js b/src/global/draw.js
index 2ad7da4..e62fb50 100644
--- a/src/global/draw.js
+++ b/src/global/draw.js
@@ -1112,7 +1112,7 @@ let nullCellRender = function(r, c, start_r, start_c, end_r, end_c,luckysheetTab
//若单元格有批注
if(Store.flowdata[r][c] != null && Store.flowdata[r][c].ps != null){
- let ps_w = 5*Store.zoomRatio, ps_h = 5*Store.zoomRatio;
+ let ps_w = 8*Store.zoomRatio, ps_h = 8*Store.zoomRatio;
luckysheetTableContent.beginPath();
luckysheetTableContent.moveTo( (end_c + offsetLeft - 1- ps_w), (start_r + offsetTop));
luckysheetTableContent.lineTo( (end_c + offsetLeft - 1), (start_r + offsetTop));
@@ -1338,17 +1338,17 @@ let cellRender = function(r, c, start_r, start_c, end_r, end_c, value, luckyshee
let verticalAlignPos_text = (pos_y + verticalCellHeight - space_height) ; //文本垂直方向基准线
luckysheetTableContent.textBaseline = "bottom";
- let verticalAlignPos_checkbox = verticalAlignPos_text - 13;
+ let verticalAlignPos_checkbox = verticalAlignPos_text - 13 * Store.zoomRatio;
if(verticalAlign == "0"){ //居中对齐
verticalAlignPos_text = (pos_y + verticalCellHeight / 2);
luckysheetTableContent.textBaseline = "middle";
- verticalAlignPos_checkbox = verticalAlignPos_text - 6;
+ verticalAlignPos_checkbox = verticalAlignPos_text - 6 * Store.zoomRatio;
}
else if(verticalAlign == "1"){ //上对齐
verticalAlignPos_text = (pos_y + space_height);
luckysheetTableContent.textBaseline = "top";
- verticalAlignPos_checkbox = verticalAlignPos_text + 1;
+ verticalAlignPos_checkbox = verticalAlignPos_text + 1 * Store.zoomRatio;
}
horizonAlignPos = horizonAlignPos / Store.zoomRatio;
From 00b351fa0dc01c32cf9c6b8852937e7d2ceb292d Mon Sep 17 00:00:00 2001
From: liuyang
Date: Wed, 21 Oct 2020 15:07:08 +0800
Subject: [PATCH 5/9] fix(setcellvalue delete function fix): fix it
---
src/controllers/cellFormat.js | 22 ++++++++++++++++------
src/global/formula.js | 4 +++-
src/global/setdata.js | 6 +++---
src/index.html | 4 ++--
4 files changed, 24 insertions(+), 12 deletions(-)
diff --git a/src/controllers/cellFormat.js b/src/controllers/cellFormat.js
index 87c69c9..415b794 100644
--- a/src/controllers/cellFormat.js
+++ b/src/controllers/cellFormat.js
@@ -6,6 +6,7 @@ import menuButton from './menuButton';
import {checkProtectionNotEnable} from './protection';
import { jfrefreshgrid } from '../global/refresh';
import locale from '../locale/locale';
+import { setcellvalue } from '../global/setdata';
let isInitialCellFormatModel = false;
@@ -22,9 +23,17 @@ function initialCellFormatModelEvent(){
hidden = hidden==true?1:0;
let d = recycleSeletion(
- function(cell){
- cell.lo = locked;
- cell.hi = hidden;
+ function(cell, r, c, data){
+ if(cell==null){
+ setcellvalue(r, c, data, {
+ lo:locked,
+ hi:hidden
+ });
+ }
+ else{
+ cell.lo = locked;
+ cell.hi = hidden;
+ }
},
function(){
alert(local_cellFormat.sheetDataIsNullAlert);
@@ -79,7 +88,8 @@ function recycleSeletion(cycleFunction, dataIsNullFunction){
// }
// count++;
- cycleFunction(cell);
+
+ cycleFunction(cell, r, c, data);
}
}
}
@@ -152,12 +162,12 @@ export function openCellFormatModel(){
recycleSeletion(
function(cell){
// let cell = data[r][c];
- if(cell.lo==null || cell.lo==1){
+ if(cell==null || cell.lo==null || cell.lo==1){
locked = true;
lockedCount++;
}
- if(cell.hi==1){
+ if(cell!=null && cell.hi==1){
hidden = true;
hiddenCount++;
}
diff --git a/src/global/formula.js b/src/global/formula.js
index 0e97a90..706d31a 100644
--- a/src/global/formula.js
+++ b/src/global/formula.js
@@ -1238,7 +1238,7 @@ const luckysheetformula = {
}
if(!checkProtectionLocked(r, c, Store.currentSheetIndex)){
- return
+ return;
}
//数据验证 输入数据无效时禁止输入
@@ -5188,6 +5188,7 @@ const luckysheetformula = {
"r": u.r,
"c": u.c,
"v": v[1],
+ "f": v[2],
"spe":v[3],
"index": u.index
});
@@ -5226,6 +5227,7 @@ const luckysheetformula = {
}
}
updateValue.v = item.v;
+ updateValue.f = item.f;
setcellvalue(item.r, item.c, data, updateValue);
server.saveParam("v", item.index, item.v, {
"r": item.r,
diff --git a/src/global/setdata.js b/src/global/setdata.js
index 460a2b3..2f968a1 100644
--- a/src/global/setdata.js
+++ b/src/global/setdata.js
@@ -22,9 +22,9 @@ function setcellvalue(r, c, d, v) {
if(v.f != null){
cell.f = v.f;
}
- else{
- delete cell.f;
- }
+ // else{
+ // delete cell.f;
+ // }
if(v.spl != null){
cell.spl = v.spl;
diff --git a/src/index.html b/src/index.html
index 4ea429d..7c5aa2c 100644
--- a/src/index.html
+++ b/src/index.html
@@ -53,8 +53,8 @@
"url":"./assets/iconfont/Pacifico-Regular.ttf"
}
],
- data:
- [sheetCell,sheetFormula,sheetConditionFormat,sheetSparkline,sheetTable,sheetComment,sheetPivotTableData,sheetPivotTable,sheetChart,sheetPicture,sheetDataVerification]
+ // data:
+ // [sheetCell,sheetFormula,sheetConditionFormat,sheetSparkline,sheetTable,sheetComment,sheetPivotTableData,sheetPivotTable,sheetChart,sheetPicture,sheetDataVerification]
/*[{"name":"Sheet1","config":{"columnlen":{"0":241},"rowlen":{"0":81,"17":100}},"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":{
From 0fd06cc4d7f465967b3bcc91e0b2484ba61b71f6 Mon Sep 17 00:00:00 2001
From: wpxp123456 <2677556700@qq.com>
Date: Wed, 21 Oct 2020 17:49:55 +0800
Subject: [PATCH 6/9] feat(api add): setRowHeight setColumnWidth setSheetZoom
setDataVerification deleteDataVerification
---
docs/zh/guide/api.md | 30 ++-
src/global/api.js | 447 +++++++++++++++++++++++++++++++++++++++++++
2 files changed, 461 insertions(+), 16 deletions(-)
diff --git a/docs/zh/guide/api.md b/docs/zh/guide/api.md
index 9fed4d3..2cf2df8 100644
--- a/docs/zh/guide/api.md
+++ b/docs/zh/guide/api.md
@@ -544,8 +544,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setRowHeight(rowInfo [,setting])
-(TODO)
-
- **参数**:
- {Object} [rowInfo]: 行数和高度对应关系
@@ -568,8 +566,6 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setColumnWidth(columnInfo [,setting])
-(TODO)
-
- **参数**:
- {Number} [columnInfo]: 列数和宽度对应关系
@@ -2004,14 +2000,12 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### setSheetZoom(zoom [,setting])
-[todo]
-
-
- **参数**:
- - {Number} [zoom]: 工作表缩放比例
+ - {Number} [zoom]: 工作表缩放比例,值范围为0.1 ~ 4;
- {PlainObject} [setting]: 可选参数
+ + {Number} [order]: 工作表下标;默认值为当前工作表下标
+ {Function} [success]: 操作结束的回调函数
- **说明**:
@@ -2295,15 +2289,21 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
## 数据验证
-### setDataVerification(option, [setting])
-
-[todo]
+### setDataVerification(optionItem, [setting])
- **参数**:
- - {Object} [option]: 数据验证的配置信息
+ - {Object} [optionItem]: 数据验证的配置信息
+ + {String} [type]: 类型;值可为`"dropdown"`(下拉列表)、`"checkbox"`(复选框)、`"number"`(数字)、`"number_integer"`(数字-整数)、`"number_decimal"`(数字-小数)、`"text_content"`(文本-内容)、`"text_length"`(文本-长度)、`"date"`(日期)、`"validity"`(有效性);
+ + {String | Null} [type2]: 条件类型;类型`type`值为`"dropdown"`、`"checkbox"`时,`type2`值可为`null`;类型`type`值为`"number"`、`"number_integer"`、`"number_decimal"`、`"text_length"`时,`type2`值可为`"bw"`(介于)、`"nb"`(不介于)、`"eq"`(等于)、`"ne"`(不等于)、`"gt"`(大于)、`"lt"`(小于)、`"gte"`(大于等于)、`"lte"`(小于等于);类型`type`值为`"text_content"`时,`type2`值可为`"include"`(包括)、`"exclude"`(不包括)、`"equal"`(等于);类型`type`值为`"date"`时,`type2`值可为`"bw"`(介于)、`"nb"`(不介于)、`"eq"`(等于)、`"ne"`(不等于)、`"bf"`(早于)、`"nbf"`(不早于)、`"af"`(晚于)、`"naf"`(不晚于);类型`type`值为`"validity"`时,`type2`值可为`"card"`(身份证号码)、`"phone"`(手机号);
+ + {String | Number} [value1]: 条件值1;类型`type`值为`"dropdown"`时,`value1`值可为选区或以英文逗号隔开的字符串,如`"1,2,3"`或者`"A1:B2"`;类型`type`值为`"validity"`时,`value1`值可为空;其他类型时`value1`值为数值或字符串;
+ + {String | Number} [value2]: 条件值2;类型`type`值为`"checkbox"`或者条件类型`type2`值为`"bw"`、`"nb"`时有`value2`值,条件值为数值或日期时,条件值2要大于等于条件值1;其它情况可为空;
+ + {Boolean} [remote]: 自动远程获取选项;默认为`false`;
+ + {Boolean} [prohibitInput]: 输入数据无效时禁止输入;默认为`false`;
+ + {Boolean} [hintShow]: 选中单元格时显示提示语;默认为`false`;
+ + {String} [hintText]: 提示语文本;`hintShow`为`true`时需配置;
- {PlainObject} [setting]: 可选参数
- + {Array | Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区
+ + {Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区
+ {Number} [order]: 工作表下标;默认值为当前工作表下标
+ {Function} [success]: 操作结束的回调函数
@@ -2315,12 +2315,10 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
### deleteDataVerification([setting])
-[todo,待确认是否合理]
-
- **参数**:
- {PlainObject} [setting]: 可选参数
- + {Array | Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区
+ + {Object | String} [range]: 数据验证的选区范围,支持选区的格式为`"A1:B2"`、`"sheetName!A1:B2"`或者`{row:[0,1],column:[0,1]}`,只能为单个选区;默认为当前选区
+ {Number} [order]: 工作表下标;默认值为当前工作表下标
+ {Function} [success]: 操作结束的回调函数
diff --git a/src/global/api.js b/src/global/api.js
index bd68992..ad26e8b 100644
--- a/src/global/api.js
+++ b/src/global/api.js
@@ -35,6 +35,8 @@ import { selectHightlightShow, selectIsOverlap } from '../controllers/select';
import { sheetHTML, luckysheetdefaultstyle } from '../controllers/constant';
import { createFilterOptions } from '../controllers/filter';
import controlHistory from '../controllers/controlHistory';
+import { zoomRefreshView, zoomNumberDomBind } from '../controllers/zoom';
+import dataVerificationCtrl from "../controllers/dataVerificationCtrl";
const IDCardReg = /^\d{6}(18|19|20)?\d{2}(0[1-9]|1[12])(0[1-9]|[12]\d|3[01])\d{3}(\d|X)$/i;
@@ -1176,6 +1178,113 @@ export function showColumn(startIndex, endIndex, options = {}) {
showRowOrColumn('column', startIndex, endIndex, options);
}
+
+/**
+ * 设置指定行的高度
+ * @param {Object} rowInfo 行数和高度对应关系
+ * @param {Object} options 可选参数
+ * @param {Number} options.order 工作表索引;默认值为当前工作表索引
+ * @param {Function} options.success 操作结束的回调函数
+ */
+export function setRowHeight(rowInfo, options = {}) {
+ if(getObjType(rowInfo) != 'object'){
+ return tooltip.info("The rowInfo parameter is invalid.", "");
+ }
+
+ let {
+ order = getSheetIndex(Store.currentSheetIndex),
+ success
+ } = {...options}
+
+ let file = Store.luckysheetfile[order];
+
+ if(file == null){
+ return tooltip.info("The order parameter is invalid.", "");
+ }
+
+ let cfg = $.extend(true, {}, file.config);
+ if(cfg['rowlen'] == null){
+ cfg['rowlen'] = {};
+ }
+
+ for(let r in rowInfo){
+ if(parseInt(r) >= 0){
+ let len = rowInfo[r];
+
+ if(Number(len) >= 0){
+ cfg['rowlen'][parseInt(r)] = Number(len);
+ }
+ }
+ }
+
+ file.config = cfg;
+
+ server.saveParam("cg", file.index, cfg["rowlen"], { "k": "rowlen" });
+
+ if(file.index == Store.currentSheetIndex){
+ Store.config = cfg;
+ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+ }
+
+ if (success && typeof success === 'function') {
+ success()
+ }
+}
+
+
+/**
+ * 设置指定列的宽度
+ * @param {Object} columnInfo 行数和高度对应关系
+ * @param {Object} options 可选参数
+ * @param {Number} options.order 工作表索引;默认值为当前工作表索引
+ * @param {Function} options.success 操作结束的回调函数
+ */
+export function setColumnWidth(columnInfo, options = {}) {
+ if(getObjType(columnInfo) != 'object'){
+ return tooltip.info("The columnInfo parameter is invalid.", "");
+ }
+
+ let {
+ order = getSheetIndex(Store.currentSheetIndex),
+ success
+ } = {...options}
+
+ let file = Store.luckysheetfile[order];
+
+ if(file == null){
+ return tooltip.info("The order parameter is invalid.", "");
+ }
+
+ let cfg = $.extend(true, {}, file.config);
+ if(cfg['columnlen'] == null){
+ cfg['columnlen'] = {};
+ }
+
+ for(let c in columnInfo){
+ if(parseInt(c) >= 0){
+ let len = columnInfo[c];
+
+ if(Number(len) >= 0){
+ cfg['columnlen'][parseInt(c)] = Number(len);
+ }
+ }
+ }
+
+ file.config = cfg;
+
+ server.saveParam("cg", file.index, cfg["columnlen"], { "k": "columnlen" });
+
+ if(file.index == Store.currentSheetIndex){
+ Store.config = cfg;
+ jfrefreshgrid_rhcw(Store.flowdata.length, Store.flowdata[0].length);
+ }
+
+ if (success && typeof success === 'function') {
+ success()
+ }
+}
+
+
/**
* 返回当前选区对象的数组,可能存在多个选区。
* 每个选区的格式为row/column信息组成的对象{row:[0,1],column:[0,1]}
@@ -4722,6 +4831,46 @@ export function setSheetOrder(orderList, options = {}) {
}
+/**
+ * 设置工作表缩放比例
+ * @param {Number} zoom 工作表缩放比例,值范围为0.1 ~ 4;
+ * @param {Object} options 可选参数
+ * @param {Number} options.order 工作表下标;默认值为当前工作表下标
+ * @param {Function} options.success 操作结束的回调函数
+ */
+export function setSheetZoom(zoom, options = {}) {
+ if(getObjType(zoom) != 'number' && (zoom < 0.1 || zoom > 4)){
+ return tooltip.info("The zoom parameter is invalid.", "");
+ }
+
+ let {
+ order = getSheetIndex(Store.currentSheetIndex),
+ success
+ } = {...options}
+
+ let file = Store.luckysheetfile[order];
+
+ if(file == null){
+ return tooltip.info("The order parameter is invalid.", "");
+ }
+
+ file["zoomRatio"] = zoom;
+
+ server.saveParam("all", file.index, zoom, { "k": "zoomRatio" });
+
+ if(file.index == Store.currentSheetIndex){
+ Store.zoomRatio = zoom;
+
+ zoomNumberDomBind();
+ zoomRefreshView();
+ }
+
+ if (success && typeof success === 'function') {
+ success();
+ }
+}
+
+
/**
* 显示指定下标工作表的网格线,返回操作的工作表对象
* @param {Object} options 可选参数
@@ -5211,6 +5360,304 @@ export function getLuckysheetfile(){
return getluckysheetfile();
}
+
+/**
+ * 指定工作表范围设置数据验证功能,并设置参数
+ * @param {Object} optionItem 数据验证的配置信息
+ * @param {String} optionItem.type 类型
+ * @param {String | Null} optionItem.type2 条件类型
+ * @param {String | Number} optionItem.value1 条件值1
+ * @param {String | Number} optionItem.value2 条件值2
+ * @param {Boolean} optionItem.checked 选中状态
+ * @param {Boolean} optionItem.remote 自动远程获取选项
+ * @param {Boolean} optionItem.prohibitInput 输入数据无效时禁止输入
+ * @param {Boolean} optionItem.hintShow 选中单元格时显示提示语
+ * @param {String} optionItem.hintText 提示语文本
+ * @param {Object} options 可选参数
+ * @param {Array | Object | String} options.range 选区范围;默认为当前选区
+ * @param {Number} options.order 工作表下标;默认值为当前工作表下标
+ * @param {Function} options.success 操作结束的回调函数
+ */
+export function setDataVerification(optionItem, options = {}) {
+ if(getObjType(optionItem) != 'object'){
+ return tooltip.info("The optionItem parameter is invalid.", "");
+ }
+
+ let {
+ type,
+ type2 = null,
+ value1 = '',
+ value2 = '',
+ remote = false,
+ prohibitInput = false,
+ hintShow = false,
+ hintText = ''
+ } = {...optionItem}
+
+ let typeValues = ["dropdown", "checkbox", "number", "number_integer", "number_decimal", "text_content", "text_length", "date", "validity"];
+ let type2Values_1 = ["bw", "nb", "eq", "ne", "gt", "lt", "gte", "lte"];
+ let type2Values_2 = ["include", "exclude", "equal"];
+ let type2Values_3 = ["bw", "nb", "eq", "ne", "bf", "nbf", "af", "naf"];
+ let type2Values_4 = ["card", "phone"];
+
+ if(!typeValues.includes(type)){
+ return tooltip.info("The optionItem.type parameter is invalid.", "");
+ }
+
+ let dvText = locale().dataVerification;
+
+ if(type == 'dropdown'){
+ if(value1.length == 0){
+ tooltip.info('', dvText.tooltipInfo1);
+ return;
+ }
+ }
+ else if(type == 'checkbox'){
+ if(value1.length == 0 || value2.length == 0){
+ tooltip.info('', dvText.tooltipInfo2);
+ return;
+ }
+ }
+ else if(type == 'number' || type == 'number_integer' || type == 'number_decimal'){
+ if(!type2Values_1.includes(type2)){
+ return tooltip.info("The optionItem.type2 parameter is invalid.", "");
+ }
+
+ if(!isRealNum(value1)){
+ tooltip.info('', dvText.tooltipInfo3);
+ return;
+ }
+
+ if(type2 == 'bw' || type2 == 'nb'){
+ if(!isRealNum(value2)){
+ tooltip.info('', dvText.tooltipInfo3);
+ return;
+ }
+
+ if(Number(value2) < Number(value1)){
+ tooltip.info('', dvText.tooltipInfo4);
+ return;
+ }
+ }
+ }
+ else if(type == 'text_content'){
+ if(!type2Values_2.includes(type2)){
+ return tooltip.info("The optionItem.type2 parameter is invalid.", "");
+ }
+
+ if(value1.length == 0){
+ tooltip.info('', dvText.tooltipInfo5);
+ return;
+ }
+ }
+ else if(type == 'text_length'){
+ if(!type2Values_1.includes(type2)){
+ return tooltip.info("The optionItem.type2 parameter is invalid.", "");
+ }
+
+ if(!isRealNum(value1)){
+ tooltip.info('', dvText.tooltipInfo3);
+ return;
+ }
+
+ if(type2 == 'bw' || type2 == 'nb'){
+ if(!isRealNum(value2)){
+ tooltip.info('', dvText.tooltipInfo3);
+ return;
+ }
+
+ if(Number(value2) < Number(value1)){
+ tooltip.info('', dvText.tooltipInfo4);
+ return;
+ }
+ }
+ }
+ else if(type == 'date'){
+ if(!type2Values_3.includes(type2)){
+ return tooltip.info("The optionItem.type2 parameter is invalid.", "");
+ }
+
+ if(!isdatetime(value1)){
+ tooltip.info('', dvText.tooltipInfo6);
+ return;
+ }
+
+ if(type2 == 'bw' || type2 == 'nb'){
+ if(!isdatetime(value2)){
+ tooltip.info('', dvText.tooltipInfo6);
+ return;
+ }
+
+ if(diff(value1, value2) > 0){
+ tooltip.info('', dvText.tooltipInfo7);
+ return;
+ }
+ }
+ }
+ else if(type == 'validity'){
+ if(!type2Values_4.includes(type2)){
+ return tooltip.info("The optionItem.type2 parameter is invalid.", "");
+ }
+ }
+
+ if(getObjType(remote) != 'boolean'){
+ return tooltip.info("The optionItem.remote parameter is invalid.", "");
+ }
+
+ if(getObjType(prohibitInput) != 'boolean'){
+ return tooltip.info("The optionItem.prohibitInput parameter is invalid.", "");
+ }
+
+ if(getObjType(hintShow) != 'boolean'){
+ return tooltip.info("The optionItem.hintShow parameter is invalid.", "");
+ }
+
+ let {
+ range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],
+ order = getSheetIndex(Store.currentSheetIndex),
+ success
+ } = {...options}
+
+ if(getObjType(range) == 'string'){
+ if(!formula.iscelldata(range)){
+ return tooltip.info("The range parameter is invalid.", "");
+ }
+
+ let cellrange = formula.getcellrange(range);
+ range = {
+ "row": cellrange.row,
+ "column": cellrange.column
+ };
+ }
+
+ if(getObjType(range) != 'object' || range.row == null || range.column == null){
+ return tooltip.info("The range parameter is invalid.", "");
+ }
+
+ let file = Store.luckysheetfile[order];
+
+ if(file == null){
+ return tooltip.info("The order parameter is invalid.", "");
+ }
+
+ let item = {
+ type: type,
+ type2: type2,
+ value1: value1,
+ value2: value2,
+ checked: false,
+ remote: remote,
+ prohibitInput: prohibitInput,
+ hintShow: hintShow,
+ hintText: hintText,
+ }
+
+ let currentDataVerification = $.extend(true, {}, file.dataVerification);
+
+ let data = $.extend(true, [], file.data);
+ if(data.length == 0){
+ data = sheetmanage.buildGridData(file);
+ }
+
+ let str = range.row[0],
+ edr = range.row[1],
+ stc = range.column[0],
+ edc = range.column[1];
+
+ for(let r = str; r <= edr; r++){
+ for(let c = stc; c <= edc; c++){
+ currentDataVerification[r + '_' + c] = item;
+
+ if(type == 'checkbox'){
+ setcellvalue(r, c, data, item.value2);
+ }
+ }
+ }
+
+ if(file.index == Store.currentSheetIndex){
+ let historyDataVerification = $.extend(true, {}, file.dataVerification);
+
+ if(type == 'checkbox'){
+ dataVerificationCtrl.refOfCheckbox(historyDataVerification, currentDataVerification, Store.currentSheetIndex, data, range);
+ }
+ else{
+ dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);
+ }
+ }
+ else{
+ file.dataVerification = currentDataVerification;
+ file.data = data;
+ }
+
+ if (success && typeof success === 'function') {
+ success();
+ }
+}
+
+
+/**
+ * 指定工作表范围删除数据验证功能
+ * @param {Object} options 可选参数
+ * @param {Array | Object | String} options.range 选区范围;默认为当前选区
+ * @param {Number} options.order 工作表下标;默认值为当前工作表下标
+ * @param {Function} options.success 操作结束的回调函数
+ */
+export function deleteDataVerification(options = {}) {
+ let {
+ range = Store.luckysheet_select_save[Store.luckysheet_select_save.length - 1],
+ order = getSheetIndex(Store.currentSheetIndex),
+ success
+ } = {...options}
+
+ if(getObjType(range) == 'string'){
+ if(!formula.iscelldata(range)){
+ return tooltip.info("The range parameter is invalid.", "");
+ }
+
+ let cellrange = formula.getcellrange(range);
+ range = {
+ "row": cellrange.row,
+ "column": cellrange.column
+ };
+ }
+
+ if(getObjType(range) != 'object' || range.row == null || range.column == null){
+ return tooltip.info("The range parameter is invalid.", "");
+ }
+
+ let file = Store.luckysheetfile[order];
+
+ if(file == null){
+ return tooltip.info("The order parameter is invalid.", "");
+ }
+
+ let currentDataVerification = $.extend(true, {}, file.dataVerification);
+
+ let str = range.row[0],
+ edr = range.row[1],
+ stc = range.column[0],
+ edc = range.column[1];
+
+ for(let r = str; r <= edr; r++){
+ for(let c = stc; c <= edc; c++){
+ delete currentDataVerification[r + '_' + c];
+ }
+ }
+
+ if(file.index == Store.currentSheetIndex){
+ let historyDataVerification = $.extend(true, {}, file.dataVerification);
+ dataVerificationCtrl.ref(historyDataVerification, currentDataVerification, Store.currentSheetIndex);
+ }
+ else{
+ file.dataVerification = currentDataVerification;
+ }
+
+ if (success && typeof success === 'function') {
+ success();
+ }
+}
+
+
/**
* data => celldata ,data二维数组数据转化成 {r, c, v}格式一维数组
*
From 30c6c58c0b960df60d1155523971bbe3b9f3351b Mon Sep 17 00:00:00 2001
From: mengshukeji
Date: Wed, 21 Oct 2020 20:22:05 +0800
Subject: [PATCH 7/9] docs(api): readme
1.readme add forum 2.api docs add
getRowHeight/getColumnWidth/getDefaultRowHeight/getDefaultColumnWidth 3.demo add forum link
---
README-zh.md | 9 ++--
README.md | 9 ++--
docs/guide/api.md | 100 ++++++++++++++++++++++++++++++++++++
docs/zh/guide/api.md | 100 ++++++++++++++++++++++++++++++++++++
docs/zh/guide/config.md | 45 ++++++++++++++--
src/demoData/demoFeature.js | 24 +++++++++
src/index.html | 5 +-
7 files changed, 278 insertions(+), 14 deletions(-)
diff --git a/README-zh.md b/README-zh.md
index 8f055f7..de4e3eb 100644
--- a/README-zh.md
+++ b/README-zh.md
@@ -10,10 +10,10 @@
🚀Luckysheet ,一款纯前端类似excel的在线表格,功能强大、配置简单、完全开源。
## 相关链接
- | 源码 | 文档 | Demo | 插件Demo |
- | ------ | -------- | ------ | ------ |
- | [Github](https://github.com/mengshukeji/Luckysheet)| [在线文档](https://mengshukeji.github.io/LuckysheetDocs/zh/) | [在线Demo](https://mengshukeji.github.io/LuckysheetDemo) | [导入Excel Demo](https://mengshukeji.github.io/LuckyexcelDemo/) |
- | [Gitee镜像](https://gitee.com/mengshukeji/Luckysheet)| [Gitee在线文档](https://mengshukeji.gitee.io/LuckysheetDocs/zh/) | [Gitee在线Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Gitee导入Excel Demo](https://mengshukeji.gitee.io/luckyexceldemo/) |
+ | 源码 | 文档 | Demo | 插件Demo | 论坛 |
+ | ------ | -------- | ------ | ------ | ------ |
+ | [Github](https://github.com/mengshukeji/Luckysheet)| [在线文档](https://mengshukeji.github.io/LuckysheetDocs/zh/) | [在线Demo](https://mengshukeji.github.io/LuckysheetDemo) | [导入Excel Demo](https://mengshukeji.github.io/LuckyexcelDemo/) | [中文论坛](https://support.qq.com/product/288322) |
+ | [Gitee镜像](https://gitee.com/mengshukeji/Luckysheet)| [Gitee在线文档](https://mengshukeji.gitee.io/LuckysheetDocs/zh/) | [Gitee在线Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Gitee导入Excel Demo](https://mengshukeji.gitee.io/luckyexceldemo/) | [Gitter](https://gitter.im/mengshukeji/Luckysheet) |

@@ -200,6 +200,7 @@ npm run build
- [@danielcai1987](https://github.com/danielcai1987)
- [@qq6690876](https://github.com/qq6690876)
- [@javahuang](https://github.com/javahuang)
+- [@TimerGang](https://github.com/TimerGang)
- [@gsw945](https://github.com/gsw945)
- [@swen-xiong](https://github.com/swen-xiong)
diff --git a/README.md b/README.md
index 84110a3..cfc7507 100644
--- a/README.md
+++ b/README.md
@@ -16,10 +16,10 @@ English| [简体中文](./README-zh.md)
🚀Luckysheet is an online spreadsheet like excel that is powerful, simple to configure, and completely open source.
## Links
- | Source Code | Documentation | Demo | Plugins Demo |
- | ------ | -------- | ------ | ------ |
- | [Github](https://github.com/mengshukeji/Luckysheet)| [Online Documentation](https://mengshukeji.github.io/LuckysheetDocs/) | [Online Demo](https://mengshukeji.github.io/LuckysheetDemo) | [Import Excel Demo](https://mengshukeji.github.io/LuckyexcelDemo/) |
- | [Gitee Mirror](https://gitee.com/mengshukeji/Luckysheet)| [Gitee Online Documentation](https://mengshukeji.gitee.io/LuckysheetDocs/) | [Gitee Online Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Gitee Import Excel Demo](https://mengshukeji.gitee.io/luckyexceldemo/) |
+ | Source Code | Documentation | Demo | Plugins Demo | Forum |
+ | ------ | -------- | ------ | ------ | ------ |
+ | [Github](https://github.com/mengshukeji/Luckysheet)| [Online Documentation](https://mengshukeji.github.io/LuckysheetDocs/) | [Online Demo](https://mengshukeji.github.io/LuckysheetDemo) | [Import Excel Demo](https://mengshukeji.github.io/LuckyexcelDemo/) | [Chinese Forum](https://support.qq.com/product/288322) |
+ | [Gitee Mirror](https://gitee.com/mengshukeji/Luckysheet)| [Gitee Online Documentation](https://mengshukeji.gitee.io/LuckysheetDocs/) | [Gitee Online Demo](https://mengshukeji.gitee.io/luckysheetdemo/) | [Gitee Import Excel Demo](https://mengshukeji.gitee.io/luckyexceldemo/) | [Gitter](https://gitter.im/mengshukeji/Luckysheet) |

@@ -196,6 +196,7 @@ Create a table
- [@danielcai1987](https://github.com/danielcai1987)
- [@qq6690876](https://github.com/qq6690876)
- [@javahuang](https://github.com/javahuang)
+- [@TimerGang](https://github.com/TimerGang)
- [@gsw945](https://github.com/gsw945)
- [@swen-xiong](https://github.com/swen-xiong)
diff --git a/docs/guide/api.md b/docs/guide/api.md
index f9a95c9..c78c051 100644
--- a/docs/guide/api.md
+++ b/docs/guide/api.md
@@ -589,6 +589,106 @@ Use note:
------------
+### getRowHeight(rowInfo [,setting])
+
+(TODO)
+
+- **Parameter**:
+
+ - {Array} [rowInfo]: The number of rows
+
+ - {PlainObject} [setting]: optional parameters
+ + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript
+ + {Function} [success]: callback function for the end of the operation
+
+- **Explanation**:
+
+ Get the height of the specified row, get the object corresponding to the number of rows and height
+
+- **Usage**:
+
+ - The height of the first row is 50px, the height of the second row is 60px, get these values
+
+ `luckysheet.getRowHeight([0,1])`
+ Return to get
+ `{0:50,1:60}`
+
+------------
+
+### getColumnWidth(columnInfo [,setting])
+
+(TODO)
+
+- **Parameter**:
+
+ - {Array} [columnInfo]: The number of columns
+
+ - {PlainObject} [setting]: optional parameters
+ + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript
+ + {Function} [success]: callback function for the end of the operation
+
+- **Explanation**:
+
+ Get the width of the specified column, get the object of the corresponding relationship between the number of columns and the width
+
+- **Usage**:
+
+ - The width of the first column is 50px, the width of the second column is 60px, get these values
+
+ `luckysheet.getColumnWidth([0,1])`
+ Return to get
+ `{0:50,1:60}`
+
+------------
+
+### getDefaultRowHeight([,setting])
+
+(TODO)
+
+- **Parameter**:
+
+ - {PlainObject} [setting]: optional parameters
+ + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript
+ + {Function} [success]: callback function for the end of the operation
+
+- **Explanation**:
+
+ Get the default row height of the specified worksheet
+
+- **Usage**:
+
+ - Returns the default row height of the current worksheet
+
+ `luckysheet.getDefaultRowHeight()`
+ Return to get
+ `19`
+
+------------
+
+### getDefaultColumnWidth([,setting])
+
+(TODO)
+
+- **Parameter**:
+
+ - {PlainObject} [setting]: optional parameters
+ + {Number} [order]: Worksheet subscript; the default value is the current worksheet subscript
+ + {Function} [success]: callback function for the end of the operation
+
+- **Explanation**:
+
+ Get the default column width of the specified worksheet
+
+- **Usage**:
+
+ - Returns the default column width of the current worksheet
+
+ `luckysheet.getDefaultColumnWidth()`
+ Return to get
+ `73`
+
+------------
+
## Selection operation
### getRange()
diff --git a/docs/zh/guide/api.md b/docs/zh/guide/api.md
index 9fed4d3..02701b3 100644
--- a/docs/zh/guide/api.md
+++ b/docs/zh/guide/api.md
@@ -590,6 +590,106 @@ Luckysheet针对常用的数据操作需求,开放了主要功能的API,开
------------
+### getRowHeight(rowInfo [,setting])
+
+(TODO)
+
+- **参数**:
+
+ - {Array} [rowInfo]: 行数
+
+ - {PlainObject} [setting]: 可选参数
+ + {Number} [order]: 工作表下标;默认值为当前工作表下标
+ + {Function} [success]: 操作结束的回调函数
+
+- **说明**:
+
+ 获取指定行的高度,得到行数和高度对应关系的对象
+
+- **示例**:
+
+ - 第一行高度为50px,第二行高度为60px,获取这些值
+
+ `luckysheet.getRowHeight([0,1])`
+ 返回得到
+ `{0:50,1:60}`
+
+------------
+
+### getColumnWidth(columnInfo [,setting])
+
+(TODO)
+
+- **参数**:
+
+ - {Array} [columnInfo]: 列数
+
+ - {PlainObject} [setting]: 可选参数
+ + {Number} [order]: 工作表下标;默认值为当前工作表下标
+ + {Function} [success]: 操作结束的回调函数
+
+- **说明**:
+
+ 获取指定列的宽度,得到列数和宽度对应关系的对象
+
+- **示例**:
+
+ - 第一列宽度为50px,第二列宽度为60px,获取这些值
+
+ `luckysheet.getColumnWidth([0,1])`
+ 返回得到
+ `{0:50,1:60}`
+
+------------
+
+### getDefaultRowHeight([,setting])
+
+(TODO)
+
+- **参数**:
+
+ - {PlainObject} [setting]: 可选参数
+ + {Number} [order]: 工作表下标;默认值为当前工作表下标
+ + {Function} [success]: 操作结束的回调函数
+
+- **说明**:
+
+ 获取指定工作表的默认行高
+
+- **示例**:
+
+ - 返回当前工作表的默认行高
+
+ `luckysheet.getDefaultRowHeight()`
+ 返回得到
+ `19`
+
+------------
+
+### getDefaultColumnWidth([,setting])
+
+(TODO)
+
+- **参数**:
+
+ - {PlainObject} [setting]: 可选参数
+ + {Number} [order]: 工作表下标;默认值为当前工作表下标
+ + {Function} [success]: 操作结束的回调函数
+
+- **说明**:
+
+ 获取指定工作表的默认列宽
+
+- **示例**:
+
+ - 返回当前工作表的默认列宽
+
+ `luckysheet.getDefaultColumnWidth()`
+ 返回得到
+ `73`
+
+------------
+
## 选区操作
### getRange()
diff --git a/docs/zh/guide/config.md b/docs/zh/guide/config.md
index b3d54bd..07ad1aa 100644
--- a/docs/zh/guide/config.md
+++ b/docs/zh/guide/config.md
@@ -106,15 +106,52 @@ Luckysheet开放了更细致的自定义配置选项,分别有
### loadUrl
- 类型:String
- 默认值:""
-- 作用:配置`loadUrl`的地址,与`loadSheetUrl`配合使用,一般用于大数据量的时候。也可以不用Luckysheet提供的接口参数,使用[data](#data)参数可以提前准备好所有表格数据用于初始化。
-
- Luckysheet会通过ajax请求整个表格数据,默认载入status为1的sheet数据中的所有`celldata`,其余的sheet载入除`celldata`字段外的所有字段。但是考虑到一些公式、图表及数据透视表会引用其他sheet的数据,所以前台会加一个判断,如果该当前sheet引用了其他sheet的数据则会通过`loadSheetUrl`配置的接口地址请求数据,把引用到的sheet的数据一并补全。因为 `loadUrl`只负责当前页数据,所以还需要配置`loadSheetUrl`作为异步加载数据的接口。
+- 作用:配置`loadUrl`的地址,与`loadSheetUrl`配合使用。
+
+ Luckysheet会通过ajax请求(POST)整个表格的数据,默认载入status为1的sheet数据中的`celldata`,其余的sheet载入除`celldata`字段外的所有配置字段。特别是在数据量大的时候,`loadUrl`只负责当前页单元格数据,配置`loadSheetUrl`作为其它工作表异步加载单元格数据的接口,可以提高性能。
+
+ 一个合格的接口返回的json数据为:
+
+ ```js
+ "[
+ //status为1的sheet页,重点是需要提供初始化的数据celldata
+ {
+ "name": "Cell",
+ "index": "sheet_001",
+ "order": 0,
+ "status": 1,
+ "celldata": [{"r":0,"c":0,"v":{"bg":null,"bl":0,"it":0,"ff":0,"fs":11,"fc":"rgb(51, 51, 51)","ht":1,"vt":1,"v":1,"ct":{"fa":"General","t":"n"},"m":"1"}}]
+ },
+ //其他status为0的sheet页,无需提供celldata,只需要配置项即可
+ {
+ "name": "Data",
+ "index": "sheet_002",
+ "order": 1,
+ "status": 0
+ },
+ {
+ "name": "Picture",
+ "index": "sheet_003",
+ "order": 2,
+ "status": 0
+ }
+ ]"
+ ```
+ 有几个注意点
+ + 这是一个字符串,类似于JSON.stringify()处理后的json数据,压缩数据便于传输
+ + loadUrl是一个post请求,也是为了支持大数据量
+ + 考虑到一些公式、图表及数据透视表会引用其他sheet的数据,所以前台会加一个判断,如果该当前sheet引用了其他sheet的数据则会通过`loadSheetUrl`配置的接口地址请求数据,把引用到的sheet的数据一并补全,而不用等切换到其它页的时候再请求。
+ + 当数据量小的时候,也可以不用Luckysheet提供的此接口,直接使用[data](#data)参数可以提前准备好所有表格数据用于初始化。
------------
### loadSheetUrl
- 类型:String
- 默认值:""
-- 作用:配置`loadSheetUrl`的地址,参数为`gridKey`(表格主键) 和 `index`(sheet主键合集,格式为`["sheet_01","sheet_02","sheet_0"]`),返回的数据为sheet的`celldata`字段数据集合。为了加载性能考虑,除了第一次加载当前页的`celldata`数据之外,其余sheet的数据,是在切换到那个sheet页的时候,才会请求那一页的数据。
+- 作用:配置`loadSheetUrl`的地址,参数为`gridKey`(表格主键) 和 `index`(sheet主键合集,格式为`["sheet_01","sheet_02","sheet_0"]`),返回的数据为sheet的`celldata`字段数据集合。
+
+为了加载性能考虑,除了第一次加载当前页的`celldata`数据之外,其余sheet的数据,是在切换到那个sheet页的时候,才会请求那一页的数据。
+
+ 注意:loadSheetUrl是一个post请求,是为了支持大数据量
------------
### allowUpdate
diff --git a/src/demoData/demoFeature.js b/src/demoData/demoFeature.js
index e69de29..329c4b9 100644
--- a/src/demoData/demoFeature.js
+++ b/src/demoData/demoFeature.js
@@ -0,0 +1,24 @@
+
+// Features specially written for demo
+
+(function() {
+
+ // language
+ function language(params) {
+
+ var lang = navigator.language||navigator.userLanguage;//常规浏览器语言和IE浏览器
+ lang = lang.substr(0, 2);//截取lang前2位字符
+
+ return lang;
+
+ }
+ // Tencent Forum Link Button
+ function supportButton() {
+ const text = language() === 'zh' ? '反馈' : 'Forum';
+
+ document.querySelector("body").insertAdjacentHTML('beforeend', `${text}`);
+ }
+
+ supportButton()
+
+})()
\ No newline at end of file
diff --git a/src/index.html b/src/index.html
index 727a4b4..d9be04a 100644
--- a/src/index.html
+++ b/src/index.html
@@ -17,8 +17,6 @@
-
-
@@ -1790,6 +1788,9 @@
})
+
+
+