寻找最佳的Excel加载项 福州小程序开发

寻找最佳的Excel加载项 福州小程序开发

时间:2020-10-1 作者:gykj

Excel提供了方便的方法,包括易于使用的功能以及直观的按钮和菜单,用于执行简单的计算。但是,仅凭它很难完成复杂的计算和某些特殊的计算。因此,它提供了外接程序接口,通过该接口可以连接外部应用程序,以使用其语言或脚本来帮助Excel处理这些计算。

现在,我将研究几个常见的Excel加载项并评估其计算能力。

Excel DNA 福州小程序开发

Excel DNA是最早的Excel加载项之一,可让您使用C#,F#,VB.net等为Excel创建动态库功能。

首先,您需要编写一个用户定义的函数。下面是一个用C#编写的示例,该示例在Excel DNA的官方网站上列出。MyFunction是用户定义函数的名称。

使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Text;
使用System.Threading.Tasks;
使用ExcelDna.Integration; 命名空间MyLibrary
{
    公共课Class1
    {
        ExcelFunction(Description =“很少有人用这种方式!”)]
        公共静态字符串MyFunction(字符串名称)
        {
        返回“ Bonjour” +名称;
       }
    }
}

需要将代码编译为要在Excel中使用的动态库。

然后,配置用户定义的功能和外接程序之间的关系。以下DnaSample.dna文件配置加载项的名称(“我的名称”)和相应的动态库Mylibrary.dll,其中包括多个用户定义的功能。

<DnaLibrary Name =“我的名字” RuntimeVersion =“ v4.0”>
<ExternalLibrary Path =“ Mylibrary.dll” />
</ DnaLibary>

最后,您在Excel中配置新的加载项,以便能够从单元格调用MyFunction,如下所示:

寻找最佳的Excel加载项 福州小程序开发

由于已编译的程序已准备好执行并且已紧密集成到Excel中,因此执行过程流畅,快速。因此,Excel DNA的最大优势是高流动性。

顾名思义,该加载项可以充分利用Windows DNA体系结构提供的功能,例如开发语言和工具,与Excel集成,交互式调试等。

从理论上讲,诸如C#,F#和VB.net之类的语言是通用且功能强大的。但是我注意到,他们网站上的示例程序都是关于字符串输出的。当然,这不是展示优势的好选择。那为什么呢?

因为它们的功能仅存在于纸上。

这些语言缺少用于结构化数据计算的类库。即使是最基本的计算,也需要硬编码。极其round回的代码不适合处理复杂的计算。

此外,C#,F#和VB.net是编译语言,而不是解释语言。这种类型的编程语言要求用户维护一个用于编译算法的编译环境,以防其被更改。但是,配置Windows编译环境非常复杂且难以学习。实际上,这些语言具有很高的技术门槛。这意味着Excel DNA更适合于将其用作界面的专业程序员,而不适合大多数直接将其用于桌面分析的数据分析师。

其他加载项,例如基于Java的JINX,也缺少用于结构化数据计算的类库。因此,JINX也不适用于数据计算。电子表格工具的内置加载项Excel VBA甚至在表达能力方面也没有更好的表现(这意味着它不适合计算数据)。但是由于不需要集成和编译,因此它比Excel DNA和/ JINX更具竞争力。

Excel JavaScript

外接程序需要比VBA更加方便和易于使用(至少要使其受欢迎)。因此,Microsoft在2013年发布了Excel JavaScript,这是一种旨在供加载项使用的语言,并且比VBA更方便。

Excel JavaScript与其他加载项语言具有相似的用途。关键是它是一种解释性语言,因此支持随时修改程序,然后立即执行而无需编译。这是Excel DNA之间的巨大差异。通常,解释语言的流动性较低。但是,作为内置的Excel,可以使用与电子表格工具相同的过程来执行Excel JavaScript。在实际实践中,执行是流畅且快速的,仅比Excel DNA慢。

n Excel内置加载项带来很多好处。您无需下载加载项,无需配置即可开发程序。Excel JavaScript继承了Excel的跨平台功能。可以在独立版,Web版和Mac版之间无缝迁移程序。加载项还可以访问Excel对象,包括工作簿,工作表和单元格。这大大加快了开发进度。

然而,这些优点正是VBA所具有的。那么Excel JavaScript有何独特之处?

具有强大的界面管理能力。它可以使用更简单的语法访问Excel菜单栏,按钮和弹出对话框,并在JS文件中定义加载项界面。这比VBA方便得多。

不幸的是,接口管理不是数据计算插件的关键方面。这不值得关注。

我们的重点应该是计算能力。很遗憾,JavaScript仍未配备任何结构化的计算功能。在处理复杂的计算中没有任何优势。它只是另一种基于Excel的脚本语言。

PyXLL

标准数据计算加载项应具有用于结构化计算的类库,例如PyXLL。PyXLL是基于Python的加载项。Python Pandas具有结构化的计算类库。

在实现简单算法(例如在指定区域内进行分组和聚合)时,PyXLL不需要硬编码。这是一个例子。从Excel工作表中选择一批员工记录,将它们传递给用户定义的函数groupEmp,在PyXLL中执行分组和聚合算法,然后返回结果。实现该过程的代码如下:

将熊猫作为pd导入
将numpy导入为np
从pyxll导入xl_func @xl_func(“ dataframe <index = False,columns = True>”)
def groupEmp(df):
df = df.groupby(“ deptid”)['salary']。agg([len,np.sum,np.mean])#核心代码:分组和聚合
返回df

