全部文档
文档中心电子表格2.0JS API 接口文档

JS API 接口文档

注意:V2.0.2.5.1版本后(包含此版本),自定义js文件的加载时机会被提前到dom渲染前。如果原本js在ESM初始化中有操作dom的行为,可能会出现异常。请将这类逻辑统统移到具体函数中,并配合表格执行钩子(开表前、保存后等)来实现

Copy
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这个参数了)

示例:

Copy
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 )

示例:

Copy
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 )

示例:

Copy
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)

示例:

Copy
const getCellMonitor = luckySheetApi.getCellMonitor(0,2,2);

⚠️注意:与getCellValue区别:在获取带格式的数字(比如日期、分隔符等)时,有不同表现。

描述:设置单元格的值

说明:setCellValue(sheetIndex,row,column,val)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

val

string

number

返回值:无

示例:

Copy
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>]

返回值:无

示例:

Copy
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

单元格公式

返回值:无

示例:

Copy
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

显示值

返回值:无

示例:

Copy
luckySheetApi.setCellValueAndMonitor(0,2,2,'SH','上海');

⚠️注意:

此API目前仅支持浮动表逻辑属性为维度,用户,值列表,自定义列表,日期的单元格。可以自行设定单元格值(如编码,用户ID)及对应显示层的内容(如名称描述,用户昵称)。其他单元格调用无效

为什么会有 v 和 m?


v是真实的维度成员,m是根据显示方式展示的编码-描述。

一个例外:如果将v值也设置为编码-描述,保存时服务端会自动转换为编码。

描述:清除单元格值和公式

说明:clearCellValue(sheetIndex,row,column)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

返回值:无

示例:

Copy
luckySheetApi.clearCellValue(0,2,2);

描述:清除矩形范围单元格值和公式

说明:clearRangeValue(sheetIndex,row,column,rowCount,columnCount)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

rowCount

number

矩形区域高度

columnCount

number

矩形区域宽度

返回值:无

示例:

Copy
luckySheetApi.clearRangeValue(0,2,2,2,2);

描述:清除单元格所有内容(样式,值,附加属性等)

说明:clearCellAll(sheetIndex,row,column)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

返回值:无

示例:

Copy
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

矩形区域宽度

返回值:无

示例:

Copy
luckySheetApi.clearRangeAll(0,2,2,2,2);

⚠️注意:

此API只建议在普通底稿上使用

请谨慎使用此API在动态表,DF公式,浮动行区域中。清除所有信息后,可能会导致后续业务逻辑的异常。如数据审计,浮动表逻辑属性特殊单元格

描述:获取当前激活的sheet索引

说明:getActiveSheet()

返回值: {

index: number; //sheet索引值

sheetName: string //sheet名称

}

示例:

Copy
const index = luckySheetApi.getActiveSheet();

描述:锁定sheet

说明:setSheetLocked(sheetIndex,locked)

返回值: 无

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

locked

boolean

是否锁定

示例:

Copy
const index = luckySheetApi.setSheetLocked(0,true);

描述:给单元格增加折叠图标。

说明:会按照参数控制行列折叠

返回值: 无

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

param

{


fold: boolean;

type: ‘row’

‘colunm’


s: number

e: number

}

⚠️注意:对于对齐方式为水平居右的,暂时不支持

示例:

Copy
//控制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; //条件格式字体颜色

}

示例:

Copy
const info = luckySheetApi.getCellStyle(0,0,0);

描述:设置矩形范围单元格的格式

说明:seCellFormatter(sheetIndex,row,column,formatter)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行起始坐标

column

number

列起始坐标

formatter

string

格式化字符串

返回值:无

示例:

Copy
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

格式化字符串

返回值:无

示例:

Copy
luckySheetApi.setRangeFormatter(0,0,0,2,2,'#,##0.00');

描述:锁定单元格

说明:setCellLocked(sheetIndex,row,column,locked)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

locked

boolean

是否锁定

返回值:无

示例:

Copy
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

是否锁定

返回值:无

Copy
luckySheetApi.setRangeLocked(0,2,2,4,4,true);

描述:设置单元格背景色

说明:setCellBackgroundColor(sheetIndex,row,column,color)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

color

string

颜色

返回值:无

示例:

Copy
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

颜色

返回值:无

示例:

Copy
luckySheetApi.setRangeBackgroundColor(0,2,2,4,4,'#ffffff');

描述:设置矩形区域内单元格的字体

说明:setCellFont(sheetIndex,row,column,font)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行起始坐标

column

number

列起始坐标

font

string

字体

返回值:无

示例:

Copy
luckySheetApi.setCellFont(0,2,2,'微软雅黑');

