.NET实现Office Excel自定义公式 广泛应用于报表与数据分析

在管理软件开发的功能点中,有相当一部分功能是与Excel做数据交互,产生Excel 数据报表。如果Excel报表的数据计算方法很有规律可循,则可以通过自定义公式来解决。比如常见的资产负债表,利润表,取数都非常有规律。

Excel DNA是一套用.NET框架实现的Excel自定义公式引擎,互联网上有很多Excel财务方面的报表是基于此技术实现。Excel DNA完全开放源代码,可到网上下载它的完整源代码和例子工程,地址是https://exceldna.codeplex.com 

 

开发自定义公式

1 创建用户自定义公式(Visual Basic)

用记事本创建一个Test.dna的文本文件,参考下面的代码例子,实现一个简单的加法公式。

  <DnaLibrary>
    <![CDATA[
        Public Module MyFunctions

            Function AddThem(x, y)
                AddThem = x + y
            End Function

        End Module
    ]]>
    </DnaLibrary>

打开Excel,输入公式=AddThem(4,2),可以看到Excel计算后的公式结果是6。

 

2 创建自定义公式(C#)

创建一个Test.dna的文本文件,参考如下所示的例子代码,实现字符串与双精度类型数值相加的公式。

  <DnaLibrary Language="CS">
    <![CDATA[
        using ExcelDna.Integration;

                public class MyFunctions
                {
                        [ExcelFunction(Description="Joins a string to a number", Category="My functions")]
                        public static string JoinThem(string str, double val)
                        {
                                return str + val;
                        }
                }
    ]]>
    </DnaLibrary>

可以打开Excel,输入公式=JoinThem(“James”,1983),可看到实际的运算结果。

 

3  通过.NET程序集创建自定义公式

Visual Basic,C#都是.NET的一等公民,用自己熟悉的语言创建一个Class Library类库项目TestLib,参考如下的代码例子,实现两个双精度数值相加的公式。

using ExcelDna.Integration;

public class MyFunctions
{
        [ExcelFunction(Description="Multiplies two numbers", Category="Useful functions")]
        public static double MultiplyThem(double x, double y)
        {
                return x * y;
        }
}

再来创建一个Test.dna的文本文件,添加如下的文本片段,用于声明前面创建的公式。

<DnaLibrary>
    <ExternalLibrary Path="TestLib.dll" />
</DnaLibrary>

打开Excel,输入公式=MultiplyThem(2,3) 或=MultiplyThem(2; 3),看到计算结果是5。

如果.NET程序集编译成.NET 4.0,则需要稍微修改一下Test.dna的文本内容,参考下面的例子。
 <DnaLibrary RuntimeVersion="v4.0" >
      <ExternalLibrary Path="TestLib.dll" />
 </DnaLibrary>

 

部署 Deployment

拷贝一份文件ExcelDna.xll到需要的目录中,重命名为需要的名字,比如上面的Test.xll,将上面的Test.dna文件也放到同一个文件中。双击xll文件会打开Excel程序,

提示安全声明,选为本会话启用此加载项。

然后就可以使用自定义的公式,打开或新建一个Excel文件,输入公式,回车后执行公式。

TestClassLibrary程序集中自定义公式的方法的源代码。要编译必须引用程序集ExcelDna.Integration.dll。

[ExcelFunction(Description="My first Excel-DNA function")]
public static string MyFirstFunction(string name)
{
    return ("Hello " + name);
}

Test.dna文件的内容如下,只是简单的声明上面的程序集中的方法。

<DnaLibrary Name="First Add-In" RuntimeVersion="v4.0">
  <ExternalLibrary Path="TestClassLibrary.dll" />
</DnaLibrary>

 

打包 Packing

注意在部署时,必须同时存在dna文件和xll文件,而且这两个文件的名字要完全相同。Excel DNA支持将这两个文件合并打包在一个文件中。

运行程序ExcelDna\Distribution\ExcelDnaPack.exe,并传入参数Test.dna。如下的命令所示例的:

ExcelDnaPack.exe, Test.dna

执行完成之后,会生成一个Test-packed.xll文件,这个文件可以拷贝到其它电脑中直接执行。Test-packed.xll中已经包含Test.dna和TestLibrary.dll文件,运行时会主动被加载。

 

抛开复杂的Visual Studio Tools for Office, 凭借这几天简单的例子,我想读者应该可以快速的上手,高效率的创作Excel中的自定义公式。

 

界面(Ribbon,Panel)与COM服务器支持

Excel DNA支持创建一个自定义的面板,添加一个WinForms自定义控件,继承于System.Windows.Forms.UserControl,再添加下面的码调用即可。

CustomTaskPane myCTP = CustomTaskPaneFactory.CreateCustomTaskPane(typeof(MyUserControl), myTitle

更多内容可参考下载的源代码包,有详细的例子和说明文档。

时间: 2024-10-25 05:59:28

.NET实现Office Excel自定义公式 广泛应用于报表与数据分析的相关文章

VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式

原文:VSTO 学习笔记(十一)开发Excel 2010 64位自定义公式 Excel包含很多公式,如数学.日期.文本.逻辑等公式,非常方便,可以灵活快捷的对数据进行处理,达到我们想要的效果.Excel的内置公式虽然强大,但是在ERP等系统中,往往需要进行很多业务上的计算,如收发存台账.指定年.月.部门的消耗查询等,都是需要从数据库中查询的,且和业务紧密相连.这时仅仅依靠Excel的内置公式就不够了,需要添加自定义的公式来进行这些业务计算. 测试代码下载 本系列所有测试代码均在Visual St

Microsoft Office Excel 不能访问文件

Microsoft Office Excel 不能访问文件“QUOTE5.xls”. 可能的原因有: 1 文件名称或路径不存在.2 文件正被其他程序使用.3 您正要保存的工作簿与当前打开的工作簿同名. 说明: 执行当前 Web 请求期间,出现未处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息. 异常详细信息: System.Runtime.InteropServices.COMException: Microsoft Office Excel 不能访问文件“D:

Microsoft Office Excel 不能访问文件及COM无法访问

Microsoft Office Excel 不能访问文件及COM无法访问 Microsoft Office Excel 不能访问文件“*.xls”. 可能的原因有: 1 文件名称或路径不存在. 2 文件正被其他程序使用. 3 您正要保存的工作簿与当前打开的工作簿同名. 莫名的错误,在本机调试一切正常,可是一旦部署到服务器,就无法访问了…… 查了些资料,看到大家都碰到这个问题 解决方案 即在C:\Windows\System32\config\systemprofile和C:\Windows\S

Excel 自定义函数

Excel自定义函数编写有3种方法: 1.VBA种编写:直接编写 2.自定义函数编写到XLL中:如果您熟悉C++,可以将自定义函数编写到XLL中,不熟悉也可以使用ExcelDNA这个开源的库使用.NET技术也可以将您的代码编译为XLL 3.将类库注册成Com组件也可在Excel中调用:如果熟悉.NET,使用C#编写自定义函数类库,然后将类库注册成Com组件也可在Excel中调用

金山WPS、微软Office EXCEL表格通用C++接口

金山WPS.微软Office EXCEL表格通用C++接口 之前有个小项目在win32框架下,有个导出报表的小需求excel,小小的整理了下几个接口.最近闲着了解了下VAB宏,扩展了几个实用接口,适用于金山wps办公软件,至于微软的excel版本是否能够忽略,这个还真没试过,理论上某些接口是可以的(只要VAB宏没变,这些信息是从一些专业的VAB群中得来,感谢群里的兄弟支持).源码往下拉,供学习交流之用.后边有时间再做word的. 描述: 对Excel常用操作封装类,适用于Microexcel.W

C# Office Excel

读取Excel文件 // 读取Excel返回DataTable (简略版 不能读取合并格) // 如果文件第一行是数据不是说明 // 请插入一行 内容随便填 不能为空 public DataTable GetTableFromExcell(string commandText) { // 连接字符串 (不明白的,请查找 App.config 配置数据库连接字符串) string connectionString = System.Configuration.ConfigurationSettin

POI生成EXCEL,公式不自动执行的有关问题

POI生成EXCEL,公式不自动执行的问题 场景:POI读取Excel模板. 当使用POI操作Excel时,发现由POI生成的公式能够在打开Excel是被执行, 而事先手工写入Excel模板文件的公式则不自动被调用,必须手动双击该Cell才能生效. 采取的办法: 1.使用cell.setCellFormula方法重新在制定Cell里写入公式. 2.使用sheet.setForceFormulaRecalculation(true);方法强制让改Sheet执行公式. 当然,在方法2能够生效的情况下

10个财务工作中常用的 Excel 万能公式

1.多条件判断公式 =IF(AND(条件1,条件2...条件n),同时满足条件返回的值,不满足条件返回的值) =IF(OR(条件1,条件2...条件n),同时满足任一条件返回的值,不满足条件返回的值) 示例:同时满足金额小于500且B列内容为“未到期"时在C列输入”补款“ =IF(AND(A2<500,B2="未到期"),"补款","") 2.多条件求和.计数公式 Sumproduct(条件1*条件2*条件3...数据区域) 示例

VBS 移除excel数据公式,只保留值

如果将excel数据公式移除,只保留计算之后的值,将大大减少excel文件. 因为有上篇移除excel外部数据链接的经验,进行excel数据公式移除将快的多,方法如下. 首先我们得明白怎么手动移除excel的格式. 选中要处理的数据,然后右击 copy, 再右击paste Special,然后出现如下图的提示框.选中 Values. 此时要处理的数据将只以值呈现,格已去掉. 然后通过宏录制,来查看用的什么函数,发现VBA用PasteSpecial来处理. 接下来在搜索VBA函数. 内容如下: 应