核心代码仅占用一行。其他基本上是例行程序。该程序简洁。

当然,需要多个功能而不是单个基本功能的协作来执行复杂和特殊的计算。问题在于在PyXLL中这样做不方便。

这是标准化然后分组和聚合数据的一个示例。用户定义的函数基于Excel表格记录的单元样式(列AE),将记录按STYLE和BEDROOMS分组,并计算SQFEET列,BATHS列和PRICE列的平均值。您需要从字符串样式PRICE列的每个值中删除$并将其转换为数字样式以进行计算。

源数据:

处理后的数据存储在新的工作表中:

用于实现该算法的用户定义函数如下(仅显示核心代码):

对于范围(1,len(b))中的i:
    b [i] [4] = b [i] [4] .replace(“ $”,'')
    b [i] [4] = b [i] [4] .replace(“,”,'')对于范围(1,len(b))中的i:
    对于[1、2、3、4]中的j:
        b [i] [j] = eval(b [i] [j])data = pandas.DataFrame(b [1:],columns = b [0])
out = data.groupby(['STYLE','BEDROOMS'])。mean()
返回

仅一行用于分组,而六行用于预处理。有点复杂。

另一个示例是将一行拆分为多行。列A存储ID,列B存储相应的列表值。有一些List值,其中多个成员之间用空格隔开。用户定义的函数需要将它们按空格分隔,并将每个对应于ID。

源代码:

处理后的数据存储在新的工作表中:

用于实现该算法的用户定义函数如下:

split_dict = df.set_index('ID')。T.to_dict('list')split_list = []
对于split_dict.items()中的键,值:
    异常= value [0] .split('')
    key_array = np.tile(key,len(异常))
    split_df = pd.DataFrame(np.array([key_array,anomalies])。T,columns = ['ID','ANOMALIES'])
    split_list.append(split_df)df = pd.concat(split_list,ignore_index = True)
返回df

核心代码很复杂。PyXLL不擅长处理复杂或特殊的计算。

PyXLL还有一个问题。Excel必须调用一个外部解释器来解析Python脚本。这导致非常低的流动性和严重不良的用户体验。然而,低流动性并不是唯一的PyXLL问题。在需要外部解释器(例如XLwings,Bert和RExcel)的所有脚本加载项中,这是常见的。XLwings是另一个基于Python的加载项,因此与PyXLL具有一些优缺点。Bert和RExcel都是基于R的。R语言旨在实现科学的建模算法。它的结构化计算类库不是专业的。因此,两个加载项都比PyXLL具有较弱的计算能力和较低的流动性。

解释语言的最大优点是它们支持无需编译即可立即执行,并且易于维护和修改。

集会

esProc是专业数据计算引擎,提供Excel加载项以使用其SPL语言编写脚本。与PyXLL相似,它拥有丰富的结构化计算功能,可以轻松实现简单的算法。例如,要对指定区域中的记录进行分组和聚合,您只需要以下脚本(groupEmp.dfx):

核心代码是A2。简明扼要。然后,我们可以在Excel单元格中调用用户定义的函数。语法为= dfx(“ groupEmp”,A1:D20)。

集算器可以简单,轻松地处理其他基本算法(此处仅显示核心代码):

现在我们可以看到,评估外接程序的计算能力的标准是其处理复杂或特殊计算的能力。

与PyXLL相比,集算器在这方面具有优势。

将数据转换为标准格式,然后在集算器中进行分组比在PyXLL中更容易,更简单:

在集算器中将一行拆分为多行非常简单:

一个更复杂的示例是计算分期付款。Excel工作表记录贷款信息,包括负荷ID,金额,期限(按月),年利率:

用户定义的功能需要获取每个条款的详细数据,包括应付金额,利息,本金和本金余额。新工作表中的预期结果如下:

在集算器中完成此操作相当方便:

尽管具有强大的计算能力,但集算器还是一个外接程序,其执行取决于外部解释器JVM。因此不流动问题仍然存在。

通过剪贴板集算器

有没有办法既保留计算能力又平稳地运行应用程序?

  • 集算器通过用剪贴板替换用户定义的功能成功实现了这一目标!

例如,要找到每个科目的分数排在前三名的学生。A列包含学生姓名,BD列分别包含数学,英语和物理分数。现在,我们想找到合格的学生,将他们添加到大学分数中。

源数据:

选择有效的单元格,通过ctrl + C将其复制到剪贴板,然后执行以下esProc脚本:

执行上述脚本后,只需选择单元格B11并按ctrl + V,然后将剪贴板中的数据复制到B11-D13中。所得到的结果与用户定义的函数相同,如下所示:

使用esProc,除某些情况(例如在计算中涉及多个区域)外,您始终可以使用剪贴板而不是编写用户定义的函数。

通过剪贴板,您可以拥有流畅的计算过程和强大的计算能力,而无需复杂的外接程序部署。对于数据分析师来说,这确实很方便。

从理论上讲,包括PyXLL在内的所有外接程序只有在将来的版本中能够提供相应的功能(从剪贴板中获取数据并将其转换为Excel中的结构化数据)时,才能通过剪贴板解决流动性问题。

简而言之,流畅的加载项具有较弱的计算能力,而具有强大的计算能力的加载项却并非如此。esProc具有可以弥补流动性限制的剪贴板方法,是数据分析人员的合适外接程序。

版权所有:https://www.eraycloud.com 转载请注明出处