luckysheet工具栏中包含的字体枚举值如下:也可以使用其他系统支持的字体

Copy
"微软雅黑"
"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

字体

返回值:无

示例:

Copy
luckySheetApi.setRangeFont(0,2,2,2,2,'微软雅黑');

描述:设置单元格字号

说明:setCellFontSize(sheetIndex,row,column,size)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

size

number

字号大小

返回值:无

示例:

Copy
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

字号大小

返回值:无

Copy
luckySheetApi.setRangeFontSize(0,2,2,4,4,10);

描述:设置矩形区域内单元格的字体颜色

说明:setCellFontColor(sheetIndex,row,column,color)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行起始坐标

column

number

列起始坐标

color

string

颜色

返回值:无

示例:

Copy
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

颜色

返回值:无

示例:

Copy
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

返回值:无

示例:

Copy
// 边框类型,可选值如下:
// "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

返回值:无

示例:

Copy
// 边框类型,可选值如下:
// "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

返回值:无

示例:

Copy
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

返回值:无

示例:

Copy
luckySheetApi.setRangeBold(0,2,2,2,2,true);

描述:设置字体加粗

说明:setCellItalic(sheetIndex,row,column,isItalic)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

isItalic

boolean

是否斜体 默认true

返回值:无

示例:

Copy
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

返回值:无

示例:

Copy
luckySheetApi.setRangeItalic(0,2,2,2,2,true);

描述:设置水平对齐方式

说明:setHorizontalAlign(sheetIndex,row,column,type)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

type

‘left’

‘center’

‘right’

返回值:无

示例

Copy
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’

返回值:无

示例

Copy
luckySheetApi.setRangeHorizontalAlign(0,0,0,2,2,'left');

描述:设置垂直对齐方式

说明:setVerticalAlign(sheetIndex,row,column,type)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

type

‘top’

‘middle’

‘bottom’

返回值:无

示例:

Copy
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’

返回值:无

示例:

Copy
luckySheetApi.setRangeVerticalAlign(0,0,0,2,2,'middle');

描述:设置下划线

说明:setTextDecoration(sheetIndex,row,column)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

isTextDecoration

boolean

是否增加下划线,默认true

返回值:无

示例:

Copy
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

返回值:无

示例:

Copy
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>

返回值:无

示例:

Copy
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>

返回值:无

示例:

Copy
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

列坐标

返回值:无

示例:

Copy
// 清除的属性包含字符格式,背景色,字体,字体颜色,字体大小,加粗,斜体,删除线,
// 水平对齐,垂直对齐,文本换行,下划线,缩进
luckySheetApi.clearCellStyle(0,0,0);

⚠️注意:

条件格式,数据验证,合并单元格,边框不会被清除

描述:清除矩形范围单元格样式

说明:clearRangeStyle(sheetIndex,row,column,rowCount,columnCount)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

rowCount

number

矩形区域高度

columnCount

number

矩形区域宽度

返回值:无

示例:

Copy
luckySheetApi.clearRangeStyle(0,0,0,2,2);

⚠️注意:

条件格式,数据验证,合并单元格,边框不会被清除

描述:设置单元格缩进

说明:setCellIndent(sheetIndex,row,column,indent)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

indent

number

缩进单位个数

返回值:无

示例:

Copy
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

缩进单位个数

返回值:无

示例:

Copy
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: 自动换行

返回值:无

示例:

Copy
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: 自动换行

返回值:无

示例:

Copy
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

横向合并长度

返回值:无

示例:

Copy
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

横向取消合并长度

返回值:无

示例:

Copy
luckySheetApi.cancelMergeCells(0,2,2,3,3); // 取消合并的区域C3:E5

⚠️注意:

参数范围内的所有合并,不管是完全包含,还是有交集,都会被取消

描述:获取sheet的实际行数(没有数据的空白区域也算在内)

说明:getRowCount(sheetIndex)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

返回值:实际行数(number)

示例:

Copy
const sheet = luckySheetApi.getSheet(0);
const rowCount = luckySheetApi.getRowCount(0);
//const rowCount = sheet.getRowCount();

描述:获取sheet的实际列数(没有数据的空白区域也算在内)

说明:getColumnCount(sheetIndex)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

返回值:实际列数(number)

示例:

Copy
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)

返回值:无

示例:

Copy
luckySheetApi.setRowVisible(0,1,false);

⚠️注意:

如果有很多行需要隐藏,建议使用setSpecificRowVisible,以提高性能。

描述:批量展示行

说明:setSpecifyRowVisible(sheetIndex,rows,status)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

rows

number[]

行下标数组

status

boolean

显示(true)/隐藏(false)

