有没有办法从c#应用程序暴露自定义数据,以便Excel不能显示,但也可以修改数据?

是否有任何选项可以实现Excel可以使用的任何types的服务,用户可以通过Excel修改/添加数据,并将这些更改传回服务? 我读了一些关于OData的文章,但似乎是在Excel中单向导出,没有数据修改支持。

有几种方法可以将数据从C#暴露给Excel,以便您可以在Excel中编辑信息,并将其传递到C#世界(…以及其他方面,例如数据库服务器,完全不同的系统等)。

一种方法 – 恰好是Excel固有的function – 就是构build一个包装C#dll的RTD服务器。 您可以使用像Excel-DNA这样的工具来处理编写RTD封装的复杂性。 RTD的一个很好的function是它是非常asynchronous的,有时可以成为性能的助推器。 RTD的一个难点在于,asynchronous性是以逐个单元为基础进行pipe理的,这意味着如果单元之间以任何方式相互关联(例如一个单元包含部件号,另一个单元包含数量,另一个价格,你需要所有三个才能完成任何事情),那么你必须写一些聪明的逻辑来适应这一点。 不是不可能的,但绝对是一个痛点。 通常我们要做的是创build一个非常隐藏的工作表,其中包含RTD公式以监视不同工作表中的更改,并相应地处理更改。

另一种方法是编写所谓的UDF。 对RTD也有类似的挑战,但是你一次只能参照整个工作表而不是一个单元,所以痛苦点稍微减less一点。 UDF不是开箱即用的,但是你可以确定它们的行为是asynchronous的。 这非常重要 – 如果在UDF函数内部有长时间运行的操作,并且没有后台线程,则Excel将冻结,直到完成该函数。 这可能会导致用户认为你破坏了Excel(LOL)。 请注意,这不是RTD的问题,因为它们已经是asynchronous的了。 有几种方法可以创build一个UDF,其中一个又是Excel-DNA,但是在进入这条路线之前,应该探索一下你的select。 处理更改的实际情况类似于RTD – 创build一个非常隐藏的页面,扫描目标工作表。

还有另一种方法,那就是创build一个VSTO加载项。 这基本上将您的C#DLL整合到Excel中。 您可以创build工具栏元素,截取Excel事件 – 本质上,您可以在很低的级别上与Excel进行交互。 在Excel VBA中你可以做的任何事情,你可以用VSTO做什么,等等。 在这里处理更改是在加载项(即代码隐藏的.cs文件)中完成的,当时的世界就是你的牡蛎。 我通常会编写一个单元格更改的事件处理程序,但是您可以在任何需要的地方捕获更改。 你甚至可以推迟处理数据更改,直到用户按下保存button – 我曾经这样做,因为这是最终用户的一个非常简单的范例。

那些将是我想到的三个选项。

您可以看看Microsoft.Office.Interop.Excel命名空间。

这是一个很好的解释。

试试Excel-DNA库http://exceldna.codeplex.com/

最好避免使用Microsoft.Office.Interop库。 他们很难处理引用,他们需要在你的机器(甚至更糟糕的应用服务器等)安装办公室(在这种情况下,Excel)