ExcelDNA创建UDF溢出函数

ExcelDNA是什么

        ExcelDna是一个很强大的Excel第三方库,实现了通过C#为Excel开发XLL的目的,简洁方便。

ExcelDNA中的自定义函数

        通过ExcelDNA,用户可以方便的为Excel扩展自定义函数。官方教程中已经详细介绍了如何创建单值函数,现在介绍如何创建溢出函数,即返回值有多个的函数。

代码实例如下所示:

        #region 公式-文本提取-溢出函数
        [ExcelFunction(ExplicitRegistration = true, Category = "文本提取", Description = "通过正则表达式提取文本内容-支持溢出函数")]
        public static object TQQ(
            [ExcelArgument(Name = "Text", Description = "待提取的原始文本")] string text,
            [ExcelArgument(Name = "Pattern", Description = "正则表达式")] string pattern)
        {
            // 如果输入的文本或正则表达式为空,则返回空字符串
            if (string.IsNullOrWhiteSpace(text) || string.IsNullOrWhiteSpace(pattern))
            {
                return string.Empty;
            }

            // 使用正则表达式匹配文本中的模式
            var matches = Regex.Matches(text, pattern);

            // 使用 LINQ 过滤匹配结果,提取组1的值(如果存在),否则提取整个匹配项
            var results = matches
                .Cast<Match>()                           // 将 MatchCollection 转换为可查询的集合
                .Where(match => match.Success)           // 仅处理成功匹配的项
                .Select(match => match.Groups.Count > 1 ? match.Groups[1].Value : match.Value) // 提取组1的值或整个匹配
                .ToArray();                              // 转换为数组

            // 如果找到匹配项,返回匹配结果数组;否则返回空字符串
            return results.Length > 0 ? results : string.Empty;
        }
        #endregion

此代码所演示的自定义函数的所用是通过正则表达式的方式从单元格中提取特定文本,如果有多个值,则以一维数组的方式返回,在Excel中以单行的方式表示。

如果需要在Excel中以列的方式显示,则需要创建为二维数组

可以封装扩展方法把一维数组转为二维数组

/// <summary>
/// 将一维数组转为二维数组 (N行1列)
/// </summary>
/// <param name="array">一维数组</param>
/// <returns>转换后的二维数组</returns>
public static object[,] Convert1DArrayTo2D(this object[] array)
{
    // 如果数组为空,返回空的二维数组
    if (array == null || array.Length == 0)
    {
        return new object[0, 0];
    }

    // 创建一个二维数组,行数为一维数组的长度,列数为1
    var result = new object[array.Length, 1];

    // 将一维数组的每个元素赋值到二维数组的每一行第一列
    for (int i = 0; i < array.Length; i++)
    {
        result[i, 0] = array[i];
    }

    return result;
}

调用方式:

// 如果找到匹配项,返回匹配结果数组;否则返回空字符串
return results.Length > 0 ? results.To2DArray() : string.Empty;

结果如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CNET99

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值