返回值:无

示例:

Copy
luckySheetApi.setSpecifyRowVisible(0,[0,1,3],true);

描述:设置列显示/隐藏

说明:setColumnVisible(sheetIndex,row,status)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

列号

status

boolean

显示(true)/隐藏(false)

返回值:无

示例:

Copy
luckySheetApi.setColumnVisible(0,1,false);

⚠️注意:

如果有很多列需要隐藏,建议使用setSpecificColumnVisible,以提高性能。

描述:批量展示列

说明:setSpecifyColumnVisible(sheetIndex,columns,status)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

columns

number[]

列下标数组

status

boolean

显示(true)/隐藏(false)

返回值:

示例:

Copy
luckySheetApi.setSpecifyColumnVisible(0,[0,1,3],true);

描述:设置列宽

说明:setColumnWidth(sheetIndex,option)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

option

object


{[column: number]: number

string}

返回值:无

示例:

Copy
// A列设置列宽48,B列设置自适应列宽
luckySheetApi.setColumnWidth(0,{0: 48,1: 'auto'});

描述:设置列宽

说明:setRowHeight(sheetIndex,option)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

option

object


{[column: number]: number

string}

返回值:无

示例:

Copy
// 第一行设置高度100px,第二行设置自适应行高
luckySheetApi.setRowHeight(0,{0: 100,1: 'auto'});

描述:是否暂停渲染。

说明:suspendDraw(flag)

参数

类型

是否必传

备注

flag

boolean

true,暂停渲染;false,开启渲染,并立即触发一次渲染

返回值:无

示例:

Copy
// getSheet的结果不包含此方法
luckySheetApi.suspendDraw(true);

批量更改单元格值,样式等信息时请添加suspendDraw,以提高效率

描述:是否暂停计算。

说明:suspendCalculate(flag)

参数

类型

是否必传

备注

flag

boolean

true,暂停计算;false,开启渲染,并立即触发一次计算

返回值:无

示例:

Copy
// getSheet的结果不包含此方法
luckySheetApi.suspendCalculate(true);

批量更改单元格公式时请添加suspendCalculate,以提高效率

描述:是否开始同步表格初始数据

说明:表格开表后,会将开表的原始数据记录下来,当通过Js或者用户编辑更改数据后,会与此原始数据比较,从而获得增量变化的数据。此API开关闭合期间,所有的更改操作都会直接同步原始数据,这些单元格的变化将不再视为增量变化。

参数

类型

是否必传

备注

flag

boolean

true,开始同步;false,关闭同步

ignoreChain

boolean

忽略链式函数,默认值 false


比如A1单元格被A2单元格公式引用。如果A1发生变化,A2也会触发重新计算。若ignoreChain == false,则A2也会将最新计算的值同步原始数据,否则将不同步

返回值:无

示例:

Copy
// getSheet的结果不包含此方法
luckySheetApi.syncOriginData(true);
//dosomething like setCellValue,setCellFormula
luckySheetApi.syncOriginData(false);

tips 本API的使用场景,跟电子表格2.0的数据变更及保存相关逻辑有关,以下供参考:

1、数据是分层次的(概念理解上的层次,并不一定是技术侧分层):

第一层(原始数据):财务模型取数、底版数据、dfdata取数、dfdatafx计算、override覆盖

第二层:通过自定义JS修改数据

第三层:用户手工编辑

2、数据变更状态:

第1层和第2、3层之间不一样,就认为数据发生了变更(是否变更是单元格标黄及保存的前提条件)

可以通过自定义JS API,将JS修改的单元格初始值重置,
使其不认为是数据变更

3、标黄

如果

单元数是a.动态表的有权限填写的单元格 b.dfdata(wr) c.未来其他控件
并且
数据变更了(见概念2)

则单元格需要标黄。如果sheet上有标黄的单元格,刷新或关闭的时候,需要提醒。

4、数据保存

如果数据变更了,并且用户有模型侧权限,在总保存时需要将数据存储到服务端

(datafx除外,它永远都会保存)

场景举例:

  1. 动态表或dfdata(wr),用户填数了->数据变更->-标黄->保存

  2. dfdatafx,引用的单元格发生了变化->数据变更->标黄对象里没他->永远保存

  3. 通过JS修改可input的动态表单元格(固定值或公式)->数据变更->标黄->保存

  4. 通过JS修改标题或空白区域->数据变更->不标黄->不保存

  5. 通过JS修改可input的动态表单元格->通过API重置了初始状态->开表时不认为是变更->只要用户不编辑,都没变更->不标黄->不保存

  6. override里右边是data或fx->除非用户手动input,否则不是变更->不标黄->不保存

