使用Excel作为.NET代码的模板

我目前正在devise阶段的一个应用程序,目前在Excel中运行。 它是一个包含复杂的math(三元代数等)公式的科学应用程序。 最初我试图用代码做所有的事情,很快就发现将这些科学公式转换成.NET的过程非常繁琐(很有可能出现错误)。

另一种select是使用Excel电子表格及其单元格公式的“模板”,其中.NET中的用户界面允许用户input数据,.NET(Web应用程序)将此input数据传递给Excel电子表格,Excel电子表格工作并给出结果,.NET应用程序读取并显示给用户。 (这是对build议devise的简单解释)。

它将成为Web应用程序(不公开面向网站)。

其中一个问题(即我的)将是当多个用户使用该应用程序时,Excel文件将有多个线程读/写的问题。 克服这个我有关于存储在SQL数据库中的文件的副本,每个会话复制到临时文件夹与Guid名称(使其唯一),一旦它完成删除文件等

我的问题是,有没有人看到这个计划中的任何缺陷或缺点,例如性能,读/写excel等,或者我需要考虑的其他事情? 我打算使用OpenXML和ClosedXML库。 我是否需要在部署服务器上安装Office以使其工作? (我想不会)。

谢谢,

就个人而言,我并不认为这是一个坏主意 – 我做了一个应用程序生成几百个电子表格(基于几个不同用户的模板),我使用ActiveMQ和Spring.Net服务总线来使其速度更快 – 一般来说3分钟生成200多个电子表格:

我有大约5个专用服务器运行Excel作为服务和前端应用程序只发送请求,不做电子表格创build/写/读过程。

我唯一的问题是一个Excel服务不能处理超过10张,否则会崩溃(即使现在不知道为什么…)。

在谈论安全性和审计时,将请求(可能是客户端input/电子表格实例)存储到数据库中也是一个好主意。

这只是我的经验。 忘了提及,我使用Office Interop而不是OpenXML,现在我正在考虑适应OpenXML。

—-编辑————-避免使用多个实例的另一个select是使用单线程单实例,一个简单的例子(在VB.NET):

Public Class MyCalculator Public Class ParamSet Property Param1 As Double Property Param2 As Long ' etc. & etc. End Class Public Class ResultSet Property Output1 As Double Property Output2 As Long ' etc. & etc. End Class Private Shared _instance As MyCalculator Public Shared Function Calculate(params As ParamSet) As ResultSet SyncLock _instance Return _instance.DoWork(params) End SyncLock End Function Shared Sub New() _instance = New MyCalculator() End Sub Private Sub New() ' Start up excel instance ' Set UserControl = true - to make sure it won't be killed by the system automatically ' Hold the excel instance in a local variable End Sub Private Function DoWork(params As ParamSet) As ResultSet ' write the params to the excel sheet ' then read output you need from corresponding cell ' return it out as a result set End Function End Class 

单身人士加上SyncLock将确保你有一个单一的Excel实例,并相信这将是足够快的情况下 – 它只能从Excel表中读取和写入,并将Excel实例保存在服务器上。

它的好处是你可以很容易地用其他任何方式取代Excel计算,例如你自己的实现。

当然,缺点是显而易见的:所有的请求都将被逐个处理,因为它是单线程的。 但我相信它会很快 – 缓慢的部分(excel启动)已被取出,现在只能从表单读写。 关于从excel快速读取/写入,有大量的在线资源

虽然坚持原来的计划可能是乏味的,但它仍然是一个更好的解决scheme比excel电子表格的阅读/写作。

我相信,如果你看起来足够硬,你会find解决scheme,从您的Excel电子表格复制公式到.Net应用程序,除此之外,你也可以把它当作学习曲线。

你有没有遇到http://linqtocsv.codeplex.com/

如果您打算使用电子表格,这可能对您有利,但将.Net应用程序与.Net应用程序结合使用是一个更强大的系统,可以解决多个用户试图访问您的数据时遇到的任何问题。 你也可以使用entity framework或NHibernate。

Excel不是为同时访问多个用户而devise的,我认为你最终会遇到很多问题。

如果您在服务器上自动运行Excel,可能会出现很多问题,那么您可以启动应用程序的新实例,并在每次网页发送请求时在该应用程序实例中打开该工作簿的副本。 适当数量的用户应该可以 – 取决于硬件和工作表的大小。

罗斯