import { message } from '/package-base/antd4.mjs';
export default () => {
const onloadSheet1 = function (params,context) {
// 请添加suspendDraw以提高自定义JS运行效率(若此段功能不涉及在Sheet上添加内容,可不放)
params.luckySheetApi.suspendDraw(true);
// 涉及添加公式计算时,请启用suspendCalculate(若此段功能不涉及在Sheet上添加公式,可不放)
params.luckySheetApi.suspendCalculate(true);
let val = '0';
if (params.luckySheetApi) {
const sheet = params.luckySheetApi.getSheet(context.currentSheet);
val = sheet.getCellValue(7,3);
// val = params.luckySheetApi.getCellValue(context.currentSheet,7,3);
}
console.log('加载Sheet1时的参数', params, val)
message.success('加载成功!!!')
params.luckySheetApi.suspendCalculate(false)
params.luckySheetApi.suspendDraw(false)
}
const onloadSheet2 = function (params) {
console.log('加载Sheet2时的参数', params)
}
const onsaveSheet1 = function (params) {
console.log('保存Sheet1前的参数',params)
return { next: false}
}
const onsaveSheet2 = function (params) {
console.log('保存Sheet2前的参数',params)
return { next: true}
}
const onrefreshSheet1 = function (params) {
console.log('刷新Sheet1后的参数',params)
}
const onrefreshSheet2 = function (params) {
console.log('刷新Sheet2后的参数',params)
}
return {
onloadSheet1,
onloadSheet2,
onsaveSheet1,
onsaveSheet2,
onrefreshSheet1,
onrefreshSheet2,
}
}
描述:运行上下文,因为同一个函数可以在不同sheet下执行,提供此参数,用于判断当前是在哪个sheet下执行。
描述:当前sheet索引
部分API返回结果为{code:number,errMsg:string} 其中code为状态码(0为正常,其他为异常或警告),及错误信息errMsg
描述:表格基础相关api
备注:以下api在无特殊说明情况下,区域描述包含起始坐标行号、列号、宽度、高度4个参数,宽度和高度包含了起始的单元格描述:获取指定下标的sheet
说明:getSheet(index)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
index |
number |
否 |
默认是当前sheet的下标 |
返回值:sheet相关的api(此时不用再传sheetIndex这个参数了)
示例:
const sheet = luckySheetApi.getSheet(0);
//或const sheet = luckySheetApi.getSheet(context.currentSheet);
const val = sheet.getCellValue(7,3);
⚠️注意:getSheet返回luckySheetApi中所有sheet相关api,所以下文中列示的其他方法也都可以用这种简要写法,例子中不再枚举。
描述:获取单元格的值
说明:getCellValue(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:单元格的值(number | string )
示例:
const cellValue = luckySheetApi.getCellValue(0,2,2);
描述:获取矩形范围单元格的值
说明:getRangeValue(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
返回值:单元格的值二维数组(number | string )
示例:
const cellValue = luckySheetApi.getRangeValue(0,2,2,2,2); //[[1,2],[3,4]]
描述:获取单元格的显示文本
说明:getCellMonitor(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:单元格的显示文本(string)
示例:
const getCellMonitor = luckySheetApi.getCellMonitor(0,2,2);
⚠️注意:与getCellValue区别:在获取带格式的数字(比如日期、分隔符等)时,有不同表现。
描述:设置单元格的值
说明:setCellValue(sheetIndex,row,column,val)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
val |
string |
number |
是 |
返回值:无
示例:
luckySheetApi.setCellValue(0,2,2,12);
描述:设置矩形范围单元格的值
说明:setRangeValue(sheetIndex,row,column,rowCount,columnCount,val)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
val |
Array[Array<number |
string>] |
是 |
返回值:无
示例:
luckySheetApi.setRangeValue(0,2,2,2,2,[[1,2],[3,4]]);
⚠️注意:
若val超过矩形范围,则超出的数据将被忽略
若val小于矩形范围,未覆盖的单元格将不做处理
描述:设置单元格的公式
说明:setCellFormula(sheetIndex,row,column,formula)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
formula |
string |
是 |
单元格公式 |
返回值:无
示例:
luckySheetApi.setCellFormula(0,2,2,'=A1');
⚠️注意:
如果添加了大量计算公式,可在JS运行期间调用停止计算功能,以提高效率,具体见suspendCalculate
描述:同时设置单元格值和渲染在单元格中显示的文案。
说明:setCellValueAndMonitor(sheetIndex,row,column,label,value)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
value |
string |
number |
是 |
monitor |
string |
是 |
显示值 |
返回值:无
示例:
luckySheetApi.setCellValueAndMonitor(0,2,2,'SH','上海');
⚠️注意:
此API目前仅支持浮动表逻辑属性为维度,用户,值列表,自定义列表,日期的单元格。可以自行设定单元格值(如编码,用户ID)及对应显示层的内容(如名称描述,用户昵称)。其他单元格调用无效
为什么会有 v 和 m?
描述:清除单元格值和公式
说明:clearCellValue(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:无
示例:
luckySheetApi.clearCellValue(0,2,2);
描述:清除矩形范围单元格值和公式
说明:clearRangeValue(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
返回值:无
示例:
luckySheetApi.clearRangeValue(0,2,2,2,2);
描述:清除单元格所有内容(样式,值,附加属性等)
说明:clearCellAll(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:无
示例:
luckySheetApi.clearCellAll(0,2,2,2,2);
⚠️注意:
此API只建议在普通底稿上使用
请谨慎使用此API在动态表,DF公式,浮动行区域中。清除所有信息后,可能会导致后续业务逻辑的异常。如数据审计,浮动表逻辑属性特殊单元格
描述:清除矩形范围单元格所有内容(样式,值,附加属性等)
说明:clearRangeAll(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
返回值:无
示例:
luckySheetApi.clearRangeAll(0,2,2,2,2);
⚠️注意:
此API只建议在普通底稿上使用
请谨慎使用此API在动态表,DF公式,浮动行区域中。清除所有信息后,可能会导致后续业务逻辑的异常。如数据审计,浮动表逻辑属性特殊单元格
描述:获取当前激活的sheet索引
说明:getActiveSheet()
返回值: {
index: number; //sheet索引值
sheetName: string //sheet名称
}
示例:
const index = luckySheetApi.getActiveSheet();
描述:锁定sheet
说明:setSheetLocked(sheetIndex,locked)
返回值: 无
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
locked |
boolean |
是 |
是否锁定 |
示例:
const index = luckySheetApi.setSheetLocked(0,true);
描述:给单元格增加折叠图标。
说明:会按照参数控制行列折叠
返回值: 无
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
param |
{ |
‘colunm’ |
是 |
⚠️注意:对于对齐方式为水平居右的,暂时不支持
示例:
//控制2,2单元格,增加行折叠功能,默认为加号(3-10行会自动隐藏),点击后会控制第3行-第10行的折叠
luckySheetApi.setCellExpandContract(0,2,2,{
fold: true,
type: 'row',
s: 3,
e: 10
});
总览
getCellStyle |
单个单元格 |
批量单元格 |
setCellStyle |
setRangeStyle | |
---|---|---|---|---|---|
数据格式 |
/ |
setCellFormatter |
setRangeFormatter |
formatter: string |
formatter: string |
锁定 |
locked: boolean |
setCellLocked |
setRangeLocked |
locked: boolean, |
locked: boolean, |
背景色 |
background: string |
setCellBackgroundColor |
setRangeBackgroundColor |
background: string, |
background: string, |
字体 |
/ |
setCellFont |
setRangeFont |
font: string |
font: string |
字号 |
/ |
setCellFontSize |
setRangeFontSize |
fontSize: number |
fontSize: number |
字体颜色 |
fontColor: string, |
setCellFontColor |
setRangeFontColor |
fontColor: string, |
fontColor: string, |
下划线 |
/ |
setTextDecoration |
setRangeTextDecoration |
textDecoration: boolean, |
textDecoration: boolean, |
水平居中 |
/ |
setHorizontalAlign |
setRangeHorizontalAlign |
horizontalAlign: string, |
horizontalAlign: string, |
垂直居中 |
/ |
setVerticalAlign |
setRangeVerticalAlign |
verticalAlign: string, |
verticalAlign: string, |
加粗 |
/ |
setCellBold |
setRangeBold |
bold: boolean |
bold: boolean |
斜体 |
/ |
setCellItalic |
setRangeItalic |
italic: boolean |
italic: boolean |
边框 |
/ |
setCellBorder |
setRangeBorder |
/ |
/ |
缩进 |
/ |
setCellIndent |
setRangeIndent |
indent: number |
indent: number |
换行 |
/ |
setCellTextbreak |
setRangeTextbreak |
textbreak: number |
描述:获取单元格样式
说明:getCellStyle(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
返回值:{
locked: boolean; //是否保护
background: string|undefined; //填充颜色
fontColor: string|undefined; //字体颜色
fontWeightBold: boolean; //字体加粗
isValidate: boolean; //数据验证(添加在单元格上数据验证功能,非浮动行表校验)是否通过
conditionFormatBackground: string|undefined; //条件格式背景颜色
conditionFormatFontColor: string|undefined; //条件格式字体颜色
}
示例:
const info = luckySheetApi.getCellStyle(0,0,0);
描述:设置矩形范围单元格的格式
说明:seCellFormatter(sheetIndex,row,column,formatter)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
formatter |
string |
是 |
格式化字符串 |
返回值:无
示例:
luckySheetApi.setCellFormatter(0,0,0,'#,##0.00');
支持的数据格式:
以两位小数为例 | |
---|---|
纯文本 |
@ |
数字 |
0.00 |
百分比 |
0.00% |
科学计数 |
0.00E+00 |
千分隔样式 |
#,##0.00 |
货币 |
¥#,##0.00 |
日期 |
yyyy-MM-dd; |
长日期 |
yyyy”年”m”月”d”日” |
时间 |
h:mm:ss AM/PM |
时间24H |
h:mm:ss |
日期时间 |
yyyy-MM-dd h:mm AM/PM |
日期时间24H |
yyyy-MM-dd h:mm:ss |
描述:设置矩形范围单元格的格式
说明:setRangeFormatter(sheetIndex,row,column,rowCount,columnCount,formatter)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
矩形范围宽度 |
columnCount |
number |
是 |
矩形范围高度 |
formatter |
string |
是 |
格式化字符串 |
返回值:无
示例:
luckySheetApi.setRangeFormatter(0,0,0,2,2,'#,##0.00');
描述:锁定单元格
说明:setCellLocked(sheetIndex,row,column,locked)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
locked |
boolean |
是 |
是否锁定 |
返回值:无
示例:
luckySheetApi.setCellLocked(0,2,2,true);
⚠️注意:Sheet整体锁定,见setSheetLocked
描述:锁定矩形范围单元格区域
说明:setRangeLocked(sheetIndex,row,column,rowCount,columnCount,locked)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
locked |
boolean |
是 |
是否锁定 |
返回值:无
luckySheetApi.setRangeLocked(0,2,2,4,4,true);
描述:设置单元格背景色
说明:setCellBackgroundColor(sheetIndex,row,column,color)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
color |
string |
是 |
颜色 |
返回值:无
示例:
luckySheetApi.setCellBackgroundColor(0,2,2,'#ffffff');
描述:设置矩形区域内单元格的背景色
说明:setRangeBackgroundColor(sheetIndex,row,column,rowCount,columnCount,color)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
color |
string |
是 |
颜色 |
返回值:无
示例:
luckySheetApi.setRangeBackgroundColor(0,2,2,4,4,'#ffffff');
描述:设置矩形区域内单元格的字体
说明:setCellFont(sheetIndex,row,column,font)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
font |
string |
是 |
字体 |
返回值:无
示例:
luckySheetApi.setCellFont(0,2,2,'微软雅黑');
luckysheet工具栏中包含的字体枚举值如下:也可以使用其他系统支持的字体
"微软雅黑"
"PingFangSC-Regular"
"Times New Roman"
"Arial"
"Tahoma"
"Verdana"
"宋体"
"黑体"
"楷体"
"仿宋"
"隶书"
描述:设置矩形区域内单元格的字体颜色
说明:setRangeFont(sheetIndex,row,column,rowCount,columnCount,font)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
font |
string |
是 |
字体 |
返回值:无
示例:
luckySheetApi.setRangeFont(0,2,2,2,2,'微软雅黑');
描述:设置单元格字号
说明:setCellFontSize(sheetIndex,row,column,size)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
size |
number |
是 |
字号大小 |
返回值:无
示例:
luckySheetApi.setCellFontSize(0,2,2,10);
描述:设置矩形范围单元格字号
说明:setRangeFontSize(sheetIndex,row,column,rowCount,columnCount,size)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
size |
number |
是 |
字号大小 |
返回值:无
luckySheetApi.setRangeFontSize(0,2,2,4,4,10);
描述:设置矩形区域内单元格的字体颜色
说明:setCellFontColor(sheetIndex,row,column,color)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
color |
string |
是 |
颜色 |
返回值:无
示例:
luckySheetApi.setCellFontColor(0,2,2,'#ffffff');
描述:设置矩形区域内单元格的字体颜色
说明:setRangeFontColor(sheetIndex,row,column,rowCount,columnCount,color)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
color |
string |
是 |
颜色 |
返回值:无
示例:
luckySheetApi.setRangeFontColor(0,2,2,4,4,'#ffffff');
描述:设置单元格边框
说明:setCellBorder(sheetIndex,row,column,type,color)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
type |
string |
否 |
边框类型,默认border-all |
color |
string |
否 |
颜色,默认#000000 |
返回值:无
示例:
// 边框类型,可选值如下:
// "border-left"
// "border-right"
// "border-top"
// "border-bottom"
// "border-all"
// "border-none"
luckySheetApi.setCellBorder(0,2,2,'border-all','#ff0000');
描述:设置矩形范围单元格边框
说明:setRangeBorder(sheetIndex,row,column,rowCount,columnCount,type,color)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
type |
string |
否 |
边框类型,默认border-all |
color |
string |
否 |
颜色,默认#000000 |
返回值:无
示例:
// 边框类型,可选值如下:
// "border-left"
// "border-right"
// "border-top"
// "border-bottom"
// "border-all"
// "border-none"
// "border-outside"
// "border-inside"
// "border-horizontal"
// "border-vertical"
luckySheetApi.setRangeBorder(0,2,2,2,2,'border-all','#ff0000');
描述:设置字体加粗
说明:setCellBold(sheetIndex,row,column,isBold)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
isBold |
boolean |
否 |
是否加粗 默认true |
返回值:无
示例:
luckySheetApi.setCellBold(0,2,2,true);
描述:设置矩形范围字体加粗
说明:setRangeBold(sheetIndex,row,column,rowCount,columnCount,isBold)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
isBold |
boolean |
否 |
是否加粗 默认true |
返回值:无
示例:
luckySheetApi.setRangeBold(0,2,2,2,2,true);
描述:设置字体加粗
说明:setCellItalic(sheetIndex,row,column,isItalic)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
isItalic |
boolean |
否 |
是否斜体 默认true |
返回值:无
示例:
luckySheetApi.setCellItalic(0,2,2,true);
描述:设置矩形范围字体加粗
说明:setRangeItalic(sheetIndex,row,column,rowCount,columnCount,isItalic)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
isItalic |
boolean |
否 |
是否斜体 默认true |
返回值:无
示例:
luckySheetApi.setRangeItalic(0,2,2,2,2,true);
描述:设置水平对齐方式
说明:setHorizontalAlign(sheetIndex,row,column,type)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
type |
‘left’ |
‘center’ |
‘right’ |
返回值:无
示例
luckySheetApi.setHorizontalAlign(0,0,0,'left');
描述:设置矩形范围水平对齐方式
说明:setRangeHorizontalAlign(sheetIndex,row,column,rowCount,columnCount,type)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
type |
‘left’ |
‘center’ |
‘right’ |
返回值:无
示例
luckySheetApi.setRangeHorizontalAlign(0,0,0,2,2,'left');
描述:设置垂直对齐方式
说明:setVerticalAlign(sheetIndex,row,column,type)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
type |
‘top’ |
‘middle’ |
‘bottom’ |
返回值:无
示例:
luckySheetApi.setVerticalAlign(0,0,0,'middle');
描述:设置矩形范围垂直对齐方式
说明:setRangeVerticalAlign(sheetIndex,row,column,rowCount,columnCount,type)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
type |
‘top’ |
‘middle’ |
‘bottom’ |
返回值:无
示例:
luckySheetApi.setRangeVerticalAlign(0,0,0,2,2,'middle');
描述:设置下划线
说明:setTextDecoration(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
isTextDecoration |
boolean |
否 |
是否增加下划线,默认true |
返回值:无
示例:
luckySheetApi.setTextDecoration(0,0,0);
描述:设置矩形范围下划线
说明:setRangeTextDecoration(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
isTextDecoration |
boolean |
否 |
是否增加下划线,默认true |
返回值:无
示例:
luckySheetApi.setRangeTextDecoration(0,0,0,2,2);
描述:设置单元格样式
说明:setCellStyle(sheetIndex,row,column,options)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
options |
Record<string,string |
boolean |
number> |
返回值:无
示例:
luckySheetApi.setCellStyle(0,0,0,{
formatter: '#,##0.00', //格式
locked: true, // 锁定
background: '#007bff', // 背景色
font: '微软雅黑',
fontSize: 10,
fontColor: '#ffffff', // 字体颜色
textDecoration: true, // 下划线
horizontalAlign: 'center', // 水平对齐
verticalAlign: 'middle', // 垂直对齐
bold: true, //字体加粗
italic: true //斜体
textbreak: 2 //自动换行
});
描述:设置矩形范围单元格样式
说明:setRangeStyle(sheetIndex,row,column,rowCount,columnCount,options)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
options |
Record<string,string |
boolean |
number> |
返回值:无
示例:
luckySheetApi.setRangeStyle(0,0,0,2,2,{
formatter: '#,##0.00', //格式
locked: true, // 锁定
background: '#007bff', // 背景色
font: '微软雅黑',
fontSize: 10,
fontColor: '#ffffff', // 字体颜色
textDecoration: true, // 下划线
horizontalAlign: 'center', // 水平对齐
verticalAlign: 'middle', // 垂直对齐
bold: true, //字体加粗
italic: true //斜体
});
描述:清除单元格样式
说明:clearCellStyle(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:无
示例:
// 清除的属性包含字符格式,背景色,字体,字体颜色,字体大小,加粗,斜体,删除线,
// 水平对齐,垂直对齐,文本换行,下划线,缩进
luckySheetApi.clearCellStyle(0,0,0);
⚠️注意:
条件格式,数据验证,合并单元格,边框不会被清除
描述:清除矩形范围单元格样式
说明:clearRangeStyle(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
返回值:无
示例:
luckySheetApi.clearRangeStyle(0,0,0,2,2);
⚠️注意:
条件格式,数据验证,合并单元格,边框不会被清除
描述:设置单元格缩进
说明:setCellIndent(sheetIndex,row,column,indent)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
indent |
number |
是 |
缩进单位个数 |
返回值:无
示例:
luckySheetApi.setCellIndent(0,0,0,2); //缩进两个单位
描述:设置矩形范围缩进
说明:setRangeIndent(sheetIndex,row,column,rowCount,columnCount,indent)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
indent |
number |
是 |
缩进单位个数 |
返回值:无
示例:
luckySheetApi.setRangeIndent(0,0,0,2,2,4); //缩进4个单位个数
描述:设置文本换行截断溢出
说明:setCellTextbreak(sheetIndex,row,column,textbreak)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
textbreak |
number |
是 |
0: 截断 1: 溢出 2: 自动换行 |
返回值:无
示例:
luckySheetApi.setCellTextbreak(0,0,0,1); //单元格设置为溢出
warning 设置为自动换行不会自适应单元格高度,如果想改变单元格高度请调用setRowHeight
描述:设置文本换行截断溢出
说明:setRangeTextbreak(sheetIndex,row,column,rowCount,columnCount,textbreak)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
rowCount |
number |
是 |
矩形区域高度 |
columnCount |
number |
是 |
矩形区域宽度 |
textbreak |
number |
是 |
0: 截断 1: 溢出 2: 自动换行 |
返回值:无
示例:
luckySheetApi.setRangeTextbreak(0,0,0,2,2,1); //设置单元格溢出
描述:增加合并单元格
说明:addMergeCells(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
纵向合并长度 |
columnCount |
number |
是 |
横向合并长度 |
返回值:无
示例:
luckySheetApi.addMergeCells(0,2,2,3,3); // 合并的区域C3:E5
描述:取消合并单元格
说明:cancelMergeCells(sheetIndex,row,column,rowCount,columnCount)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行起始坐标 |
column |
number |
是 |
列起始坐标 |
rowCount |
number |
是 |
纵向取消合并长度 |
columnCount |
number |
是 |
横向取消合并长度 |
返回值:无
示例:
luckySheetApi.cancelMergeCells(0,2,2,3,3); // 取消合并的区域C3:E5
⚠️注意:
参数范围内的所有合并,不管是完全包含,还是有交集,都会被取消
描述:获取sheet的实际行数(没有数据的空白区域也算在内)
说明:getRowCount(sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
返回值:实际行数(number)
示例:
const sheet = luckySheetApi.getSheet(0);
const rowCount = luckySheetApi.getRowCount(0);
//const rowCount = sheet.getRowCount();
描述:获取sheet的实际列数(没有数据的空白区域也算在内)
说明:getColumnCount(sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
返回值:实际列数(number)
示例:
const sheet = luckySheetApi.getSheet(0);
const columnCount = luckySheetApi.getColumnCount(0);
//const rowCount = sheet.getColumnCount();
描述:设置行显示/隐藏
说明:setRowVisible(sheetIndex,row,status)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行号 |
status |
boolean |
是 |
显示(true)/隐藏(false) |
返回值:无
示例:
luckySheetApi.setRowVisible(0,1,false);
⚠️注意:
如果有很多行需要隐藏,建议使用setSpecificRowVisible,以提高性能。
描述:批量展示行
说明:setSpecifyRowVisible(sheetIndex,rows,status)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
rows |
number[] |
是 |
行下标数组 |
status |
boolean |
是 |
显示(true)/隐藏(false) |
返回值:无
示例:
luckySheetApi.setSpecifyRowVisible(0,[0,1,3],true);
描述:设置列显示/隐藏
说明:setColumnVisible(sheetIndex,row,status)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
列号 |
status |
boolean |
是 |
显示(true)/隐藏(false) |
返回值:无
示例:
luckySheetApi.setColumnVisible(0,1,false);
⚠️注意:
如果有很多列需要隐藏,建议使用setSpecificColumnVisible,以提高性能。
描述:批量展示列
说明:setSpecifyColumnVisible(sheetIndex,columns,status)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
columns |
number[] |
是 |
列下标数组 |
status |
boolean |
是 |
显示(true)/隐藏(false) |
返回值:
示例:
luckySheetApi.setSpecifyColumnVisible(0,[0,1,3],true);
描述:设置列宽
说明:setColumnWidth(sheetIndex,option)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
option |
object |
string} |
是 |
返回值:无
示例:
// A列设置列宽48,B列设置自适应列宽
luckySheetApi.setColumnWidth(0,{0: 48,1: 'auto'});
描述:设置列宽
说明:setRowHeight(sheetIndex,option)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
option |
object |
string} |
是 |
返回值:无
示例:
// 第一行设置高度100px,第二行设置自适应行高
luckySheetApi.setRowHeight(0,{0: 100,1: 'auto'});
描述:是否暂停渲染。
说明:suspendDraw(flag)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
flag |
boolean |
是 |
true,暂停渲染;false,开启渲染,并立即触发一次渲染 |
返回值:无
示例:
// getSheet的结果不包含此方法
luckySheetApi.suspendDraw(true);
批量更改单元格值,样式等信息时请添加suspendDraw,以提高效率
描述:是否暂停计算。
说明:suspendCalculate(flag)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
flag |
boolean |
是 |
true,暂停计算;false,开启渲染,并立即触发一次计算 |
返回值:无
示例:
// getSheet的结果不包含此方法
luckySheetApi.suspendCalculate(true);
批量更改单元格公式时请添加suspendCalculate,以提高效率
描述:是否开始同步表格初始数据
说明:表格开表后,会将开表的原始数据记录下来,当通过Js或者用户编辑更改数据后,会与此原始数据比较,从而获得增量变化的数据。此API开关闭合期间,所有的更改操作都会直接同步原始数据,这些单元格的变化将不再视为增量变化。
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
flag |
boolean |
是 |
true,开始同步;false,关闭同步 |
ignoreChain |
boolean |
否 |
忽略链式函数,默认值 false |
返回值:无
示例:
// getSheet的结果不包含此方法
luckySheetApi.syncOriginData(true);
//dosomething like setCellValue,setCellFormula
luckySheetApi.syncOriginData(false);
tips 本API的使用场景,跟电子表格2.0的数据变更及保存相关逻辑有关,以下供参考:
1、数据是分层次的(概念理解上的层次,并不一定是技术侧分层):
第一层(原始数据):财务模型取数、底版数据、dfdata取数、dfdatafx计算、override覆盖
第二层:通过自定义JS修改数据
第三层:用户手工编辑
2、数据变更状态:
第1层和第2、3层之间不一样,就认为数据发生了变更(是否变更是单元格标黄及保存的前提条件)
3、标黄
如果
则单元格需要标黄。如果sheet上有标黄的单元格,刷新或关闭的时候,需要提醒。
4、数据保存
如果数据变更了,并且用户有模型侧权限,在总保存时需要将数据存储到服务端
(datafx除外,它永远都会保存)
场景举例:
动态表或dfdata(wr),用户填数了->数据变更->-标黄->保存
dfdatafx,引用的单元格发生了变化->数据变更->标黄对象里没他->永远保存
通过JS修改可input的动态表单元格(固定值或公式)->数据变更->标黄->保存
通过JS修改标题或空白区域->数据变更->不标黄->不保存
通过JS修改可input的动态表单元格->通过API重置了初始状态->开表时不认为是变更->只要用户不编辑,都没变更->不标黄->不保存
override里右边是data或fx->除非用户手动input,否则不是变更->不标黄->不保存
~~描述:更新原始数据~~
~~说明:refreshOriginData(data)~~
~~参数~~ |
~~类型~~ |
~~是否必传~~ |
~~备注~~ |
---|---|---|---|
~~data~~ |
~~[{~~ |
~~是~~ |
~~需要更新的原始数据(whiteList,blackList同时存在时,blackList将被忽略)~~ |
~~返回值:无~~
~~示例:~~
// getSheet的结果不包含此方法
luckySheetApi.refreshOriginData([{
sheetIndex: 0,
whiteList: {
'2_6': 1,
'3_9': 1,
}
}]);
// 如果通过js修改了luckysheet的数据,又不想被识别为变更数据,可以通过此方法更新原始数据
// 其中whiteList,blackList的key,就是行列坐标用“_”连接的字符串
// 场景1,修改了单元格2_6,3_9,4_9,whiteList传2_6,3_9,那么此时获取变更数据时,只会得到4_9;
// 场景2,修改了单元格2_6,3_9,4_9,blackList传2_6,那么此时获取变更数据时,只会得到2_6;
描述:设置冻结行/列
说明:setFrozen(sheetIndex,cell,type)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
cell |
string |
是 |
单元格位置(例如’B2’) |
type |
number |
否 |
1:冻结行;2:冻结列;其他:冻结行列 |
返回值:无
示例:
luckySheetApi.setFrozen(0,'B5',1);
描述:获取当前选中的单元格的坐标范围
返回值:{
hideColumn: Array
hideRow: Array
range: [{
row: [number,number];
colunm:[number,number];
}]
sheetIndex: number
}
const info = luckySheetApi.getSelectedCellRange();
描述:设置工作表缩放比例
返回值:无
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
zoom |
number |
是 | 缩放比例 0.1 ~ 4 |
luckySheetApi.setSheetZoom(0,3);
描述:获取单元格信息
说明:getCellInfo(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:{
povDimension:Record<string,string>|undefined,
cellDimension:Record<string,string>|undefined,
isComment: boolean|undefined, //是否为批注,用于DF公式或动态表虚拟度量维
cube: {
elementName: string,
folderId: string,
path: string,
serverName: string,
…
} | undefined,
floatInfo:{
lineId: string | undefined; //新增的行,合计行,行头为undefined
tableInfo: {
tableElementName: string, //数据表元素名
folderId: string, //目录id
actualTableName: string //实际表明
} | undefined,
columnInfo: {
name: string //列名
} | undefined
} | undefined,
value: string | number,
}
示例
const info = luckySheetApi.getCellInfo(0,4,4);
描述:显示/隐藏 sheet
说明:setSheetVisible(sheetIndex,status)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
status |
boolean |
是 |
显示/隐藏 |
返回值:Promise
示例
//第一张表隐藏
luckySheetApi.setSheetVisible(0,false).then(() => {
// your code ...
})
描述:设置指定sheet内筛选区域指定列的筛选条件
说明:setFilterConditions(sheetIndex,column,condition)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
column |
number |
是 |
列的下标 |
condition |
{ |
number[] |
是 |
返回值:无
示例
// 最后的参数type暂时只支持value
luckySheetApi.setFilterConditions(0,2,{type: 'value',value: [1,2,3]})
类型 |
示例 |
备注 |
---|---|---|
按值筛选 |
{ |
value为筛选的显示值( 非实际值),会按照数组匹配到的值去筛选。命中空白为空字符串 |
待补充 |
描述:设置激活sheet下标
说明:setActiveSheet(sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
返回值:无
示例:
// 设置sheet2为激活sheet
luckySheetApi.setActiveSheet(1);
描述:单元格绑定事件
说明:bindEvent(name,func)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
name |
string |
是 |
事件名称 |
func |
(params: any)=> void |
是 |
事件触发后执行的方法 |
返回值:无
示例
// getSheet的结果不包含此方法
luckySheetApi.bindEvent('cellClick',(...params) => {
// params会因为不同的事件,里面的数据可能也不同
// params 参数示例如下
// [
// {
// "m": "12.00",
// "v": 12
// },
// {
// "r": 3,
// "c": 3
// }
// ]
});
事件参数列表
Event Name |
params |
---|---|
cellClick |
1. content { |
cellUpdate |
1. curContent { |
afterFilterSort |
{ |
⚠️注意:
1.一个典型的错误是在cellUpdate事件中无差别的去更改单元格值,这会导致再次触发cellUpdate,最终造成程序的死循环。请在cellUpdate中增加适当的限制逻辑避免死循环的产生
2.另一个典型的错误是在刷新后重复绑定事件监听,重复绑定可能会造成严重的性能问题,为了防止事件重复绑定,可以声明一个变量来避免。代码如下
export default function(){
//判定变量
let isBinded = false
function init(){
//绑定过了就不绑了
if(!isBinded){
isBinded = true
luckySheetApi.bindEvent('cellClick',(...params) => {
//dosomething
});
}
}
return {init}
}
描述:设置单元格错误信息(左上角红色小图标,鼠标悬浮出错误提示)
说明:setCellError(sheetIndex,row,column,content)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
content |
string |
是 |
错误信息内容 |
返回值:无
示例:
// 设置第一个sheet的A1单元格的错误信息为“测试错误信息”
luckySheetApi.setCellError(0,0,0,'测试错误信息');
描述:删除单元格错误信息
说明:clearCellError(sheetIndex,row,column)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
返回值:无
示例:
// 删除第一个sheet的A1单元格的错误信息
luckySheetApi.clearCellError(0,0,0);
描述:设置指定sheet内筛选区域指定列的排序类型
说明:setFilterSortType(sheetIndex,column,type)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
column |
number |
是 |
列坐标 |
type |
string |
是 |
有效的值’asc’和’desc’,其他的不生效 |
返回值:无
示例:
// 设置第1个sheet筛选区域内的A列按照升序排序
luckySheetApi.setFilterSortType(0,0,'asc');
所有API均挂在命名空间luckySheetApi.ConditionFormat下
条件格式需要先通过实例化对应的条件,然后通过add方法到sheet中生效
描述:增加条件格式到指定sheet
参数 |
类型 |
备注 |
---|---|---|
sheetIndex |
number |
sheet索引,从0开始 |
instance |
Contain |
Formula |
const {Contain,add,CompareType} = luckySheetApi.ConditionFormat
const instance = new Contain({
cellRange: 'A1:B2',
condition: {
name: CompareType.Betweenness,
value: [5,'A10']
},
format: {
textColor: '#FFC7CE'
}
})
add(0,instance);
描述:包含以下内容的单元格
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
condition |
interface condition{ |
string> |
是 |
format |
interface format{ |
{ |
textColor |
const {Contain,CompareType} = luckySheetApi.ConditionFormat;
const instance = new Contain({
cellRange: 'A1:B2',
condition: {
name: CompareType.Betweenness,
value: [5,'A10']
},
format: {
textColor: '#FFC7CE'
}
})
描述:包含以下内容的单元格
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
condtition |
string |
是 |
公式,比如’A5>10’ 注意如果单元格没加$号,则会有偏移效果 |
format |
interface format{ |
{ |
textColor |
const {Formula} = luckySheetApi.ConditionFormat;
const instance = new Formula({
cellRange: 'A1:B2',
condition: 'A5>10',
format: {
cellColor: '#FFC7CE'
}
})
描述:排名靠前或靠后
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
condition |
interface condition{ |
‘last’, |
是 |
format |
interface format{ |
{ |
textColor |
const {Order} = luckySheetApi.ConditionFormat;
//前20%
const instance = new Order({
cellRange: 'A1:B2',
condition: {
type: 'top',
percent: true,
value: 20
},
format: {
textColor: '#9C0006'
cellColor: '#FFC7CE'
}
})
描述:高于或低于平均值
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
conditions |
‘above’ |
‘sub’ |
是 |
format |
interface format{ |
{ |
textColor |
const {Average} = luckySheetApi.ConditionFormat;
const instance = new Average({
cellRange: 'A1:B2',
condition: 'above',
format: {
textColor: '#9C0006'
cellColor: '#FFC7CE'
}
})
描述:唯一值
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
format |
interface format{ |
{ |
textColor |
const {Unique} = luckySheetApi.ConditionFormat;
const instance = new Unique({
cellRange: 'A1:B2',
format: {
textColor: '#9C0006'
cellColor: '#FFC7CE'
}
})
描述:重复值
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
format |
interface format{ |
{ |
textColor |
const {Duplicate} = luckySheetApi.ConditionFormat;
const instance = new Duplicate({
cellRange: 'A1:B2',
format: {
fontColor: '#9C0006'
cellColor: '#FFC7CE'
}
})
描述:数据条
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
format |
[string] |
[string,string] |
是 |
cfvoType |
auto |
num |
auto |
cfvoValue |
[num,num] |
否 |
cfvoType为num时必填,为数据条的最大最小值,超过这个范围,数据条长度为0%与100% |
const {DataBar} = luckySheetApi.ConditionFormat;
const instance = new DataBar({
cellRange: 'A1:B2'
format: ['#FFC7CE']
})
描述:色阶
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
format |
[string,string] |
|
是 |
cfvoType |
auto |
num |
auto |
cfvoValue |
[num,num] |
否 |
cfvoType为num时必填,为色阶条的最大最小值,超过这个范围,色阶按边界颜色设置 |
const {ColorGradation} = luckySheetApi.ConditionFormat;
const instance = new ColorGradation({
cellRange: 'A1:B2'
format: ['#FFC7CE','#9C0006']
})
描述:图集
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
条件格式作用范围 eg: ‘A1:B2’ |
format |
IconsType |
是 |
图集类型 |
type |
number |
否 |
选择划分方式,默认值为1 |
conditions |
array<{ |
2 ; |
否 |
reverse |
boolean |
否 |
是否反转图标( coming soon) |
const {IconsGradation,IconsType} = luckySheetApi.ConditionFormat;
const instance = new IconsGradation({
cellRange: 'A1:B2',
format: IconsType["threeWayArrowMulticolor"], //选用的是三个icon的图集
type: 1,
conditions: [ //conditons.length 需要为2
{
condition: 1,
value: 67 //100-67 区间用第一个图标
},
{
condition: 2,
value: 33 //67-33,最后一个图标自然就是33-0
}
],
reverse: true
})
图集枚举类型
enum IconsType {
threeWayArrowMulticolor='threeWayArrowMulticolor',
threeWayArrowGrayColor='threeWayArrowGrayColor',
threeTriangles='threeTriangles',
fourWayArrowMulticolor='fourWayArrowMulticolor',
fourWayArrowGrayColor='fourWayArrowGrayColor',
fiveWayArrowMulticolor='fiveWayArrowMulticolor',
fiveWayArrowGrayColor='fiveWayArrowGrayColor',
threeColorTrafficLightRimless='threeColorTrafficLightRimless',
threeColorTrafficLightBordered='threeColorTrafficLightBordered',
threeSigns='threeSigns',
fourColorTrafficLight='fourColorTrafficLight',
greenRedBlackGradient='greenRedBlackGradient',
threeSymbolsCircled='threeSymbolsCircled',
threeSymbolsNoCircle='threeSymbolsNoCircle',
tricolorFlag='tricolorFlag',
threeStars='threeStars',
fiveQuadrantDiagram='fiveQuadrantDiagram',
fiveBoxes='fiveBoxes',
grade4='grade4',
grade5='grade5',
}
所有API均挂在命名空间luckySheetApi.DataVerify下
数据验证需要先实例化,然后通过add方法到sheet中生效。一个单元格只能有一个数据验证,后者会覆盖前者
描述:增加条件格式到指定sheet
参数 |
类型 |
备注 |
---|---|---|
sheetIndex |
number |
sheet索引,从0开始 |
instance |
Dropdown |
CommonNumber |
const {add,Dropdown} = luckySheetApi.DataVerify
const instance = new Dropdown({
cellRange: 'A1:B2',
value: 'a,b,c,d'
})
add(0,instance);
描述:下拉列表
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
value |
string |
是 |
可以是英文逗号分隔的字符: |
isMulti |
boolean |
否 |
是否允许多选,默认false |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {Dropdown} = luckySheetApi.DataVerify;
const instance = new Dropdown({
cellRange: 'A1:B2',
value: 'a,b,c,d'
})
描述:数字
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
conditionType |
enum NumberCompareType |
是 |
enum NumberCompareType { |
value |
[number] |
[number,number] |
是 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {CommonNumber,NumberCompareType} = luckySheetApi.DataVerify;
const instance = new CommonNumber({
cellRange: 'A1:B2',
conditionType: NumberCompareType.eq,
value: [10]
})
描述:整数
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
conditionType |
enum NumberCompareType |
是 |
enum NumberCompareType { |
value |
[number] |
[number,number] |
是 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {Integer,NumberCompareType} = luckySheetApi.DataVerify;
const instance = new Integer({
cellRange: 'A1:B2',
conditionType: NumberCompareType.bw,
value: [10,20]
})
描述:小数
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
conditionType |
enum NumberCompareType |
是 |
enum NumberCompareType { |
value |
[number] |
[number,number] |
是 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {Decimals,NumberCompareType} = luckySheetApi.DataVerify;
const instance = new Decimals({
cellRange: 'A1:B2',
conditionType: NumberCompareType.gt,
value: [10.5]
})
描述:文本长度
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
conditionType |
enum NumberCompareType |
是 |
enum NumberCompareType { |
value |
[number] |
[number,number] |
是 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {TextLength,NumberCompareType} = luckySheetApi.DataVerify;
const instance = new TextLength({
cellRange: 'A1:B2',
conditionType: NumberCompareType.gt,
value: [10]
})
描述:文本内容
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
conditionType |
enum ContentCompareType |
是 |
enum ContentCompareType { |
value |
string |
是 |
比较的文本内容 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {TextContent,ContentCompareType} = luckySheetApi.DataVerify;
const instance = new TextContent({
cellRange: 'A1:B2',
conditionType: ContentCompareType.include,
value: '先胜业财'
})
描述:日期
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
conditionType |
enum DateCompareType |
是 |
enum DateCompareType { |
value |
[string] |
[string,string] |
是 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {CommonDate,DateCompareType} = luckySheetApi.DataVerify;
const instance = new CommonDate({
cellRange: 'A1:B2',
conditionType: DateCompareType.eq,
value: '2023-05-01'
})
描述:按公式的计算结果进行验证
构造函数参数
参数 |
类型 |
必填/默认值 |
备注 |
---|---|---|---|
cellRange |
string |
是 |
数据验证作用范围 eg: ‘A1:B2’ |
value |
string |
是 |
填写想要设置的公式 |
prohibitInput |
boolean |
否 |
输入数据无效时禁止输入,默认false |
hintText |
string |
否 |
选中单元格显示的提示语,默认无 |
customWarning |
string |
否 |
数据数据无效时的错误提示语,不传为默认提示语 |
const {Formula} = luckySheetApi.DataVerify;
const instance = new Formula({
cellRange: 'A1:B2',
value: 'datevalue(C5)>datevalue("2020-01-01")'
})
描述:获取筛选器的值和描述(
只支持单选)说明:getFilterMember(filterName,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器查找,传按sheet级筛选器查找) |
返回值:筛选器的描述和值({label: string, value: string}),label是描述
示例:
// filterApi 与 luckySheetApi 同级别
const { luckySheetApi, filterApi } = params;
const selectedItem1 = filterApi.getFilterMember('accoutn_wb1');
const selectedItem2 = filterApi.getFilterMember('accoutn_st1',0);
// 返回值{label: '华南', value: 'C1'}
描述:获取筛选器的值
说明:getFilterValue(filterName,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器查找,传按sheet级筛选器查找) |
返回值:筛选器的值(string|string[])
示例:
const filterValue = filterApi.getFilterValue('accoutn_st1',0)
描述:获取所有筛选器的值
说明:getFiltersValue()
返回值:所有筛选器的值({ wb: Record<string,string|string[]>}, st: Record<number,Record<string,string>>})
示例:
const filters = getFiltersValue();
// {wb: {account_wb1: 'BS001'},st: {0:{entity_st1: 'E01'},1:{entity_st1: 'E02'}}}
描述:获取筛选器的可选项(
只支持非树形、单选)说明:getFilterMemberList(filterName,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器查找,传按sheet级筛选器查找) |
返回值:筛选器的可选项({label: string, value: string}[])
示例:
// filterApi 与 luckySheetApi 同级别
const { luckySheetApi, filterApi } = params;
const selectedItem1 = filterApi.getFilterMemberList('accoutn_wb1');
const selectedItem2 = filterApi.getFilterMemberList('accoutn_st1',0);
描述:设置筛选器的值(不支持多层级)
说明:setFilterValue(filterName,value,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
value |
string |
string[] |
是 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器设置,传按sheet级筛选器设置) |
返回值:无
示例:
// filterApi 与 luckySheetApi 同级别
const { luckySheetApi, filterApi } = params;
filterApi.setFilterValue('accoutn_wb1','BS001');
filterApi.setFilterValue('accoutn_st1','BS001',0);
描述:设置筛选器的可选项(
只支持非树形)说明:setFilterMemberList(filterName,memberList,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
memberList |
{label: string, value: string}[] |
是 |
筛选器的可选项 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器设置,传按sheet级筛选器设置) |
返回值:无
示例:
// filterApi 与 luckySheetApi 同级别
const { luckySheetApi, filterApi } = params;
filterApi.setFilterMemberList('accoutn_wb1',[{label:'选项1',value:1},{label:'选项2',value:2}]);
filterApi.setFilterMemberList('accoutn_st1',[{label:'选项1',value:1},{label:'选项2',value:2}],0);
描述:设置根据维度表达式筛选器的可选项(
不支持多层级)说明:setFilterMemberListByExpression(filterName,expression,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
expression |
string |
是 |
筛选器的可选项 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器设置,传按sheet级筛选器设置) |
返回值:无
示例:
// filterApi 与 luckySheetApi 同级别
const { luckySheetApi, filterApi } = params;
filterApi.setFilterMemberList('accoutn_wb1','IDescendant(AllEntity,0)');
filterApi.setFilterMemberList('accoutn_st1','IDescendant(AllEntity,0)',0);
描述:设置单选下拉框的宽度(
只支持非树形、单选)说明:setFilterDropDownWidth(filterName,width,sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
filterName |
string |
是 |
筛选器名称 |
width |
number |
是 |
宽度 |
sheetIndex |
number |
否 |
sheet下标(不传按工作簿筛选器设置,传按sheet级筛选器设置) |
返回值:无
示例:
// filterApi 与 luckySheetApi 同级别
const { luckySheetApi, filterApi } = params;
filterApi.setFilterDropDownWidth('accoutn_wb1',250);
filterApi.setFilterDropDownWidth('accoutn_st1',250,0);
描述:绑定筛选器相关事件
说明:bindEvent(eventName,fn)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
eventName |
string |
是 |
事件名称 |
fn |
(…param: any[]) => void |
是 |
触发事件的回调方法 |
返回值:无
示例:
// 这里会罗列所有支持的绑定事件的示例
const { luckySheetApi, filterApi } = params;
// 暂时bindEvent仅支持change
filterApi.bindEvent('change', (param) => {
// 如果是sheet级别筛选器,sheetIndex就是sheet的下标,工作簿级筛选器,没有sheetIndex
console.log(param)
// param: {
// filterName: 'Account_wb1',
// value: 'A0101',
// sheetIndex: 0, // 工作簿级筛选器,没有sheetIndex
// }
})
Event Name |
params |
---|---|
change |
1. { |
描述:获取工作蒲相关信息
说明:getWorkbookInfo()
返回值:
{
workbookName: string; //工作蒲编码
workbookFolderId: string;
workbookPath: string;
workbookDescription: string; //工作蒲名称
workbookInstruction: string //工作蒲描述
sheetNameList: Array<string>
buttonInfo: Array<{code:string;desc:string|Record<string,string>;type:number}>
}
示例
const { deepTableApi: { getWorkbookInfo } } = params;
console.log(getWorkbookInfo());
描述:刷新指定sheet(包含工作簿级别筛选器带来的联动效果)
说明:refreshSheet(sheetIndexList)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndexList |
number[] |
是 |
sheet下标数组 |
返回值:无
示例:
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.refreshSheet([0]);
描述:刷新全部
说明:refreshAll()
返回值:无
示例:
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.refreshAll();
描述:判断指定Sheet的筛选器Value是否为空,可用于作为刷新表格前的判定(如果存在筛选器值为空的话是不允许刷新的)
说明:getWhetherRefreshAllowed(sheetIndexList)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndexList |
number[] |
是 |
sheet下标数组 |
返回值:是否允许刷新(boolean)
示例:
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.getWhetherRefreshAllowed([0]);
描述:保存指定sheet不刷新(不执行后续计算脚本)
说明:saveSheet(sheetIndexList,callback)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndexList |
number[] |
是 |
sheet下标数组 |
callback |
({status: boolean})=>void |
否 |
保存回调 |
返回值:无
示例:
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveSheet([0],({status}) => {
if (status) {
// 保存成功
} else {
// 保存失败
}
});
描述:保存指定sheet并刷新(保存时包含执行配置在电子表格并关联了此sheet的计算脚本)(刷新时包含工作簿级别筛选器带来的联动效果)
说明:saveSheetAndRefresh(sheetIndexList)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndexList |
number[] |
是 |
sheet下标数组 |
返回值:无
示例:
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveSheetAndRefresh([0]);
描述:保存全部不刷新(不执行后续计算脚本)
说明:saveWorkbook(callback)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
callback |
({status: boolean})=>void |
否 |
保存回调 |
返回值:无
示例:
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveAll(({status}) => {
if (status) {
// 保存成功
} else {
// 保存失败
}
});
描述:保存全部并刷新(包含执行配置在电子表格的计算脚本)
说明:saveWorkbookAndRefresh()
返回值:无
示例:
// workbookApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveAllAndRefresh();
描述:打开新的tab标签
说明:routePush(basePath,element,queryParams)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
basePath |
string |
是 |
sheet下标数组 |
element |
{ |
否 |
跳转对象元素信息 |
queryParams |
Record<string, any> |
否 |
url参数 |
返回值:无
示例
// workbookApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
// 方式一
deepTableApi.routePush('/element-deep-table/2-0-0/',{elementName: 'test',folderId: 'DIR9c43728256f2'},{sheetName: 'Sheet3'});
// 方式二
deepTableApi.routePush('/element-deep-table/2-0-0/?elementName=test&folderId=DIR9c43728256f2&moduleId=GRD2_0&now=1678871366887&sheetName=Sheet3&sign=YXBwSWQ9bWtvcmpsMDA3JnNwYWNlPW1rb3JqbA%3D%3D');
描述:获取指定sheet下所有动态表和浮动行的基础区域信息
说明:getAreaRectInfo(sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
返回值:对应sheet下所有动态表和浮动表的区域基础信息( {
areaId: string;
areaName: string;
areaType: 'dynamic'|'float';
row: <number>[];
column: <number>[];
dataRow: <number>[];
dataColumn: <number>[];
}[] )
示例:
const { deepTableApi } = params;
const regionRectInfo = deepTableApi.getAreaRectInfo(0);
// [
// {
// areaId: 'xxxxxxxxx', //区域id:可作为getAreaInfo参数
// areaName: 'cube_region1',
// areaType: 'dynamic',
// row: [0,4], //区域行范围:第1行到第5行
// column: [0,4] //区域列范围:第1列到第5列
// row: [1,4], //数据行范围:第2行到第5行
// column: [1,4] //数据列范围:第2列到第5列
// }
// ]
描述:获取指定的动态表或浮动行区域的详细信息
说明:getAreaInfo(areaId)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
areaId |
string |
是 |
区域id |
返回值:指定的动态表或浮动行区域的详细信息
( {
areaType: 'dynamic'|'float';
cube: {
elementName: string;
folderId: string;
path: string;
serverName: string;
...
} | undefined,
dimension: {
pov: Record<string,string>;
row: Record<string,string>[];
column: Record<string,string>[];
} | undefined,
table: <{
elementName: string;
folderId: string;
path: string;
serverName: string;
alias: string;
}>[] | undefined,
tableColumn: <{
name: string;
type: 'int' | 'varchar'
tableAlias: string;
}>[] | undefined,
lineId: Record<number,{
tableAlias: string;
lineId: string
}>[]> | undeinfed
})
示例:
const { deepTableApi } = params;
const regionRectInfo = deepTableApi.getAreaInfo('xxxxxx');
描述:获取指定Sheet下所有DF公式的模型与维度信息
说明:getDFFormulaInfo(sheetIndex)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet索引 |
返回值:对应sheet下所有DF公式信息
( <{
row: number;
column: number;
cube: {
elementName: string;
folderId: string;
path: string;
serverName: string;
...
} ,
dimension: <Record<string,string>>[];
formulaAuthority: 'r' | 'rw';
cubeAuthority: number;
isComment: boolean;
// dfdata: 1,dfdatafx: 2
type: number;
}>[])
示例:
const { deepTableApi } = params;
const regionRectInfo = deepTableApi.getDFFormulaInfo(0);
描述:获取下载的luckysheet数据
说明:getAllExportSheet()
返回值:Promise<ISheet[]>
示例:
const { deepTableApi } = params;
deepTableApi.getAllExportSheet().then((sheets) => {
// Your code
});
color4 ⚠️注意:为了提高性能,本API只是对线上数据的浅克隆,原则上此数据只读,任意更改此数据可能会导致表格产生不可预期的问题
lucksheet数据结构
interface IData {
sheets: Array<ISheet>
}
interface ISheet{
name: string //sheet名称
index: number //顺序索引
row: number
column: number
preRow: number
preColumn: number
status: string
calcChain: Array<ICalcChain>
config: IConfig
frozen: IFrozen
filter_select: { //筛选范围
row: [number, number]
column: [number, number]
}
celldata: Array<{ //单元格数据 (用于上传)
r: number
c: number
v: ICelldata
}>
luckysheet_conditionformat_save: IConditionformat
dataVerification: IDataVerification
data: Array<Array<ICelldata>> //单元格数据 (用于下载)
}
//公式链
interface ICalcChain {
r: number //行号
c: number //列号
index: number //工作表id
}
interface IConfig {
merge: IMerge
rowlen: IRowColumnlen
columnlen: IRowColumnlen
rowhidden: IRowColumnhidden
borderInfo: Array<ICellBorderInfo | IRangeBorderInfo>
}
//合并单元格
interface IMerge {
[key:string] : { //key: r_c
r: number //行号
c: number //列号
rs: number //合并的行数
cs: number //合并的列数
}
}
//行高,列宽
interface IRowColumnlen {
[rowColumnNum: string] : number //rowColumnNum 行/列号
}
//行列隐藏
interface IRowColumnhidden {
[rowColumnNum: string] : 0 //rowColumnNum 行/列号
}
//单元格边框
interface ICellBorderInfo {
rangeType: "cell"
value: {
row_index: number //行号
col_index: number //列号
l? : IBorderStyle //左边框
r? : IBorderStyle //有边框
t? : IBorderStyle //上边框
b? : IBorderStyle //下边框
}
}
interface IBorderStyle {
style: number //边框粗细 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick
color: string //16进制颜色值
}
//范围边框
interface IRangeBorderInfo {
rangeType: "range"
borderType: "border-left" | "border-right" | "border-top" | "border-bottom" | "border-all" | "border-outside" | "border-inside" | "border-horizontal" | "border-vertical" | "border-none" //边框类型
style: number //边框粗细 1 Thin | 2 Hair | 3 Dotted | 4 Dashed | 5 DashDot | 6 DashDotDot | 7 Double | 8 Medium | 9 MediumDashed | 10 MediumDashDot | 11 MediumDashDotDot | 12 SlantedDashDot | 13 Thick
color: string //16进制颜色值
range: Array<{
row: [number,number] //起始结束行
column: [number,number] //起始结束列
}>
}
//冻结行列
interface IFrozen {
type: 'rangeRow' | 'rangeColumn' | 'rangeBoth'
range: {row_focus: number, column_focus: number} //冻结行列号
}
//条件格式
interface IConditionformat {
//参考备注《条件格式数据结构》
}
//数据验证
interface IDataVerification {
//参考备注《数据验证数据结构》
}
//单元格数据
interface ICelldata {
indent?: number //缩进
tb: number //0截断 1溢出 2自动换行
ff?: string //字体
fs?: number //字号
bl?: 0 | 1 //加粗
it?: 0 | 1 //斜体
fc?: string //字体颜色 16进制
un?: 0 | 1 //下划线
cl?: 0 | 1 //删除线
bg?: string //填充颜色 16进制
vt?: number //0 居中 1 居顶 2 居底
ht?: number //0 居中 1 居左 2 居右
v?: string | number //原始值
m?: string | number //展示值
f?: string //公式
ct?: { //格式 参考备注《单元格ct值参考》
fa: string
t: 'g' | 's' | 'n' //s字符串 n数字 g自动
s?: { //富文本
ff?: string
fc?: string
bl?: string
it?: 0 | 1
fs?: string
cl?: 0 | 1
un?: 0 | 1
}
}
edit?: boolean //锁定保护
}
描述:获取下载的luckysheet数据
说明:getExportBlobData()
返回值:Promise
示例:
const { deepTableApi } = params;
deepTableApi.getExportBlobData().then((blob) => {
const file = new File([blob], 'test.xlsx', { type: blob.type });
//可以考虑文件上传
});
描述:渲染表格loading
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
isLoading |
boolean |
是 |
true为loading |
返回值:无
示例:
const { deepTableApi } = params;
deepTableApi.setPageLoading(true);
描述:为浮动表插入额外空白行
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
areaName |
string |
是 |
浮动表区域名称(编码) |
insertNumber |
number |
是 |
插入行数(正整数) |
startRow |
number |
否 |
插入位置行索引,不传或者传入非法则默认在区域下方追加 |
返回值:{code:number,errMsg:string}
示例:
const { deepTableApi } = params;
const result = deepTableApi.insertFloatTableRow(0,'region1',100);
warning 建议用法:
可以将自定义js绑定到
1、普通按钮点击事件,点击后弹窗,内含inputNumber输入框,由用户手动输入新增行数
2、下拉按钮点击事件,点击不同的按钮,直接插入对应行数的数据
可以根据result的错误code,给用户一些提示语
⚠️注意:
如果匹配不到任何区域,则API将调用失败 code: -1
如果区域名称匹配的区域非浮动表,则API将调用失败 code: -2
如果区域名称匹配到多个浮动表区域,则API将调用失败,请自行更改区域名称,保持唯一性 code: -3
如果插入行后导致与区域或底稿冲突,则API将调用失败 code: -4
描述:修改浮动表逻辑属性维度列的表达式
说明: setFloatTableColDimExpr(sheetIndex,areaName,columnAlias,expression)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
areaName |
string |
是 |
浮动表区域名称 |
columnAlias |
string |
是 |
列别名 |
expression |
string |
是 |
维度表达式 |
返回值:{code:number,errMsg:string}
示例:
const { deepTableApi } = params;
const result = deepTableApi.setFloatTableColDimExpr(0,'float_type_region1','Entity','E01;E02');
⚠️注意:
如果匹配不到任何区域,则API将调用失败 code: -1
如果区域名称匹配的区域非浮动表,则API将调用失败 code: -2
如果区域名称匹配到多个浮动表区域,则API将调用失败,请自行更改区域名称,保持唯一性 code: -3
如果对应列的逻辑属性非维度,则API将调用失败 code: -4
如果没有匹配到列,则API将调用失败 code: -5
API不会检查维度表达式的合法性,请调用方自行控制
描述:修改浮动表逻辑属性维度单元格的表达式
说明: setFloatTableCellDimExpr(sheetIndex,row,column,expression)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
是 |
sheet下标 |
row |
number |
是 |
行坐标 |
column |
number |
是 |
列坐标 |
expression |
string |
是 |
维度表达式 |
返回值:{code:number,errMsg:string}
示例:
const { deepTableApi } = params;
const result = deepTableApi.setFloatTableCellDimExpr(0,4,4,'A01;A02');
⚠️注意:
如果对应的单元格非浮动表的单元格,则API调用失败 code: -1
如果对应的单元格非逻辑属性为维度的自定义单元格,则API调用失败 code: -2
API不会检查维度表达式的合法性,请调用方自行控制
目前下载出来的excel,下拉列表并不会同步表达式的变动
描述:将表格截图
说明: screenShot(sheetIndex,sr,er,sc,ec)
screenShot参数可选,如果未提供,则按照15列为图片宽度,A4纸张横向时高度能容纳的最大行数为图片高度进行分页截屏。
如果提供参数,则根据参数提供的行列号,只返回一张图片数据。(参数务必要齐全)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
sheetIndex |
number |
否 |
sheet下标 |
sr |
number |
否 |
起始行坐标 |
er |
number |
否 |
结束行坐标 |
sc |
number |
否 |
起始列坐标 |
ec |
number |
否 |
结束列坐标 |
返回值:Promise
interface IPicInfo {
b: Blob;
w: number;
h: number;
}
interface IBlobsResult {
blobList: IPicInfo[];
maxWidth: number;
maxHeight: number;
}
示例:
const { deepTableApi } = params;
//自动截图
const result = deepTableApi.screenShot();
for(let blob of result.blobList){
let img = new Image();
img.src = URL.createObjectURL(blob);
}
//手动截图
const result = deepTableApi.screenShot(0,0,10,0,10)
let img = new Image();
img.src = URL.createObjectURL(result.blobList[0]);
描述:jsPdf相关API,具体参考https://www.npmjs.com/package/jspdf
自定义按钮打印功能示例代码:
export default function () {
const onload = (p) => {
const {luckySheetApi,deepTableApi,filterApi} = p;
const {buttonApi} = deepTableApi;
const newBtn = buttonApi.create({
code: 'print',
desc: '打印',
type: 1,
func: () => {
//图片距离pdf文档边缘的边距
const PDFPADDING = 40;
//pdf横向摆放
const doc = new deepTableApi.jsPDF({ orientation: 'l', unit: 'px', hotfixes: ['px_scaling'] });
let pdfPage;
// 打印区域的宽度
const pdfWidth = Math.floor(doc.internal.pageSize.getWidth()) - PDFPADDING * 2;
// 打印区域的高度
const pdfHeight = Math.floor(doc.internal.pageSize.getHeight()) - PDFPADDING * 2;
deepTableApi.screenShot().then(({blobList: list, maxWidth, maxHeight}) => {
// deepTableApi.screenShot(1,0,50,0,12).then(({blobList: list, maxWidth, maxHeight}) => {
let firstFull = false;
if (list.length) {
let pafDrawWidth = 0;
let pafDrawHeight = 0;
list.forEach(b => {
const str = URL.createObjectURL(b.b);
pafDrawWidth = pdfWidth * b.w/maxWidth;
pafDrawHeight = pdfHeight * b.h/maxHeight;
if (firstFull) {
pdfPage = doc.addPage();
pdfPage.addImage(
str,
'PNG',
PDFPADDING,
PDFPADDING,
pafDrawWidth,
pafDrawHeight,
);
} else {
doc.addImage(
str,
'PNG',
PDFPADDING,
PDFPADDING,
pafDrawWidth,
pafDrawHeight,
);
firstFull = true;
}
})
let iframe = document.getElementById('iprint');
if (iframe) {
document.body.removeChild(iframe);
}
iframe = document.createElement('iframe');
iframe.id = 'iprint';
iframe.name = 'iprint';
iframe.type = 'application/pdf';
iframe.setAttribute('style', 'display: none;');
iframe.src = doc.output('bloburl');
document.body.appendChild(iframe);
iframe.contentWindow?.print();
}
})
}
});
const result = buttonApi.add(newBtn);
}
return {onload}
}
描述:通知父级window表格加载完成(一般用于在UX套表中批量导出时使用)
说明:loadedEmit()
返回值:无
示例:
const { deepTableApi } = params;
deepTableApi.loadedEmit();
warning 如果需要使用UX财务套表的批量导出功能,且表格本身开启了开表的自定义js,则需要在自定义js中手动调用此方法来表明自定义Js已经执行完毕,从而让导出程序感知表格已经完整打开并生成excel相关数据
=====================
如果需要单独使用此方法,则需要在表格url中追加参数loadedCb,值为回调函数名,表格一般处于iframe中,该回调函数需要在其父级parent中暴露
假设场景如下:
父window暴露方法 myfn = (win) => {console.log(‘表格加载完毕’)} 参数win为表格所处iframe的window对象(win上会挂载deepTableCustomJsApi={luckySheetApi,filterApi,deepTableApi})
表格url携带loadedCb=myfn
那么调用loadedEmit后,myfn会被调用
对于未开启开表自定义js的表格,会在表格开表结束后自动调用此方法
loadedEmit原则上只需要调用一次,重复调用并不会重复调用myfn方法
描述:绑定deepTable相关事件
说明:bindEvent(eventName,fn)
参数 |
类型 |
是否必传 |
备注 |
---|---|---|---|
eventName |
string |
是 |
事件名称 |
fn |
(…param: any[]) => any |
是 |
触发事件的回调方法 |
返回值:无
对于相同事件重复绑定事件,新绑定的事件监听函数会覆盖旧有的
描述:可以在读取上传excel文件前,处理数据,从而更改真实的excel文件(例如文件解密)
事件处理函数 async
参数 |
类型 |
备注 |
---|---|---|
file |
File |
资源管理器选中文件的File |
返回:ArrayBuffer | null 如果为null,则会取消掉此次上传
const { deepTableApi } = params;
deepTableApi.bindEvent('beforeUploadReadFile', async (file) => {
cont buffer = await dosomething(file);
return buffer;
})
描述:在上传到线上表格之前,可对上传数据(luckysheet)进行调整
事件处理函数
参数 |
类型 |
备注 |
---|---|---|
data |
luckysheet数据 |
返回:luckySheetData
const { deepTableApi } = params;
deepTableApi.bindEvent('beforeUpload', (data) => {
dosomething(data);
return data;
})
描述:在下载生成excel之前,可对下载数据(luckysheet)进行调整
事件处理函数
参数 |
类型 |
备注 |
---|---|---|
data |
luckysheet数据 |
返回:luckySheetData
const { deepTableApi } = params;
deepTableApi.bindEvent('beforeDownload', (data) => {
dosomething(data);
return data;
})
描述:上传到线上表格之后
事件处理函数:无参数
返回:无
const { deepTableApi } = params;
deepTableApi.bindEvent('afterUpload', () => {
// 上传后的一些逻辑
})
描述:浮动行标准功能追加行后| API insertFloatTableRow调用后
事件处理函数
参数 |
类型 |
备注 |
---|---|---|
sheetIndex |
number |
sheet下标 |
areaName |
string |
浮动表区域名称(编码) |
startRow |
Number |
插入位置行索引 |
insertNumber |
Number |
插入行数(整数) |
返回:无
const { deepTableApi } = params;
deepTableApi.bindEvent('afterFloatTableInsertRow', (evt) => {
const {sheetIndex,areaName,startRow,insertRowNum} = evt;
})
用于区域跳转时,目标元素为自定义js时使用,入参会给出点击单元格所对应的模型,维度,值等信息,最终接收一个跳转目标的URL字符串
export default function () {
const getUrl = (params,context) => {
// params里面主要是一些对外提供的api
// context里面主要是方法调用时的一些参数,当方法配置在不同的地方时,里面的数据可能是不一样的
// 这里假设配置在了跳转规则上
const { cube, povDimension, cellDimension, value, floatData } = context;
// cube:模型信息,包含elementName,folderId,path,serverName等
// povDimension:背景维度信息,动态表区域上的所有单元格都有此信息
// cellDimension:行列维度信息;如果是行标题,则给列维度;如果是列标题,则给行维度;如果是计算的单元格,此处无值
// value,点击的单元格的值
// floatData浮动表整行数据,数据格式如下
// floatData: {
// lineId: {
// t1: number,
// t2: number,
// ...
// },
// tableInfo: {
// t1: {
// tableElementName: string, //数据表元素名
// folderId: string, //目录id
// actualTableName: string //实际表明
// },
// t2: {
// tableElementName: string, //数据表元素名
// folderId: string, //目录id
// actualTableName: string //实际表明
// },
// ...
// }
// data: [
// {
// tableAlias: string, // 数据表别名 t1 t2
// columnName: string, // 数据表列名
// value: string | number, // 单元格的值,自定义单元格手填的和复制或上传的值可能有差异
// },
// ...
// ]
//}
return `/element-deep-table/2-0-0/?elementName=DeepTable_0221&folderId=DIRd86019017fcf&now=${Date.now()}&sign=YXBwSWQ9bWtvcmpsMDA3JnNwYWNlPW1rb3JqbA%3D%3D`
// 拼接url时,携带额外的筛参数可参考下面的连接
// https://proinnova.yuque.com/vnf5h6/xidynv/gqwq9hzcofs2es82
// 举例:return `/element-deep-table/2-0-0/?elementName=DeepTable_0221&folderId=DIRd47b702c95a7&moduleId=GRD2_0&sheetName=Sheet1&sign=YXBwSWQ9amtkd2dpMDEzJnNwYWNlPWprZHdnaQ%3D%3D&filterMap={"wbFilter":{"Year_wb1":"${povDimension.year}"},"sheetFilter":{"Sheet1":{"Product_st1":"${cellDimension.product}"}}}`
}
return {
getUrl,
}
}
示例场景:将JS方法配置到Sheet加载后、保存前、按钮点击等时间点,实现更灵活的脚本执行(具体实施时,比如根据筛选器值、单元格值等判断执行不同的脚本等。)
Python
import { extend } from '/package-base/@deepfos/request@2.0.0.mjs';
const urlPrefix = "/deepfos-server";
const rootServer = extend({
prefix: `${urlPrefix}`
});
export default function () {
const runPython = () => {
rootServer.post("/python-server2-0/start/python-web", {
data: {
elementName: 'XXX',
elementType: "PY",
folderId: 'XXX',
parameter: {
account: 'XXX',
sheetId: 'XXX'
}
}
}).then(res => {
console.log('执行结果:',res)
});
}
return {
runPython,
}
}
计算流
import { extend } from '/package-base/@deepfos/request@2.0.0.mjs';
const urlPrefix = "/deepfos-server";
const rootServer = extend({
prefix: `${urlPrefix}`
});
export default function () {
const runScript = () => {
rootServer.post("/deep-calculation-server1-0/calculation/info/run", {
data: {
flag:2, // 1同步执行,2异步执行
baseInfo: {
elementName: 'XXX',
elementType: "CS",
folderId: 'XXX',
serverName: 'deep-calculation-server1-0',
description: {},
remark: ''
},
json: {
account: 'XXX',
sheetId: 'XXX'
}
}
}).then(res => {
console.log('执行结果:',res)
});
}
return {
runScript,
}
}
参考文档:https://proinnova.yuque.com/vnf5h6/xidynv/zd4ek0
公共NPM包路径:html/package-base
私有NPM包路径:html/package-**
使用场景:有段js逻辑需要提出来,然后在其他的地方引用,例如一些公共的js函数。
找到运维,将js文件放到服务器指定位置
在需要使用的地方引用
自定义传入打印范围和方向
/*
* @Description:
* @Author: Yu.Zheng
* @Date: 2024-10-09 15:07:46
* @mapping
*/
/**
* @description: 通用方法 字母转数字
* @param {string} l 字母
* @return {*} 数字索引
*/
const l2n = (l) => {
if (!l)
return 0;
let _l = l.toUpperCase();
let n = 0;
for (let i = 0; i < _l.length; i++) {
n = n * 26 + _l.charCodeAt(i) - 64;
}
return n - 1;
};
/**
* @description: 通用方法 数字转字母
* @param {number} n 数字索引
* @return {*} 字母
*/
const n2l = (n) => {
let s = "";
while (n >= 0) {
s = String.fromCharCode((n % 26) + 65) + s;
n = Math.floor(n / 26) - 1;
}
return s;
};
const parseCell = (cell) => {
const [col, row] = cell.match(/[A-Z]+|[0-9]+/g);
const _col = l2n(col);
const _row = Number(row) - 1;
return [_row, _col];
};
const getStaticArea = (range) => {
console.log("🚀 ~ getStaticArea ~ range:", range);
return range.map((item) => {
console.log("🚀 ~ returnrange.map ~ range:", range);
const [start, end] = item.split(":");
// 匹配出列和行
// const [startColumn, startRow] = start.match(/[A-Z]+|[0-9]+/g) as string[];
// const [endColumn, endRow] = end.match(/[A-Z]+|[0-9]+/g) as string[];
// const _startColumn = l2n(startColumn);
// const _endColumn = l2n(endColumn);
// const _startRow = Number(startRow) - 1;
// const _endRow = Number(endRow) - 1;
const [_startRow, _startColumn] = parseCell(start);
const [_endRow, _endColumn] = parseCell(end);
return {
row: [_startRow, _endRow],
column: [_startColumn, _endColumn],
areaType: "static",
};
});
};
/**
* 获取当前激活的sheet下标
* @returns
*/
const getActiveSheetIndex = (win) => {
if (win) {
return win.luckysheet.getCurrentSheetIndex();
}
if (window.luckysheet?.created) {
return window.luckysheet.getCurrentSheetIndex() || 0;
}
return 0;
};
// 获取所有sheet数据
const getAllSheets = (win) => {
if (win) {
return win.luckysheet.getAllSheets();
}
return window.luckysheet.getAllSheets();
};
function getDevicePixelRatio() {
return window.luckysheet.Store().devicePixelRatio;
}
const P_COLUMNS = 10; // 纵向打印的列数
const L_COLUMNS = 15; // 横向打印的列数
const PDFPADDING = 40; //图片距离pdf文档边缘的边距
class Print {
deepTableApi;
luckySheetApi;
options = {
dir: "l",
};
constructor(params, options) {
this.deepTableApi = params.deepTableApi;
this.luckySheetApi = params.luckySheetApi;
this.options = Object.assign(this.options, options);
this.init();
}
// 初始化
init() {
const { dropdownMenuApi } = this.deepTableApi;
if (this.options.noInit) {
return;
}
window.customPrintInfo = this.options;
dropdownMenuApi.add(dropdownMenuApi.create({
code: "customPrint",
desc: "自定义打印",
func: () => {
this.deepTableApi.setPageLoading(true);
this.print();
},
}));
}
getPrintWidthAndHeigh(dir, pdfWidth, pdfHeight) {
const COLNUMBER = dir === "p" ? P_COLUMNS : L_COLUMNS;
const activeIndex = getActiveSheetIndex(this.options.win);
const sheet = getAllSheets(this.options.win)[activeIndex];
let visibledatacolumn = [];
let visibledatarow = [];
let baseWidth = 0;
let start = 0;
let maxWidth = 0;
// [起始位置,宽度|长度]
let rowHeightList = [];
let columnWidthList = [];
let maxRow = 0;
let maxCol = 0;
let ri = 0;
let ci = 0;
let row;
const maxList = [];
let breakFlag = false;
// 找到最下面的单元格
for (ri = sheet.data.length - 1; ri >= 0; ri -= 1) {
row = sheet.data[ri];
for (ci = row.length - 1; ci >= 0; ci -= 1) {
if (row[ci]) {
maxRow = Math.max(ri, maxRow);
maxCol = Math.max(ci, maxCol);
breakFlag = true;
break;
}
}
if (breakFlag) {
break;
}
}
breakFlag = false;
// 找到最右边的单元格
for (ci = sheet.data[0].length - 1; ci >= maxCol; ci -= 1) {
for (ri = maxRow; ri >= 0; ri -= 1) {
if (sheet.data[ri][ci]) {
maxRow = Math.max(ri, maxRow);
maxCol = Math.max(ci, maxCol);
breakFlag = true;
break;
}
}
if (breakFlag) {
break;
}
}
maxList.push([maxRow, maxCol]);
visibledatacolumn = sheet.visibledatacolumn.filter((v, vi) => vi <= maxCol);
baseWidth = 0;
visibledatacolumn.forEach((w, wi) => {
if (wi % COLNUMBER === COLNUMBER - 1) {
maxWidth = Math.max(maxWidth, w - baseWidth);
baseWidth = w;
}
else if (wi === visibledatacolumn.length - 1) {
maxWidth = Math.max(maxWidth, w - baseWidth);
}
});
const finalMaxWidth = Math.max(maxWidth, pdfWidth);
const finalMaxHeight = (finalMaxWidth * pdfHeight) / pdfWidth;
const urlList = [];
baseWidth = 0;
start = 0;
let _si = 0;
visibledatacolumn = sheet.visibledatacolumn.filter((v, vi) => vi <= maxList[activeIndex][1]);
visibledatarow = sheet.visibledatarow.filter((v, vi) => vi <= maxList[activeIndex][0]);
visibledatacolumn.forEach((w, wi) => {
// 正常来讲,应该不会有单列的宽度大于最大宽度
if (w - baseWidth <= finalMaxWidth) {
}
else {
columnWidthList.push([_si, wi]);
baseWidth = visibledatacolumn[wi - 1];
start = baseWidth;
_si = wi;
}
if (wi === visibledatacolumn.length - 1) {
columnWidthList.push([_si, wi]);
}
});
baseWidth = 0;
start = 0;
_si = 0;
visibledatarow.forEach((h, hi) => {
if (h - baseWidth <= finalMaxHeight) {
}
else {
rowHeightList.push([_si, hi]);
baseWidth = visibledatarow[hi - 1];
start = baseWidth;
_si = hi;
}
if (hi === visibledatarow.length - 1) {
rowHeightList.push([_si, hi]);
}
});
// 我在这里应该获取的是截图范围
//
rowHeightList.forEach((r) => {
columnWidthList.forEach((c) => {
urlList.push([activeIndex, r[0], r[1], c[0], c[1]]);
});
});
return urlList;
}
getPrintAreaByRange(pdfWidth, pdfHeight) {
if (!this.options.area) {
throw new Error("没有获取到打印区域");
}
const activeIndex = getActiveSheetIndex(this.options.win);
const sheet = getAllSheets(this.options.win)[activeIndex];
const [range] = getStaticArea([this.options.area]);
const areaRows = Object.keys(sheet.config.rowlen).filter((r) => range.row[0] <= Number(r) && Number(r) <= range.row[1]);
const areaColumns = Object.keys(sheet.config.columnlen).filter((c) => range.column[0] <= Number(c) && Number(c) <= range.column[1]);
if (areaRows.length && areaColumns.length) {
// 计算出要打印的列的宽度
const areaColumnsWidth = areaColumns.reduce((pre, cur) => {
return pre + sheet.config.columnlen[cur];
}, 0);
// 计算出与PDF的宽度比例
const ratio = pdfWidth / areaColumnsWidth;
// 通过宽度的比例计算出每页实际行的高度
const areaRowsHeight = pdfHeight / ratio;
let curHeight = 0;
let curRow = areaRows[0];
let startRow = areaRows[0];
const rows = []; // [[起始行, 结束行]]
areaRows.forEach((r, ri, raar) => {
if (raar.length - 1 === ri) {
rows.push([Number(startRow), Number(r)]);
}
if (curHeight + sheet.config.rowlen[r] > areaRowsHeight) {
rows.push([Number(startRow), Number(curRow)]);
startRow = r;
curHeight = 0;
}
else {
curHeight += sheet.config.rowlen[r];
curRow = r;
}
});
return rows.map((r) => {
return [activeIndex, r[0], r[1], range.column[0], range.column[1]];
});
}
return [];
}
// 打印
async print() {
//pdf横向摆放
const doc = new this.deepTableApi.jsPDF({
orientation: this.options.dir,
unit: "px",
hotfixes: ["px_scaling"],
});
const screenShotList = [];
// 打印区域的宽度
const pdfWidth = Math.floor(doc.internal.pageSize.getWidth()) - PDFPADDING * 2;
// 打印区域的高度
const pdfHeight = Math.floor(doc.internal.pageSize.getHeight()) - PDFPADDING * 2;
let ranges = [];
if (this.options?.area) {
ranges = this.getPrintAreaByRange(pdfWidth, pdfHeight);
}
else {
ranges = this.getPrintWidthAndHeigh(this.options.dir, pdfWidth, pdfHeight);
}
ranges.forEach((r) => {
screenShotList.push(this.deepTableApi.screenShot(...r));
});
const imgData = await Promise.all(screenShotList).then((data) => {
return data.reduce((pre, cur) => {
return {
blobList: [...pre.blobList, ...cur.blobList],
maxWidth: Math.max(pre.maxWidth, cur.maxWidth),
maxHeight: Math.max(pre.maxHeight, cur.maxHeight),
};
}, {
blobList: [],
maxWidth: 0,
maxHeight: 0,
});
});
this.getPDFByImages(doc, pdfWidth, pdfHeight, imgData);
if (this.options.noInit) {
return {
imgData,
options: this.options,
others: {
pdfHeight,
pdfWidth,
},
};
}
this.iframePreview(doc.output("bloburl"), () => {
this.deepTableApi.setPageLoading(false);
});
return {
imgData,
options: this.options,
others: {
pdfHeight,
pdfWidth,
},
};
}
getPDFByImages(doc, pdfWidth, pdfHeight, imgData) {
const { blobList: list, maxWidth, maxHeight } = imgData;
let pdfPage;
let firstFull = false;
if (list.length) {
let pafDrawWidth = 0;
let pafDrawHeight = 0;
list.forEach((b) => {
const str = URL.createObjectURL(b.b);
pafDrawWidth = (pdfWidth * b.w) / maxWidth;
pafDrawHeight = (pdfHeight * b.h) / maxHeight;
if (firstFull) {
pdfPage = doc.addPage();
pdfPage.addImage(str, "PNG", PDFPADDING, PDFPADDING, pafDrawWidth, pafDrawHeight);
}
else {
doc.addImage(str, "PNG", PDFPADDING, PDFPADDING, pafDrawWidth, pafDrawHeight);
firstFull = true;
}
});
}
return doc;
}
iframePreview(url, onClose) {
let iframe = document.getElementById("customprint");
if (iframe) {
document.body.removeChild(iframe);
}
iframe = document.createElement("iframe");
iframe.id = "customprint";
iframe.name = "customprint";
iframe.setAttribute("style", "display: none;");
iframe.src = url;
document.body.appendChild(iframe);
const blurFunc = () => {
onClose && onClose();
window.removeEventListener("blur", blurFunc);
};
window.addEventListener("blur", blurFunc);
iframe.contentWindow?.print();
// iframe失焦后监听
}
}
const Custom = () => {
const onSheetLoad1 = function (params, context) {
console.log('params', params)
new Print(params, {
dir: 'p',
area:'C13:H80',
})
};
return {
onSheetLoad1,
};
};
export default Custom;
序号 |
api名称 |
问题描述 |
原因以及解决方法 |
---|---|---|---|
1 |
getFilterValue |
获取筛选器的值,无效 |
可能是方法参数问题,请检查目标筛选器是工作簿级别还是sheet级别,工作簿级别的只需要一个筛选器名称即可,只有sheet级别的才需要第2个参数,用来说明是哪个sheet的筛选器 |
2 |
保存前钩子可以阻止保存么? |
可以。请将函数返回值置为 { next: false } | |
3 |
为什么API只有filterApi |
开表前/加载筛选器后 这个钩子下的自定义js只有筛选器相关的api提供 |
回到顶部
咨询热线