~~描述:更新原始数据~~

~~说明:refreshOriginData(data)~~

~~参数~~

~~类型~~

~~是否必传~~

~~备注~~

~~data~~

~~[{~~


~~sheetIndex: number;~~

~~whiteList: Record<string,number>;~~

~~blackList: Record<string,number>;~~

~~}]~~

~~是~~

~~需要更新的原始数据(whiteList,blackList同时存在时,blackList将被忽略)~~

~~返回值:无~~

~~示例:~~

Copy
// 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:冻结列;其他:冻结行列


不传也视为冻结行列

返回值:无

示例:

Copy
luckySheetApi.setFrozen(0,'B5',1);

描述:获取当前选中的单元格的坐标范围

返回值:{

hideColumn: Array

[];

hideRow: Array

[];

range: [{

row: [number,number];

colunm:[number,number];

}]

sheetIndex: number

}

Copy
const info = luckySheetApi.getSelectedCellRange();

描述:设置工作表缩放比例

返回值:无

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

zoom

number

缩放比例 0.1 ~ 4

Copy
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,

}

示例

Copy
const info = luckySheetApi.getCellInfo(0,4,4);

描述:修改单元格模型权限值

强制修改模型权限状态值可能导致业务逻辑发生变化,请谨慎使用

说明:modifyCellCubeAuthority(sheetIndex,row,column,authority)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

authority

number

单元格权限

返回值:修改结果成功或者失败(boolean)

示例:

Copy
// 如果单元格不是动态表区域单元格,也不是底稿公式单元格,结果返回为false
const result = luckySheetApi.modifyCellCubeAuthority(0,2,2,1);

以下为authority的枚举值以及解释:

权限值

解释

1

可写

2

汇总节点,属性维,view维引起的只读

3

可写-但是是因为维度成员特殊引起的可写(如科目维父级可写,文本类型科目)

4

属性维只读

5

页面设置的只读

6

scenario控制的只读

7

当前用户因读写权限被控制的只读

8

当前用户无权限

9

会计日历只读

10

科目,期间做度量的只读

11

cube列既不是维度,度量,但作为主键时只读

描述:增加自定义右键菜单

说明:addRightClickMenu(param)

参数

类型

是否必传

备注

param

IData{


r: number

c: number

v: string

number


m: string

f: string //公式

edit: boolean //单元格保护

} IParam{

title: string;

onClick: (data:IData)=> any

verify?�: (data:IData)=> boolean

}

返回值:无

示例

Copy
luckySheetApi.addRightClickMenu({
	title: '自定选项',
	onClick: (data)=>{console.log(data)},
	verify: ()=> true
})

描述:显示/隐藏 sheet

说明:setSheetVisible(sheetIndex,status)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

status

boolean

显示/隐藏

返回值:Promise

示例

Copy
//第一张表隐藏
luckySheetApi.setSheetVisible(0,false).then(() => {
	// your code ...
})

描述:设置指定sheet内筛选区域指定列的筛选条件

说明:setFilterConditions(sheetIndex,column,condition)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

column

number

列的下标

condition

{


type: string,

value: string[]

number[]


}

返回值:无

示例

Copy
// 最后的参数type暂时只支持value
luckySheetApi.setFilterConditions(0,2,{type: 'value',value: [1,2,3]})

类型

示例

备注

按值筛选

{


type: ‘value’,

value: [‘1’,’2’,’3’]

}

value为筛选的显示值(

非实际值
),会按照数组匹配到的值去筛选。命中空白为空字符串

待补充

描述:设置激活sheet下标

说明:setActiveSheet(sheetIndex)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

返回值:无

示例:

Copy
// 设置sheet2为激活sheet
luckySheetApi.setActiveSheet(1);

描述:单元格绑定事件

说明:bindEvent(name,func)

参数

类型

是否必传

备注

name

string

事件名称

func

(params: any)=> void

事件触发后执行的方法

返回值:无

示例

Copy
// getSheet的结果不包含此方法
luckySheetApi.bindEvent('cellClick',(...params) => {
	// params会因为不同的事件,里面的数据可能也不同
	// params 参数示例如下
	// [
  // 		{
  //     	"m": "12.00",
  //     	"v": 12
  // 		},
  // 		{
  //     	"r": 3,
  //     	"c": 3
  // 		}
	// ]
});

事件参数列表

Event Name

params

cellClick

