原始链接:http://www.cnblogs.com/Charltsing/p/ExcelDnaDemo.html

ExcelDna工程演示讲课内容

1、ExcelDna是啥?
2、ExcelDna项目的价值
3、什么应用场景需要ExcelDna
4、ExcelDna支持哪些功能
5、ExcelDnaProjectDemo代码讲解

1、
ExcelDna是啥?

先说第一个问题,微软给Excel开发提供了两个接口:一个是常见的Com接口,一个是C API接口。

com接口今天就不讲了,因为大家都会。

C API接口很多人不太清楚,可以在msdn上查找资料。

C API因以下原因而得名:Excel 使用一些标准的 C 数据类型来交换数据;库函数用 C 名称修饰;数据结构为 ANSI C。在具备了适当经验的情况下,使用 C++ 可增强 XLL 项目的易管理性、可读性和稳定性。

因为众所周知,Com接口的执行效率很低。所以,对于一些要求高性能的项目来说,选择C API接口就成了唯一的选择。

微软提供了xll格式的addins,使用C API来操作excel。但是,因为xll只能用C++来开发,使用.net的菜鸟们看着非常羡慕嫉妒恨。所以,很多shim就应运而生,shim意思是给xll提供一个中间垫片,使其能够加载.net写的dll。ExcelDna就是诸多shim中最好的一个。所以,我来回答第一个问题:ExcelDna是确保xll能够加载.net库的一个loader。这么解释不太严谨,但方便各位理解。

2、ExcelDna项目的价值

下面说第二个问题:ExcelDna的价值是什么?
最主要的是几个方面:

  1. 让.net能够开发xll,从而可以调用C API。这使得程序开发的便捷性和高效性得到了完整的统一。
  2. ExcelDna封装了很多Excel提供的各种功能,这样菜鸟们可以更关注功能的实现而不是技术问题
  3. 最关键的,xll可以不使用管理员权限即可分发和部署,这是COM插件无法做到。ExcelDna的pack功能,使得插件的分发和部署变得极为容易,打包后的xll插件可以单文件下发,也能实现随意升级。
  4. 当然,ExcelDna开发出来的xll也不是没有缺点,但是和优点比起来,我还是非常赞成个人开发者使用这个项目开发Excel插件产品的。

ExcelDna的缺点:

目前存在一点bug,某些功能下如果执行了卸载xll的操作,会导致Excel崩溃,此问题暂时没法解决。

3、什么应用场景需要ExcelDna

关于ExcelDna的应用场景,我觉得几个词就可以概括:部署方便、高效执行、迅捷开发。所以,我还是推荐个人开发者搞一搞xll体会一下的。

4、ExcelDna支持哪些功能

关于ExcelDna支持哪些功能,其实大家看看ExcelDna的sample就知道了。


5、ExcelDnaProjectDemo代码讲解

 

Ribbon

加载ribbon,因为2007的ribbon和2010以后的不同,所以xml需要分别定义。具体百度。

如果需要调用com接口,使用ExcelDnaUtil.Application这个玩意,在我给的demo里面没写,因为com调用很简单,就不做demo了。

当然,如果谁有兴趣,仔细看看ExcelDnaUtil.Application的代码,你会知道在插件里面获取Excel的application对象是一件多么复杂的事情。完全不像菜鸟们写的一句getobject之类那么简单。

自定义函数(UDF):

这个图片是自定义函数的写法,也就是UDF,其中用到的attribute很多,划红线的需要注意。

需要说明的是:如果一个函数定义成public
static,那么它就会被exceldna自动定义成excel的自定义函数,你可以在插入函数里面找到它。

注意demo里面返回值的写法,excel支持的若干种返回值都在exceldna里面定义了,可以自己修改。

加载项菜单:

这个是加载项菜单的写法, 特别注意,ExcelDna给了一个默认的runTagMacro的功能,此功能可以在点击ribbon菜单的时候,执行vba或者加载项菜单的命令。

需要说明的是,demo里面很多代码其实使用的是C API接口,而在这个接口里面,传参是个特别需要注意的问题。

传递的是value还是reference,会影响后面的操作。

具体请各位自行研究,等你碰上这个问题了,自然就知道去百度解决了。

任务窗格:

这个是任务窗格,代码很简单。

CTP(任务窗格)是通过ExcelDna的CustomTaskPaneFactor. CreateCustomTaskPaney加载自定义的UserControl来实现自定义窗格的。

其它一些没有讲到的功能:

1、RTD:ExcelDna可以轻松实现此功能而无需借助RTD公式

2、创建Com server

3、ExcelAsyncUtil功能。

4、异步函数AsyncFunctions

5、Xll自动升级

几个接口:

最后说一下几个接口,原则上如果你想在xll启动和关闭的时候做什么事情,使用ExcelDna提供的这两个接口就行了。至于为什么不提供其它接口,等你用上了就知道别的都没啥用了。

这个是平时开发com addins用到的com接口

在xll开发中,尽量不要用它

原因你们用了就知道

最后,我说一下工程编译的注意事项

因为,我们最后要的是xll,不是dll,所以在编译完成之后,需要pack一下,这个可以通过bat执行

ExcelDna生成的xll需要四个文件才能运行:

1、ExcelDna.Integration.dll

2、你的dna文件,里面按照规定格式写好需要打包的dll文件

3、和dna文件同名的xll loader(就是ExcelDna默认提供的xll文件,改成和dna文件同名)

4、你编译的dll

然后运行ExcelDnaPack打包工具,将上面的四个文件打包成一个xll。

dna文件的参考写法:

关于最后这个ExplicitExports参数,我这里不讲,你们课后可以自己测试加上它和去掉它对插件的影响。

 


调试你的代码:

