脚本使用手册 - 函数
函数
下面是支持的函数列表
LENGTH
功能:返回集合(Collection)的元素数量
适用场景:获取数组、列表、集合等容器对象的元素个数,用于循环控制、数据统计等
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Collection | Object | 否 | 空列表 [] | 要计算元素数量的集合对象(支持 List、Set、Array 等) |
返回值
| 返回值类型 | 说明 |
|---|---|
Integer | 返回集合中的元素数量(不存在时返回 0) |
使用示例
w:set (arr = [1, 2, 3, 4, 5])
w:set (count = LENGTH(arr))
w:log("INFO", "数组长度: {}", count) // 输出: 5GET
功能:返回集合(Collection)中指定索引位置的元素
适用场景:从数组、列表等集合中按索引获取特定元素,支持索引越界时返回默认值
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Collection | Object | 是 | - | 要获取元素的集合对象(支持 List、Set、Array 等) |
Index | Integer | 是 | - | 要获取的元素索引(从 0 开始) |
ValueIfOut | Object | 否 | null | 索引超出范围时返回的默认值 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回集合中指定索引的元素,索引越界时返回 ValueIfOut |
使用示例
w:set (arr = ["Apple", "Banana", "Orange"])
w:set (first = GET(arr, 0))
w:set (second = GET(arr, 1))
w:log("INFO", "第一个: {}, 第二个: {}", first, second)XML_OPEN
从XML文件实例化
w:xml_open (file_name)从XML内容实例化
w:xml_open (content, "CONTENTS")XML_FETCH
XML_ENCODE
XML_DECODE
XPATH
XML的XPATH解析
<Return> = XPATH(<XmlNode>, <XPath>, <ReturnType>, <Candidate>, <DefaultValue>)
| 名称 | 类型 | 位置 | 是否必须 | 默认值 | 描述 | |
|---|---|---|---|---|---|---|
| 参数 | XmlNode | XML Object | 0 | 必须 | 无 | XML 对象 |
| 参数 | XPath | String | 1 | 必须 | 无 | XPath表达式 |
| 参数 | ReturnType | String | 2 | 可选 | STRING | 返回类型 可选值: NUMBER STRING, BOOLEAN NODESET NODE DECIMAL |
| 参数 | Candidate | String | 3 | 可选 | 无 | 候选XPath值 |
| 参数 | DefaultValue | String | 4 | 可选 | 无 | 默认值 |
| 返回值 | 返回值 | Object | 无 | 无 | 无 | 无 |
获取单一值
w:set (po_number = xpath(xml_doc, "/WorkbookEntity/Sheets/Sheet/Cells/Cell[@loc='A2']/text()"))获取列表
w:set (TS_ITEMS = xpath($xml_doc, $TS + "/NADLoop", "NODESET"))
w:for (TS_ITEM: $TS_ITEMS)
w:end使用Type名称
w:set (quantity = xpath(xml_doc, "/WorkbookEntity/Sheets/Sheet/Cells/Cell[@loc='D" + index + "']/text()", "STRING" ))NODE_TO_XML
XML_CLOSE
XML_TO_JSON
XML_OPEN_VTD
功能:使用 VTD-XML 解析器打开 XML 文件或 XML 内容,返回 XML 上下文对象
适用场景:需要高效解析和处理 XML 文件时,支持 XPath 查询、增量读取等操作
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Source | Object | 是 | - | 指定输入的 XML 内容或 XML 文件路径,支持 String 内容、String 路径、File 对象或 Path 对象 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回 VTD-XML 上下文对象(XmlVTDContext),用于后续 XML 操作 |
返回值对象属性
| 属性名 | 类型 | 说明 |
|---|---|---|
_parser | VTDGen | VTD-XML 解析器对象 |
_navigator | VTDNav | VTD-XML 导航器对象 |
_selector | AutoPilot | XPath 选择器对象 |
_xpath | String | 当前 XPath 表达式 |
XPATH_VTD
功能:使用 VTD-XML 解析器执行 XPath 查询,获取 XML 节点值
适用场景:从 XML 文档中提取指定路径的数据,支持默认值、候选路径和多种返回类型
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Context | Object | 是 | - | XML-VTD 上下文对象(由 XML_OPEN_VTD 返回)或 DOM Node 对象 |
XPath | String | 是 | - | 要计算的 XPath 表达式 |
ReturnType | String | 否 | STRING | 指定返回类型:STRING、LONG、NUMBER、DECIMAL、BOOLEAN |
Candidate | String | 否 | null | 候选 XPath 表达式(当主 XPath 不存在或为空时使用) |
DefaultValue | Object | 否 | null | 当 XPath 不存在或值为空时返回的默认值 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回 XPath 查询结果,类型由 ReturnType 参数决定 |
返回类型映射
| ReturnType | 返回类型 | 说明 |
|---|---|---|
STRING | String | 返回字符串(默认) |
LONG | Long | 返回长整型(整数) |
NUMBER | Double | 返回双精度浮点数 |
DECIMAL | BigDecimal | 返回高精度小数 |
BOOLEAN | Boolean | 返回布尔值 |
XPATH_VTD_MOVE
功能:将 VTD-XML 游标移动到 XPath 指定的节点位置
适用场景:需要在 XML 文档中定位到特定节点,为后续的节点遍历、读取或更新操作做准备
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Context | Object | 是 | - | XML-VTD 上下文对象(由 XML_OPEN_VTD 返回) |
XPath | String | 是 | - | 要定位的 XPath 表达式 |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 移动成功返回 true,否则返回 false |
XML_CLOSE_VTD
功能:关闭 VTD-XML 上下文对象并释放相关资源
适用场景:在完成 XML 文档操作后,调用此方法释放 VTD-XML 解析器占用的内存资源,避免内存泄漏
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
XmlVTD | Object | 是 | - | 需要关闭的 XML-VTD 上下文对象(由 XML_OPEN_VTD 返回) |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 关闭成功返回 true |
JSON_OPEN
JSON_FETCH
JSON_ENCODE
JSON_DECODE
JSON_PATH
JSON的XPATH解析
<Return> = JSON_PATH(<JSONNode>, <XPath>, <ReturnType>, <Candidate>, <DefaultValue>)
| 名称 | 类型 | 位置 | 是否必须 | 默认值 | 描述 | |
|---|---|---|---|---|---|---|
| 参数 | JSONNode | Object | 0 | 必须 | 无 | JSON 对象 |
| 参数 | XPath | String | 1 | 必须 | 无 | XPath表达式 |
| 参数 | ReturnType | String | 2 | 可选 | STRING | 返回类型 可选值: NUMBER STRING, BOOLEAN NODESET NODE DECIMAL |
| 参数 | Candidate | String | 3 | 可选 | 无 | 候选XPath值 |
| 参数 | DefaultValue | String | 4 | 可选 | 无 | 默认值 |
| 返回值 | 返回值 | Object | 无 | 无 | 无 | 无 |
JSON_IS_ARRAY
NODE_TO_JSON
JSON_CLOSE
JSON_TO_XML
JSON_CHECK
CSV_OPEN
CSV_NEXT
CSV_CLOSE
CSV_READ
DB_LOAD
功能:加载外部JDBC驱动JAR文件 适用场景:需要动态加载数据库驱动JAR文件的场景
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
JDBCJar | String | 是 | - | JDBC驱动JAR文件路径 |
DriverClass | String | 否 | null | JDBC驱动类全名 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回加载的JDBC驱动对象 |
使用示例
// 示例1:加载外部的MySQL JDBC默认的驱动类(假设用户已经把jar文件上传到EDI_APP_DATA目录下)
w:expr (DB_LOAD((String)EDI_APP_DATA + "mysql-connector-java-8.0.28.jar"))
// 示例2:加载外部的Oracle JDBC指定的驱动类(假设用户已经把jar文件上传到EDI_APP_DATA目录下)
w:expr (DB_LOAD((String)EDI_APP_DATA + "lib/ojdbc10.jar", "oracle.jdbc.driver.OracleDriver"))注意事项
- 加载驱动:函数已提前加载PostgreSQL, SQLServer和SQLite JDBC驱动,无须使用此方法来加载它们。
- 加载驱动类:驱动类可以不指定, 函数会自动地从指定的JDBC-jar中检索。
DB_CONN
功能:打开数据库连接,返回可操作的数据库连接对象。
适用场景:需要通过JDBC连接数据库的场景(如PostgreSQL, SQLServer, MySQL、Oracle等关系型数据库)。
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ConnUrl | String | 是 | - | JDBC连接URL(如:jdbc:mysql://localhost:3306/db)。 |
User | String | 否 | null | 数据库用户名。 |
Password | String | 否 | null | 数据库密码。 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回已建立的数据库连接对象,可直接用于执行SQL操作。 |
使用示例
// 示例1:连接PostgreSQL数据库(无须提前加载驱动)
w:set (conn = DB_CONN("jdbc:postgresql://localhost:5432/mydb", "myUsername", "myPassword"))
...
w:expr (DB_CLOSE(conn))// 示例2:连接MySQL数据库(须提前加载驱动,假设用户已经把jar文件上传到EDI_APP_DATA目录下)
w:expr (DB_LOAD((String)EDI_APP_DATA + "/lib/mysql-connector-java-8.0.28.jar"))
w:set (conn = DB_CONN("jdbc:mysql://localhost:3306/mydb", "myUsername", "myPassword"))
...
w:expr (DB_CLOSE(conn))注意事项
- 资源释放:调用方需负责关闭连接,避免资源泄漏。
DB_STMT
功能:创建数据库语句对象,用于执行SQL查询
适用场景:需要通过连接对象创建Statement或PreparedStatement时使用
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Conn | Object | 是 | - | 有效的数据库连接对象 |
SQL | String | 否 | null | 要预编译的SQL语句(不传则创建普通Statement) |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回Statement/PreparedStatement对象 |
使用示例
// 示例1:创建普通Statement
w:set (pstmt = DB_STMT(conn))
...
w:expr (DB_CLOSE(pstmt))
// 示例2:创建PreparedStatement
w:set (pstmt = DB_STMT(conn, "SELECT * FROM users WHERE id=?"))
...
w:expr (DB_CLOSE(pstmt))注意事项
- 连接有效性:传入的连接对象必须处于打开状态
- SQL预编译:当提供SQL参数时会创建PreparedStatement
- 资源释放:调用方需负责关闭语句,避免资源泄漏。
DB_QUERY
功能:执行数据库查询并返回结果集
适用场景:需要通过Statement或PreparedStatement执行SQL查询并获取结果
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Stmt | Object | 是 | - | 有效的Statement/PreparedStatement对象 |
Query | String | 否 | null | 要执行的SQL语句(动态SQL时使用) |
Params | Array | 否 | null | SQL参数值数组(需与Query配合使用) |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回ResultSet结果集对象 |
使用示例
// 示例1:使用Statement执行查询
w:set (stmt = DB_STMT(conn))
w:set (rs = DB_QUERY(stmt, "SELECT * FROM users"))
...
w:expr (DB_CLOSE(rs))
// 示例2:使用PreparedStatement执行动态查询
w:set (pstmt = DB_STMT(conn, "SELECT * FROM users WHERE height > ? AND age > ?"))
w:set (rs = DB_QUERY(pstmt, null, [180, 18]))
...
w:expr (DB_CLOSE(rs))注意事项
- 参数绑定:Params数组元素顺序必须与SQL中的?占位符对应
- 资源释放:调用方需负责关闭结果集,避免资源泄漏。
DB_CLOSE
功能:关闭数据库连接、语句或结果集对象,释放资源。
适用场景:需要手动释放JDBC资源(如Connection/Statement/ResultSet)的场景。
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ObjectToClose | Object | 是 | - | 需要被释放资源的对象。 |
返回值
| 返回值类型 | 说明 |
|---|---|
Bool | 返回关闭操作结果(true=成功,false=失败)。 |
使用示例
// 示例1:关闭结果集对象
w:expr (DB_CLOSE(rs))
// 示例2:关闭语句对象
w:expr (DB_CLOSE(stmt))
// 示例3:关闭连接对象
w:expr (DB_CLOSE(conn))注意事项
- 关闭顺序:推荐关闭顺序 ResultSet → Statement → Connection
RS_OPEN
功能:打开数据库连接并执行查询,返回结果集
适用场景:需要快速建立数据库连接并获取查询结果的场景
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ConnUrl | String | 是 | - | JDBC连接URL(如:jdbc:mysql://host:port/db) |
Query | String | 是 | - | 要执行的SQL查询语句 |
Params | Array | 否 | null | SQL查询参数数组 |
User | String | 否 | null | 数据库用户名 |
Password | String | 否 | null | 数据库密码 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回包含结果集的数据库上下文对象 |
使用示例
// 示例1:查询PostgreSQL数据库
w:set (context = RS_OPEN("jdbc:postgresql://localhost:3306/mydb", "SELECT * FROM products"))
...
w:expr (RS_CLOSE(context))
// 示例2:带参数查询PostgreSQL数据库
w:set (context = RS_OPEN("jdbc:postgresql://localhost:3306/mydb", "SELECT * FROM users WHERE height > ? AND age > ?", [180, 18]))
...
w:expr (RS_CLOSE(context))
// 示例3:查询指定的MySQL数据库(须提前加载驱动,假设用户已经把jar文件上传到EDI_APP_DATA目录下)
w:expr (DB_LOAD((String)EDI_APP_DATA + "/lib/mysql-connector-java-8.0.28.jar"))
w:set (context = RS_OPEN("jdbc:mysql://localhost:3306/mydb", "SELECT * FROM users WHERE height > ? AND age > ?", [180, 18], "myUsername", "myPassword"))
...
w:expr (RS_CLOSE(context))注意事项
- 参数绑定:Params数组元素顺序必须与SQL中的?占位符对应
- 资源释放:调用方需负责关闭结果集,避免资源泄漏。
RS_NEXT
功能:移动结果集游标到下一行
适用场景:遍历数据库查询结果时使用
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ResultSetOrContext | Object | 是 | - | 结果集对象或数据库上下文对象 |
返回值
| 返回值类型 | 说明 |
|---|---|
Bool | true表示有下一行数据,false表示已到达结果集末尾 |
使用示例
// 示例1:基本用法
w:while (RS_NEXT(rs))
...
w:end
// 示例2:结合上下文对象使用
w:while (RS_NEXT(context))
...
w:end注意事项
- 资源管理:不要在已关闭的结果集上调用。
RS_FETCH
功能:提取当前行的所有列值并转换为变量 适用场景:需要将整行数据快速映射到变量名的批量数据处理
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ResultSetOrContext | Object | 是 | - | 结果集对象或数据库上下文对象 |
返回值
| 返回值类型 | 说明 |
|---|---|
Bool | true表示成功提取并存在下一行,false表示结果集结束 |
使用示例
// 示例1:列值自动转为以下划线加上列名为名字的变量,如果列被指定了别名则是下划线加上列的别名
w:while(FUNC_RS_FETCH(rs))
User Name is {{_username}}
User Age is {{_age}}
w:end注意事项
- 列名包含特殊字符:使用AS给列设置别名(如SELECT col AS my_col)
- 变量名冲突:通过列别名重命名
- 遇到特殊类型列:配合使用RS_GET来转换数据
RS_GET
功能:从数据库结果集中读取指定列的值
适用场景:需要从查询结果中提取特定列数据时使用
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
Context | Object | 是 | - | 通过DB_OPEN获取的数据库上下文对象 |
Column | Object | 是 | - | 列索引(从1开始)或列名字符串 |
DataType | String | 否 | VARCHAR | 指定返回值的JDBC数据类型 可选值: VARCHAR,BIT,BOOLEAN,TINYINT,SMALLINT,INTEGER,BIGINT,FLOAT,REAL,DOUBLE,NUMERIC,DECIMAL,CHAR,LONGVARCHAR,DATE,TIME,TIMESTAMP |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回指定列的值 |
使用示例
// 示例1:按列名获取字符串值
name = RS_GET(ctx, "username", "VARCHAR")
// 示例2:按索引获取整数值
age = RS_GET(ctx, 2, "INTEGER")
// 示例3:获取日期值(使用默认VARCHAR类型)
date = RS_GET(ctx, "create_time")注意事项
- 列指定方式:列索引从1开始;列名大小写敏感。
- 数据类型转换:类型不匹配会导致转换异常。
RS_CLOSE
功能:关闭由RS_OPEN函数返回的数据库上下文对象。
适用场景:需要手动释放数据库上下文资源的场景。
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ObjectToClose | Object | 是 | - | 需要被释放资源的对象。 |
返回值
| 返回值类型 | 说明 |
|---|---|
Bool | 返回关闭操作结果(true=成功,false=失败)。 |
使用示例
// 示例1:关闭包含结果集的数据库上下文对象
w:expr (RS_CLOSE(context))EXCEL_OPEN
功能:打开Excel文件并返回Excel上下文对象。
适用场景:需要读取或操作Excel文件时,通过此方法获取上下文,支持 xls 和 xlsx 两种格式。
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ExcelFile | Object | 是 | - | 指定输入的Excel文件,接受String路径、File对象或Path对象 |
ExcelFormat | String | 否 | xlsx | 指定Excel文件格式,接受xls或xlsx字符串值(不区分大小写) |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回Excel上下文对象(ExcelContext),包含工作簿、工作表、行等操作接口 |
使用示例
// 示例
w:try (excel_open_file = EXCEL_OPEN(${O_FILE})){
......
w:}注意事项
- 文件格式:如果不指定
ExcelFormat参数,默认按xlsx格式处理。对于 xls 文件,需明确指定格式为"xls",否则会抛出异常。 - 文件存在性:确保目标Excel文件存在且可读。
- 资源管理:调用方需负责关闭Excel上下文对象(使用
EXCEL_CLOSE方法),避免内存泄漏。ExcelContext实现了AutoCloseable接口。 - 参数类型:
ExcelFile参数支持String、File、Path三种类型,传入其他类型会抛出异常。 - 内存占用:大文件操作时注意内存使用(尤其是 xlsx 格式),建议操作完成后及时关闭上下文。
- 返回值对象生命周期:返回的上下文对象在调用
EXCEL_CLOSE后即失效,不可再使用。
EXCEL_READ
功能:从Excel文件中读取指定工作表和单元格的值
适用场景:需要读取Excel文件中特定单元格的数据时,通过Excel上下文对象和单元格定位参数获取值
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ExcelContext | Object | 是 | - | Excel上下文对象(由EXCEL_OPEN返回) |
SheetName | String | 是 | - | 工作表名称,指定从哪个Sheet读取数据 |
CellAddressOrRowNumber | Object | 是 | - | 单元格地址(如"A1")或行号(从0开始),二选一方式定位 |
ColumnNumber | Integer | 否 | 0 | 列号(从0开始),当CellAddressOrRowNumber为行号时必填 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回单元格的值,类型根据单元格内容动态决定(String/Double/Boolean/DateTime/Null) |
使用示例
w:set (TITLE = EXCEL_READ(excel_open_file, "Sheet1", "A1"))注意事项
- 上下文有效性:传入的
ExcelContext必须是有效的(未调用EXCEL_CLOSE),否则方法会抛出异常。 - 参数二选一:
CellAddressOrRowNumber支持两种传参方式:- - 传入String类型:作为单元格地址(如"A1"、"B5")。 - 传入数值类型:作为行号,此时需配合
ColumnNumber参数指定列号。 - Sheet缓存优化:同一上下文连续读取同一Sheet时,不会重复获取Sheet对象,提升性能。
- 行缓存优化:同一上下文连续读取同一行时,不会重复获取Row对象,提升性能。
- 日期处理:Excel中的日期单元格会被解析为
LocalDateTime对象,而非数值。 - 公式处理:公式单元格会自动计算公式结果并返回计算后的值。
- 空值处理:空单元格或空行返回
null,不会抛出异常。 - 列号默认值:当使用行号方式且不指定
ColumnNumber时,默认读取第0列。
EXCEL_NUM_OF_ROWS
功能:读取Excel文件中指定工作表的总行数
适用场景:需要获取Excel工作表的行数时,用于遍历数据前的边界判断或数据统计
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ExcelContext | Object | 是 | - | Excel上下文对象(由EXCEL_OPEN返回) |
SheetName | String | 是 | - | 工作表名称,指定要统计行数的Sheet |
返回值
| 返回值类型 | 说明 |
|---|---|
Integer | 返回指定Sheet的总行数(从1开始计数) |
使用示例
......
w:set (TOTAL_ROWS = EXCEL_NUM_OF_ROWS(excel_open_file, "Sheet1"))
......注意事项
- 上下文有效性:传入的
ExcelContext必须是有效的(未调用EXCEL_CLOSE),否则方法会抛出异常。 - Sheet缓存优化:同一上下文连续查询同一Sheet的行数时,不会重复获取Sheet对象,提升性能。
- 行数计算特点:POI的
getLastRowNum()返回的是最后一行有内容或曾经有内容的行的索引(从0开始),所以总行数 =lastRowNum + 1。 - 空表判断:如果工作表完全为空(
lastRowNum = -1),则返回0。 - 性能考虑:此方法只获取行数信息,不会加载所有行数据,性能开销小。
- 配合遍历使用:常用于
EXCEL_READ配合循环遍历所有行数据时的边界控制。 - 线程安全:此方法非线程安全,同一
ExcelContext不应在多线程中同时操作。
EXCEL_CLOSE
功能:关闭Excel上下文并释放相关资源
适用场景:在完成Excel文件操作后,调用此方法释放工作簿资源,避免内存泄漏
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
ExcelContext | Object | 是 | - | 需要关闭的Excel上下文对象(由EXCEL_OPEN返回) |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 关闭成功返回 true |
使用示例
w:set (result = EXCEL_CLOSE(excel_open_file))注意事项
- 资源释放:
EXCEL_CLOSE会关闭底层的工作簿(Workbook)并释放内存资源,调用后ExcelContext对象将失效 - 可重复调用:多次调用
EXCEL_CLOSE不会抛出异常(内部做了空值判断),但建议只调用一次 - 内存管理:对于大文件,及时调用
EXCEL_CLOSE可以显著降低内存占用 - 上下文失效:关闭后的上下文对象不可再传递给
EXCEL_READ等方法,否则会抛出异常
NOW
TIME_FORMAT
DATE
DATE_DIFF
DATE_FORMAT
DATETIME
DATETIME_DIFF
DATETIME_FORMAT
DATETIME_OFFSET
功能:对给定的时间戳(
TIMESTAMP)进行年、月、日、时、分、秒的偏移计算,返回偏移后的新时间戳。
适用场景:需要动态调整日期时间的场景(如计算未来/过去的某个时间点)。
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
TIMESTAMP | Object | 是 | - | 原始时间戳(需能被解析为有效日期时间)。 |
YEAR_OFFSET | Long | 否 | 0 | 年偏移量(正数=未来,负数=过去)。 |
MONTH_OFFSET | Long | 否 | 0 | 月偏移量(支持跨年计算)。 |
DAY_OFFSET | Long | 否 | 0 | 日偏移量(支持跨月计算)。 |
HOUR_OFFSET | Long | 否 | 0 | 小时偏移量(支持跨日计算)。 |
MINUTE_OFFSET | Long | 否 | 0 | 分钟偏移量(支持跨小时计算)。 |
SECOND_OFFSET | Long | 否 | 0 | 秒偏移量(支持跨分钟计算)。 |
返回值
| 返回值类型 | 说明 |
|---|---|
Object | 返回偏移后的时间戳对象,格式与输入一致。 |
使用示例
// 示例1:当前时间 + 1年2个月3天
DATETIME_OFFSET(NOW(), 1, 2, 3);
// 示例2:指定时间戳 - 5小时30分钟
DATETIME_OFFSET(NOW(), 0, 0, 0, -5, -30, 0);注意事项
- 空偏移量:如果某个偏移量参数为
0或未提供,则该维度不进行偏移。 - 边界处理:自动处理跨月、跨年等边界情况(如
MONTH_OFFSET=12会自动进位为年)。 - 输入校验:若
TIMESTAMP无法解析为有效时间,可能返回错误或null。
STRING_FORMAT
对字符串进行格式化
STRING_FORMAT(value, ...parameters)
- 对字符串前面补零
w:set (NUM = 123)
w:set (FORMATTED_NUM = STRING_FORMAT("%10s", NUM))STRING_LENGTH
STRING_INDEX_OF
STRING_SPLIT
STRING_SPLIT_WORD
STRING_SUBSTRING
STRING_TOUPPER
STRING_TOLOWER
STRING_REPLACE
STRING_TRIM
STRING_TRIM_START
STRING_TRIM_END
STRING_STRIP
STRING_DEFAULT
STRING_START_WITH
STRING_END_WITH
FILE_GETNAME
FILE_GETEXT
FILE_GETPATH
FILE_GETFOLDER
FILE_MKDIR
功能:创建文件夹(包括所有必需的父目录)
适用场景:需要在本地或远程文件系统中创建目录时,自动创建不存在的父级目录
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
FolderPath | Object | 是 | - | 要创建的文件夹路径,支持String、File、Path对象 |
User | String | 否 | null | 访问远程文件时的用户名 |
Password | String | 否 | null | 访问远程文件时的密码 |
Domain | String | 否 | null | 访问远程文件时的域 |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 创建成功返回 true |
特性说明
- 自动创建父目录:如果父目录不存在,会自动创建所有必需的父目录(类似
mkdir -p) - 已存在不报错:如果文件夹已存在,不会抛出异常,返回
true - 支持远程路径:支持 SMB、FTP 等远程文件协议
FILE_READ
功能:读取文件内容并以字符串形式返回
适用场景:需要读取文本文件(如配置、日志、XML、EDI 等)的全部内容时使用
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
FILE | Object | 是 | - | 要读取的文件,支持 String 路径、File 对象或 Path 对象 |
返回值
| 返回值类型 | 说明 |
|---|---|
String | 返回文件的全部内容(文本格式) |
使用示例
w:set (content = FILE_READ("D:/data/config.txt"))
w:log("INFO", "文件内容: {}", content)FILE_COPY
功能:复制文件或文件夹到目标路径
适用场景:需要复制单个文件或整个文件夹时,支持覆盖、递归复制、跳过已存在文件等多种选项,并支持远程文件访问认证
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
From | Object | 是 | - | 源文件路径,支持String、File、Path对象 |
To | Object | 是 | - | 目标文件路径,支持String、File、Path对象 |
Options | String | 否 | Overwrite,Recursive | 逗号分隔的复制选项,可选值:Overwrite、Recursive、SkipExisted |
User | String | 否 | null | 访问远程文件时的用户名 |
Password | String | 否 | null | 访问远程文件时的密码 |
Domain | String | 否 | null | 访问远程文件时的域 |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 复制成功返回 true |
复制选项说明
| 选项 | 说明 |
|---|---|
Overwrite | 如果目标文件已存在,覆盖它(默认启用) |
Recursive | 递归复制子目录和文件(默认启用) |
SkipExisted | 如果目标文件已存在,跳过不覆盖(优先级高于 Overwrite) |
使用示例
w:scan_path = FILE_GETPATH(${O_INPROCESS_TEMP})
w:set (result = FILE_COPY(${O_FILE},scan_path))
w:log("INFO", "复制result: {}", result)
w:set(file_list = file_scan_dir(scan_path,null,"file"))
w:set(result = "")
w: for(file : file_list) {
w:set(result = result + file_getname(file) + "|")
w:log ("INFO", "result: {}", result)
w: }注意事项
- 默认行为:如果不指定
Options参数,默认使用Overwrite,Recursive,即覆盖已存在文件并递归复制子目录 - 选项优先级:当同时指定
Overwrite和SkipExisted时,SkipExisted优先(先检查是否存在,存在则跳过) - 递归复制:复制目录时,如果不指定
Recursive选项,只会复制空目录(不包含子文件和子目录) - 远程文件支持:支持 SMB、FTP 等远程文件协议,需通过
User、Password、Domain参数提供认证信息 - 资源管理:方法内部使用 try-with-resources 自动管理文件资源,调用方无需手动关闭
- 返回值:方法始终返回
true,如果复制失败会抛出异常,因此通过异常处理来判断是否成功 - 权限要求:需要有源文件的读取权限和目标路径的写入权限
FILE_EXISTS
功能:检查文件或目录是否存在
适用场景:在执行文件操作前,先判断文件或目录是否存在,避免操作失败
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
FilePath | Object | 是 | - | 要检查的文件或文件夹路径,支持String、File、Path对象 |
User | String | 否 | null | 访问远程文件时的用户名 |
Password | String | 否 | null | 访问远程文件时的密码 |
Domain | String | 否 | null | 访问远程文件时的域 |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 文件或目录存在返回 true,否则返回 false |
FILE_MOVE
功能:移动或重命名文件/文件夹
适用场景:需要将文件或文件夹从一个位置移动到另一个位置,或在同一目录下重命名时使用。支持本地和远程文件系统
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
From | Object | 是 | - | 源文件/文件夹路径,支持String、File、Path对象 |
To | Object | 是 | - | 目标文件/文件夹路径,支持String、File、Path对象 |
Options | String | 否 | null | 逗号分隔的移动选项,可选值:Overwrite、SkipExisted |
User | String | 否 | null | 访问远程文件时的用户名 |
Password | String | 否 | null | 访问远程文件时的密码 |
Domain | String | 否 | null | 访问远程文件时的域 |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 移动成功返回 true |
FILE_RENAME
功能:重命名文件或文件夹
适用场景:需要修改文件或文件夹名称时,支持本地和远程文件系统的重命名操作
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
FilePath | Object | 是 | - | 要重命名的文件或文件夹路径,支持String、File、Path对象 |
FileName | String | 是 | - | 新的文件或文件夹名称(仅名称,不包含路径) |
User | String | 否 | null | 访问远程文件时的用户名 |
Password | String | 否 | null | 访问远程文件时的密码 |
Domain | String | 否 | null | 访问远程文件时的域 |
返回值
| 返回值类型 | 说明 |
|---|---|
Boolean | 重命名成功返回 true |
说明
FileName参数只包含新名称,不包含路径- 例如:原文件
/data/file.txt,新名称newname.txt,结果为/data/newname.txt
FILE_SCAN_DIR
扫描文件的脚本函数。支持通配符模式的目录扫描,可以通过过滤文件/文件夹类型来限制递归深度
功能:扫描目录并支持Glob模式匹配,可过滤文件/文件夹类型并限制递归深度
适用场景:需要批量查找符合特定模式的文件或目录时,支持通配符匹配、类型过滤和深度控制
参数列表
| 参数名 | 类型 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|---|
FilePath | Object | 是 | - | 根搜索路径,支持普通目录、单个文件或Glob模式(如D:/logs、D:/log*/file*.log) |
FileName | String | 否 | null | Glob表达式匹配条目名称,如*.txt、log?.csv |
FileKind | String | 否 | all | 过滤返回条目类型:all(默认)/ file(仅文件)/ dir(仅目录) |
MaxDepth | Integer | 否 | 0 | 最大子目录遍历深度,0表示仅根级别 |
User | String | 否 | null | 用户名(用于认证) |
Password | String | 否 | null | 密码(用于认证) |
Domain | String | 否 | null | 域(用于认证) |
返回值
| 返回值类型 | 说明 |
|---|---|
Array | 返回匹配的绝对路径字符串数组 |
使用示例
w:scan_path = FILE_GETPATH(${O_INPROCESS_TEMP})
w:log ("INFO", "scan_path: {}", scan_path)
w:set (files = FILE_SCAN_DIR(scan_path, null, "file"))
w:log ("INFO", "files length: {}", LENGTH(files))
w:for (file : files) {
w:log ("INFO", "file: {}", file)
w:}
w:set (dirs = FILE_SCAN_DIR(scan_path, null, "dir"))
w:log ("INFO", "dirs length: {}", LENGTH(dirs))
w:for (dir : dirs) {
w:log ("INFO", "dir: {}", dir)
w:}注意事项
- FilePath参数:支持多种输入方式:
- 普通目录路径:扫描该目录下所有条目
- 单个文件路径:返回该文件本身(如果存在)
- Glob模式路径:如
D:/log*/file*.log,会自动展开匹配
- FileName与FilePath关系:
- 当
FilePath为目录时,FileName作为子条目的Glob匹配模式 - 当
FilePath本身包含Glb模式时,FileName参数会被忽略 FileName为null时表示匹配所有条目
- 当
- FileKind过滤:
all(默认):返回文件和目录file:仅返回文件dir:仅返回目录
- MaxDepth深度控制:
0(默认):仅扫描根级别,不进入子目录1:扫描根级别和第一层子目录n:扫描到第n层子目录- 注意:深度从根目录开始计数,根目录为第0层
- 认证参数:当访问需要认证的远程文件系统(如网络共享、FTP等)时,提供
User、Password和Domain参数 - 资源管理:方法内部会自动关闭文件资源(使用try-with-resources),调用方无需手动释放
- 返回结果:返回的是绝对路径字符串数组,可用于后续文件操作(如
FILE_OPEN、FILE_READ等) - 性能考虑:大目录扫描时建议合理设置
MaxDepth,避免递归过深导致性能问题 - 通配符语法:
*:匹配任意数量的字符(包括零个)?:匹配单个字符**:匹配任意数量的目录层级(仅当FilePath为Glob模式时生效)
GEN_SSCC
GEN_LABEL
MATH_CEIL
MATH_FLOOR
MATH_ROUND
NULL
SNOWFLAKE
LOG
DEBUG
DEFINE
AS_VALUE
使用名字获取变量的值,如果变量不存在使用默认值代替.
- 输入
W:SET (a = "abc")
W:SET (b = AS_VALUE(a, "a"))
Print {{b}}输出
Print abc- 输入
W:SET (b = AS_VALUE(a, "a"))
Print {{b}}输出
Print aCONVERT
转换类型
w:set (unit_cost = CONVERT(unit_cost, "DECIMAL"))转换类型 设定Culture
w:set (unit_cost = CONVERT(unit_cost, "DECIMAL", "de_DE"))COLUMN_INDEX
VALID_TYPE
是否变量的类型和验证类型一致
<Return> = VALID_TYPE(<VALUE>, <ReturnType>)
| 名称 | 类型 | 位置 | 是否必须 | 默认值 | 描述 | |
|---|---|---|---|---|---|---|
| 参数 | VALUE | Object (JSON) | 0 | 必须 | 无 | JSON 对象 |
| 参数 | 验证类型 | String | 1 | 必须 | STRING | 验证类型 可选值: NUMBER STRING, BOOLEAN NODESET NODE DECIMAL |
| 返回值 | 返回值 | Bool | 无 | 无 | 无 | 无 |
w:set (value = 123)
// Return False
w:set (valid = VALID_TYPE(value, "STRING"))
// Return True
w:set (valid = VALID_TYPE(value, "NUMBER"))LOCK
UNLOCK
NODE_FETCH_CHILDREN_AS_VARIABLES
RS_FETCH_ROW_AS_VARIABLES
XMLPRC_AUTHENTICATION
XMLPRC_EXECUTE_KW
GEN_ID
生成序列化的ID字符串,默认会在每次调用时自增字符串,其中包含零字符 从1还是。
例如, 00001 --> 99999 --> 00001
| 名称 | 类型 | 位置 | 是否必须 | 默认值 | 描述 | |
|---|---|---|---|---|---|---|
| 参数 | PREFIX | String | 0 | 必须 | 无 | 前缀字符 |
| 参数 | LENGTH | Integer | 1 | 必须 | 无 | 字符串长度 |
| 参数 | PATTERN | String | 2 | 选填 | 无 | 日期类型的格式,例如"yyMMdd" |
| 参数 | RESET_BY_DAY | Boolean | 3 | 选填 | False | 是否按天重置开始值 |
| 返回值 | RESULT | String | 无 | 无 | 无 | 返回字符串 |
// 第一次调用 1001
w:set (id = GEN_ID("1", 3))
// 第二次调用 10002
w:set (id = GEN_ID("1", 4))
// 包含日期 125060103
w:set (id = GEN_ID("1", 9, "yyMMdd"))
// 重置日期,第二天调用 125060201
w:set (id = GEN_ID("1", 9, "yyMMdd", true))