1. content {


v: string

cellUpdate

1. curContent {


v: string

afterFilterSort

{


// 触发筛选排序的sheetIndex

sheetIndex: number

// 升序

⚠️注意:

1.一个典型的错误是在cellUpdate事件中无差别的去更改单元格值,这会导致再次触发cellUpdate,最终造成程序的死循环。请在cellUpdate中增加适当的限制逻辑避免死循环的产生

2.另一个典型的错误是在刷新后重复绑定事件监听,重复绑定可能会造成严重的性能问题,为了防止事件重复绑定,可以声明一个变量来避免。代码如下

Copy
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

错误信息内容

返回值:无

示例:

Copy
// 设置第一个sheet的A1单元格的错误信息为“测试错误信息”
luckySheetApi.setCellError(0,0,0,'测试错误信息');

描述:删除单元格错误信息

说明:clearCellError(sheetIndex,row,column)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

row

number

行坐标

column

number

列坐标

返回值:无

示例:

Copy
// 删除第一个sheet的A1单元格的错误信息
luckySheetApi.clearCellError(0,0,0);

描述:设置指定sheet内筛选区域指定列的排序类型

说明:setFilterSortType(sheetIndex,column,type)

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

column

number

列坐标

type

string

有效的值’asc’和’desc’,其他的不生效

返回值:无

示例:

Copy
// 设置第1个sheet筛选区域内的A列按照升序排序
luckySheetApi.setFilterSortType(0,0,'asc');

所有API均挂在命名空间luckySheetApi.ConditionFormat下

条件格式需要先通过实例化对应的条件,然后通过add方法到sheet中生效

描述:增加条件格式到指定sheet

参数

类型

备注

sheetIndex

number

sheet索引,从0开始

instance

Contain

Formula

Copy
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{


name: CompareType

value: Array<number

string>


}





format

interface format{


textColor?: string;

cellColor?: string;

}

{


textColor: ‘#9C0006’

cellColor: ‘#FFC7CE’;

}

textColor

字体颜色 16进制

cellColor

单元格填充颜色 16进制

Copy
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?: string;

cellColor?: string;

}

{


textColor: ‘#9C0006’

cellColor: ‘#FFC7CE’;

}

textColor

字体颜色 16进制

cellColor

单元格填充颜色 16进制

Copy
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{


type: ‘top’

‘last’,


percent?: boolean

value: number

}

format

interface format{


textColor?: string;

cellColor?: string;

}

{


textColor: ‘#9C0006’

cellColor: ‘#FFC7CE’;

}

textColor

字体颜色 16进制

cellColor

单元格填充颜色 16进制

Copy
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?: string;

cellColor?: string;

}

{


textColor: ‘#9C0006’

cellColor: ‘#FFC7CE’;

}

textColor

字体颜色 16进制

cellColor

单元格填充颜色 16进制

Copy
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?: string;

cellColor?: string;

}

{


textColor: ‘#9C0006’

cellColor: ‘#FFC7CE’;

}

textColor

字体颜色 16进制

cellColor

单元格填充颜色 16进制

Copy
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?: string;

cellColor?: string;

}

{


textColor: ‘#9C0006’

cellColor: ‘#FFC7CE’;

}

textColor

字体颜色 16进制

cellColor

单元格填充颜色 16进制

Copy
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%

Copy
const {DataBar} = luckySheetApi.ConditionFormat;

const instance = new DataBar({
  cellRange: 'A1:B2'
  format: ['#FFC7CE']
})

描述:色阶

构造函数参数

参数

类型

必填/默认值

备注

cellRange

string

条件格式作用范围 eg: ‘A1:B2’

format

[string,string]


[string,string,string]

cfvoType

auto

num

auto

cfvoValue

[num,num]

cfvoType为num时必填,为色阶条的最大最小值,超过这个范围,色阶按边界颜色设置

Copy
const {ColorGradation} = luckySheetApi.ConditionFormat;

const instance = new ColorGradation({
  cellRange: 'A1:B2'
  format: ['#FFC7CE','#9C0006']
})

描述:图集

构造函数参数

参数

类型

必填/默认值

备注

cellRange

string

条件格式作用范围 eg: ‘A1:B2’

format

IconsType

图集类型


enum IconsType

type

number

选择划分方式,默认值为1


enum number

1为百分比

2为数字

conditions

array<{


//1:大于等于 2:大于

condition: 1

2 ;


value: number

}>

reverse

boolean

是否反转图标(

coming soon

enum boolean

true为反转

false为不反转 (默认值)

Copy
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
})

图集枚举类型

Copy
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

Copy
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



可以是英文逗号分隔的字符:


a,b,c,d

也可以是单元格或单元格范围

A1 or A1:A5

如果是单元格,则会根据cellRange自动计算行列偏移,如果想锁死选取范围,请在行列前增加AAA$5

isMulti

boolean