加上这个,然后按F5即可启动Excel,然后在Excel中open你的xll文件(打包前后的都可以)。

如果要观察xll加载项的错误,请打开上面的选项

注意:安装Visual Studio之后,打开上面的选项,启动Excel会弹出错误提示,请禁用VS安装的加载项。

结束语:

本课讲解了dna工程项目的简单构成,希望各位课后能认真看看源代码,在本代码的基础上,你可以直接开发你的xll插件,C API不会写,我们可以写COM调用嘛,虽然效率低,结果都一样,正适合只会vba的童鞋们。

本课到此结束!

课程代码下载:https://github.com/Charltsing/ExcelDnaProjectDemo

6、答疑

联系QQ 564955427

2018.3.30

ExcelDna项目完整工程演示及讲解的更多相关文章

  1. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  2. springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目

    一个简单的用户登录系统 用户有账号密码,登录ip,登录时间 打开登录页面,输入用户名密码 登录日志,可以记录登陆的时间,登陆的ip 成功登陆了的话,就更新用户的最后登入时间和ip,同时记录一条登录记录 ...

  3. springmvc 项目完整示例02 项目创建-eclipse创建动态web项目 配置文件 junit单元测试

    包结构 所需要的jar包直接拷贝到lib目录下 然后选定 build path 之后开始写项目代码 配置文件 ApplicationContext.xml <?xml version=" ...

  4. springmvc 项目完整示例03 小结

    利用spring 创建一个web项目 大致原理 利用spring的ioc 原理,例子中也就是体现在了配置文件中 设置了自动扫描注解 配置了数据库信息等 一般一个项目,主要有domain,dao,ser ...

  5. springmvc 项目完整示例04 整合mybatis mybatis所需要的jar包 mybatis配置文件 sql语句 mybatis应用

    百度百科: MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBat ...

  6. springmvc 项目完整示例05 日志 --log4j整合 配置 log4j属性设置 log4j 配置文件 log4j应用

    log4j 就是log for java嘛,老外都喜欢这样子,比如那个I18n  ---internationalization  不就是i和n之间有18个字母... http://logging.a ...

  7. springmvc 项目完整示例07 设置配置整合springmvc springmvc所需jar包springmvc web.xml文件配置

    前面主要是后台代码,spring以及mybatis的整合 下面主要是springmvc用来处理请求转发,展现层的处理 之前所有做到的,完成了后台,业务层和持久层的开发完成了 接下来就是展现层了 有很多 ...

  8. springmvc 项目完整示例08 前台页面以及知识点总结

    至此已经基本测试成功了,我们稍作完善,让它成为一个更加完整的项目 我们现在重新规划下逻辑 两个页面 一个登录页面 一个欢迎页面 登陆页面输入账号密码,登陆成功的话,跳转登陆成功 欢迎页面 并且,更新用 ...

  9. App开发流程之创建项目和工程基本配置

    我的开发环境为:Mac OS X EI Capitan(10.11.6),Xcode 7.3.1 首先说明一下这个项目的初衷,我并非要创建一个完整的上架应用,旨在创建一个可运行的,通用配置.架构,提供 ...

随机推荐

  1. RESTful杂记

    在网上找了许久的关于REST的资料,发现网上大部分都是说的比较片面,虽然有部分说出了本质,但也没有详细提出,所以在这里记录一下. RESTful是什么 首先,维基百科是这样说的: 表现层状态转换(RE ...

  2. [转]layui点击左侧导航栏,实现不刷新整个页面,只刷新局部

    本文转自:https://blog.csdn.net/s31415926_004/article/details/84256587 其实这篇文章是给自己看的,以后忘记怎么做回来还能看一下哈哈哈哈哈哈哈 ...

  3. 重写(override)和重载(overload)的区别

    override(重写): 是进行基类中函数的重写,是面向对象的概念 重载(overload):是方法的名称相同,参数或参数类型不同,进行多次重载以适应不同的需要.overload 是面向对象的概念.

  4. Java开发笔记(十八)上下求索的while循环

    循环是流程控制的又一重要结构,“白天-黑夜-白天-黑夜”属于时间上的循环,古人“年复一年.日复一日”的“日出而作.日落而息”便是每天周而复始的生活.计算机程序处理循环结构时,给定一段每次都要执行的代码 ...

  5. Java开发笔记(五十四)内部类和嵌套类

    通常情况下,一个Java代码文件只定义一个类,即使两个类是父类与子类的关系,也要把它们拆成两个代码文件分别定义.可是有些事物相互之间密切联系,又不同于父子类的继承关系,比如一棵树会开很多花朵,这些花儿 ...

  6. 结合JDK源码看设计模式——建造者模式

    概念: 将一个复杂对象的构建与它的表示分离.使得同样构建过程可以创建不同表示适用场景: 一个对象有很多属性的情况下 想把复杂的对象创建和使用分离 优点: 封装性好,扩展性好 详解: 工厂模式注重把这个 ...

  7. 如何解决Dynamics 365的错误:用户身份验证无效,MSIS0006

    关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复246或者20170312可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...

  8. Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境

    好记性不如烂笔头! 一.简介 一直以来,微软只对自家平台提供.NET支持,这样等于让这个“理论上”可以跨平台的框架在Linux和macOS上的支持只能由第三方项目提供(比如Mono .NET).直到微 ...

  9. Android 解析标准的点击第三方文件管理器中的视频的intent

    解析标准的第三方视频intent private List<String> mCurPlayList = new ArrayList<String>(); private in ...

  10. Android 网络框架 OKHttp3

    概述 OKHttp是一个处理网络请求的框架,其优点有,支持http2,对一台机器的所有请求共享同一个socket. 内置连接池,支持连接复用,减少延迟.通过缓存避免重复的请求,请求失败时自动重试主机的 ...