是否允许多选,默认false

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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 {


bw = “bw”, 介于

nb = “nb”, 不介于

eq = “eq”, 等于

ne = “ne”, 不等于

gt = “gt”, 大于

lt = “lt”, 小于

gte = “gte”, 大于等于

lte = “lte” 小于等于

}

value

[number]

[number,number]

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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 {


bw = “bw”, 介于

nb = “nb”, 不介于

eq = “eq”, 等于

ne = “ne”, 不等于

gt = “gt”, 大于

lt = “lt”, 小于

gte = “gte”, 大于等于

lte = “lte” 小于等于

}

value

[number]

[number,number]

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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 {


bw = “bw”, 介于

nb = “nb”, 不介于

eq = “eq”, 等于

ne = “ne”, 不等于

gt = “gt”, 大于

lt = “lt”, 小于

gte = “gte”, 大于等于

lte = “lte” 小于等于

}

value

[number]

[number,number]

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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 {


bw = “bw”, 介于

nb = “nb”, 不介于

eq = “eq”, 等于

ne = “ne”, 不等于

gt = “gt”, 大于

lt = “lt”, 小于

gte = “gte”, 大于等于

lte = “lte” 小于等于

}

value

[number]

[number,number]

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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 {


include = “include”, 包含

exclude = “exclude”, 不包含

equal = “equal” 等于

}

value

string

比较的文本内容

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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 {


bw = “bw”, 介于

nb = “nb”, 不介于

eq = “eq”, 等于

ne = “ne”, 不等于

bf = “bf”, 早于

nbf = “nbf”, 不早于

af = “af”, 晚于

naf = “naf”, 不晚于

}

value

[string]

[string,string]

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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



填写想要设置的公式


eg: datevalue(C5)>datevalue(“2020-01-01”)

prohibitInput

boolean

输入数据无效时禁止输入,默认false

hintText

string

选中单元格显示的提示语,默认无

customWarning

string

数据数据无效时的错误提示语,不传为默认提示语

Copy
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是描述

示例:

Copy
// 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[])

示例:

Copy
const filterValue = filterApi.getFilterValue('accoutn_st1',0)

描述:获取所有筛选器的值

说明:getFiltersValue()

返回值:所有筛选器的值({ wb: Record<string,string|string[]>}, st: Record<number,Record<string,string>>})

示例:

Copy
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}[])

示例:

Copy
// 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级筛选器设置)

返回值:无

示例:

Copy
// 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级筛选器设置)

返回值:无

示例:

Copy
// 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级筛选器设置)

返回值:无

示例:

Copy
// 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级筛选器设置)

返回值:无

示例:

Copy
// 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

触发事件的回调方法

返回值:无

示例:

Copy
// 这里会罗列所有支持的绑定事件的示例
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. {


// 筛选器名称

filterName: string,

// 筛选器的值

value: string

描述:获取工作蒲相关信息

说明:getWorkbookInfo()

返回值:

Copy
{
  workbookName: string;  //工作蒲编码  
  workbookFolderId: string; 
  workbookPath: string;
  workbookDescription: string; //工作蒲名称  
  workbookInstruction: string //工作蒲描述 
  sheetNameList: Array<string>
  buttonInfo: Array<{code:string;desc:string|Record<string,string>;type:number}>
}

示例

Copy
const { deepTableApi: { getWorkbookInfo } } = params;
console.log(getWorkbookInfo());

描述:创建按钮

说明:create({code,desc,type,func})

参数

类型

是否必传

备注

code

string

按钮唯一标识

desc

string

Record<string,string>

type

number

1,普通按钮;2,下拉按钮

func

() => void

按钮点击事件(下拉按钮可以没有)

返回值:按钮对象

示例

Copy
const { luckySheetApi, deepTableApi: { buttonApi } } = params;
const newBtn = buttonApi.create({
	code: 'calc',
	desc: '计算',
	type: 1,
	func: () => {
  	console.log('click calc!')  
  }
});
// 下面是创建下拉按钮示例
const dropdownBtn = buttonApi.create({
	code: 'option',
	desc: '操作',
	type: 2,
});
dropdownBtn.child.push(newBtn);

描述:将按钮对象添加到按钮列表,展示到页面上

说明:add(button)

参数

类型

是否必传

备注

button

按钮对象

通过create可以创建按钮对象

返回值:boolean(添加结果)

示例

Copy
const { luckySheetApi, deepTableApi: { buttonApi } } = params;
const newBtn = buttonApi.create({
	code: 'calc',
	desc: '计算',
	type: 1,
	func: () => {
  	console.log('click calc!')
  }
});
// 如果添加成功返回true,否则返回false;如果code重复,则会添加失败
const result = buttonApi.add(newBtn);

描述:设置按钮显示/隐藏

说明:setVisible(code,status)

参数

类型

是否必传

备注

code

string

按钮唯一标识

status

boolean

true(显示)/false(隐藏)

返回值:无

示例

Copy
const { luckySheetApi, deepTableApi: { buttonApi } } = params;
buttonApi.setVisible('calc',false);

描述:设置按钮是否禁用

说明:setDisabled(code,status)

参数

类型

是否必传

备注

code

string

按钮唯一标识

status

boolean

true(禁用)/false(启用)

返回值:无

示例

Copy
const { luckySheetApi, deepTableApi: { buttonApi } } = params;
buttonApi.setDisabled('calc',false);

warning 目前暂不支持四个标准按钮:保存当前,保存全部,刷新当前,刷线全部

描述:刷新指定sheet(包含工作簿级别筛选器带来的联动效果)

说明:refreshSheet(sheetIndexList)

参数

类型

是否必传

备注

sheetIndexList

number[]

sheet下标数组

返回值:无

示例:

Copy
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.refreshSheet([0]);

描述:刷新全部

说明:refreshAll()

返回值:无

示例:

Copy
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.refreshAll();

描述:判断指定Sheet的筛选器Value是否为空,可用于作为刷新表格前的判定(如果存在筛选器值为空的话是不允许刷新的)

说明:getWhetherRefreshAllowed(sheetIndexList)

参数

类型

是否必传

备注

sheetIndexList

number[]

sheet下标数组

返回值:是否允许刷新(boolean)

示例:

Copy
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.getWhetherRefreshAllowed([0]);

描述:保存指定sheet不刷新(不执行后续计算脚本)

说明:saveSheet(sheetIndexList,callback)

参数

类型

是否必传

备注

sheetIndexList

number[]

sheet下标数组

callback

({status: boolean})=>void

保存回调

返回值:无

示例:

Copy
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveSheet([0],({status}) => {
	if (status) {
  	// 保存成功
  } else {
  	// 保存失败
  }
});

描述:保存指定sheet并刷新(保存时包含执行配置在电子表格并关联了此sheet的计算脚本)(刷新时包含工作簿级别筛选器带来的联动效果)

说明:saveSheetAndRefresh(sheetIndexList)

参数

类型

是否必传

备注

sheetIndexList

number[]

sheet下标数组

返回值:无

示例:

Copy
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveSheetAndRefresh([0]);

描述:保存全部不刷新(不执行后续计算脚本)

说明:saveWorkbook(callback)

参数

类型

是否必传

备注

callback

({status: boolean})=>void

保存回调

返回值:无

示例:

Copy
// deepTableApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveAll(({status}) => {
	if (status) {
  	// 保存成功
  } else {
  	// 保存失败
  }
});

描述:保存全部并刷新(包含执行配置在电子表格的计算脚本)

说明:saveWorkbookAndRefresh()

返回值:无

示例:

Copy
// workbookApi 与 luckySheetApi 同级别
const { luckySheetApi, deepTableApi } = params;
deepTableApi.saveAllAndRefresh();

描述:打开新的tab标签

说明:routePush(basePath,element,queryParams)

参数

类型

是否必传

备注

basePath

string

sheet下标数组

element

{


elementName: string,

folderId: string,

path?: string,

}

跳转对象元素信息

queryParams

Record<string, any>

url参数

返回值:无

示例

Copy
// 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下所有动态表和浮动表的区域基础信息( {

Copy
  areaId: string;  
		areaName: string;  
		areaType: 'dynamic'|'float';  
		row: <number>[];  
		column: <number>[];

                    dataRow: <number>[];  
		dataColumn: <number>[];  
	}[]  )

示例:

Copy
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

返回值:指定的动态表或浮动行区域的详细信息

Copy
( {  
			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

            })

示例:

Copy
const { deepTableApi } = params;
const regionRectInfo = deepTableApi.getAreaInfo('xxxxxx');

描述:获取指定Sheet下所有DF公式的模型与维度信息

说明:getDFFormulaInfo(sheetIndex)

参数

类型

是否必传

备注

sheetIndex

number

sheet索引

返回值:对应sheet下所有DF公式信息

Copy
( <{

      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;

}>[])

示例:

Copy
const { deepTableApi } = params;
const regionRectInfo = deepTableApi.getDFFormulaInfo(0);

描述:获取下载的luckysheet数据

说明:getAllExportSheet()

返回值:Promise<ISheet[]>

示例:

Copy
const { deepTableApi } = params;
deepTableApi.getAllExportSheet().then((sheets) => {
  // Your code
});

color4 ⚠️注意:为了提高性能,本API只是对线上数据的浅克隆,原则上此数据只读,任意更改此数据可能会导致表格产生不可预期的问题

lucksheet数据结构

Copy

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

示例:

Copy
const { deepTableApi } = params;
deepTableApi.getExportBlobData().then((blob) => {
  const file = new File([blob], 'test.xlsx', { type: blob.type });
  //可以考虑文件上传
});

描述:渲染表格loading

参数

类型

是否必传

备注

isLoading

boolean

true为loading

返回值:无

示例:

Copy
const { deepTableApi } = params;
deepTableApi.setPageLoading(true);

描述:为浮动表插入额外空白行

参数

类型

是否必传

备注

sheetIndex

number

sheet下标

areaName

string

浮动表区域名称(编码)

insertNumber

number

插入行数(正整数)

startRow

number

插入位置行索引,不传或者传入非法则默认在区域下方追加

返回值:{code:number,errMsg:string}

示例:

Copy
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}

示例:

Copy
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}

示例:

Copy
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

Copy
interface IPicInfo {
    b: Blob;
    w: number;
    h: number;
}
interface IBlobsResult {
    blobList: IPicInfo[];
    maxWidth: number;
    maxHeight: number;
}

示例:

Copy
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

自定义按钮打印功能示例代码:

Copy
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()

返回值:无

示例:

Copy
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方法

描述:设置右键菜单展示/隐藏状态

说明:setRightMenuShowStatus(menuKey,showStatus)

参数

类型

是否必传

备注

menuKey

string

按钮对应的key


数据审计: dataAudit

上传附件: uploadAttachment

插入批注: addComment

编辑批注: editComment

删除批注: deleteComment

showStatus

boolean

展示(true)/隐藏(false)状态

返回值:无

示例:

Copy
const { deepTableApi } = params;
// 隐藏数据审计右键菜单
deepTableApi.setRightMenuShowStatus('dataAudit',false);

描述:绑定deepTable相关事件

说明:bindEvent(eventName,fn)

参数

类型

是否必传

备注

eventName

string

事件名称

fn

(…param: any[]) => any

触发事件的回调方法

返回值:无

对于相同事件重复绑定事件,新绑定的事件监听函数会覆盖旧有的

描述:可以在读取上传excel文件前,处理数据,从而更改真实的excel文件(例如文件解密)

事件处理函数 async

参数

类型

备注

file

File

资源管理器选中文件的File

返回:ArrayBuffer | null 如果为null,则会取消掉此次上传

Copy
const { deepTableApi } = params;

deepTableApi.bindEvent('beforeUploadReadFile', async (file) => {
	cont buffer = await dosomething(file);
	return buffer;
})

描述:在上传到线上表格之前,可对上传数据(luckysheet)进行调整

事件处理函数

参数

类型

备注

data

luckySheetData

luckysheet数据

返回:luckySheetData

Copy
const { deepTableApi } = params;

deepTableApi.bindEvent('beforeUpload', (data) => {
	dosomething(data);
	return data;
})

描述:在下载生成excel之前,可对下载数据(luckysheet)进行调整

事件处理函数

参数

类型

备注

data

luckySheetData

luckysheet数据

返回:luckySheetData

Copy
const { deepTableApi } = params;

deepTableApi.bindEvent('beforeDownload', (data) => {
	dosomething(data);
	return data;
})

描述:上传到线上表格之后

事件处理函数:无参数

返回:无

Copy
const { deepTableApi } = params;

deepTableApi.bindEvent('afterUpload', () => {
	// 上传后的一些逻辑
})

描述:浮动行标准功能追加行后| API insertFloatTableRow调用后

事件处理函数

参数

类型

备注

sheetIndex

number

sheet下标

areaName

string

浮动表区域名称(编码)

startRow

Number

插入位置行索引

insertNumber

Number

插入行数(整数)

返回:无

Copy
const { deepTableApi } = params;

deepTableApi.bindEvent('afterFloatTableInsertRow', (evt) => {
	const {sheetIndex,areaName,startRow,insertRowNum} = evt;
})

用于区域跳转时,目标元素为自定义js时使用,入参会给出点击单元格所对应的模型,维度,值等信息,最终接收一个跳转目标的URL字符串

Copy
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

Copy
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,
  }
}

计算流

Copy
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函数。

  1. 找到运维,将js文件放到服务器指定位置

  2. 在需要使用的地方引用

自定义传入打印范围和方向

Copy
/*
 * @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提供

回到顶部

咨询热线

400-821-9199

我们使用 ChatGPT,基于文档中心的内容以及对话上下文回答您的问题。

ctrl+Enter to send