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

时间:2013-10-25 07:23:50

标签: asp.net .net multithreading excel openxml

我目前正处于目前在Excel中运行的应用程序的设计阶段。它是一个科学的应用程序,包含复杂的数学(三角代数等)公式。最初我尝试用代码完成所有工作,并很快发现将这些科学公式转换成.NET会非常繁琐(很有可能出现错误)。

另一种选择是使用Excel电子表格及其单元格公式的“模板”,其中.NET中的用户界面允许用户输入数据,.NET(Web应用程序)将此输入数据传递给Excel电子表格, excel电子表格完成工作并提供结果,.NET应用程序读取此内容并向用户显示。 (这是对拟议设计的简化说明)。

它将成为Web应用程序(不是面向公众的站点)。

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

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

谢谢,

3 个答案:

答案 0 :(得分:2)

我个人认为这不是一个坏主意 - 我做了一个应用程序,它生成了几百个电子表格(基于一些不同用户的模板),我使用ActiveMQ和Spring.Net服务总线使其更快足够 - 通常3分钟,以生成超过200个电子表格:

我有大约5个运行excel作为服务的专用服务器,而前端应用程序只发送请求而不进行电子表格创建/写入/读取过程。

我遇到的唯一问题是一个excel服务一次无法处理超过10张,否则它会以某种方式崩溃(即使现在也无法找出原因......)。

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

这只是我的经历。忘了提一下,我使用的是Office Interop而不是OpenXML,现在我正在考虑调整OpenXML。

----编辑------------- 避免使用多个实例的另一个选择是使用单线程单实例,一个快速示例(在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

singleton plus SyncLock将确保您拥有一个excel的单个实例,并且相信它对您的情况来说足够快 - 它只能从excel表读取/写入,并且excel实例将保留在服务器上。

它的好处是您可以使用任何其他方式轻松替换Excel计算,例如,您自己的实现。

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

答案 1 :(得分:0)

虽然坚持原来的计划可能会很乏味,但它仍然比读取/写入Excel电子表格更好。

我敢肯定,如果你看起来足够努力,你会找到将excel电子表格中的公式复制到.Net应用程序中的解决方案,此外你还可以将其视为学习曲线。

您是否遇到过http://linqtocsv.codeplex.com/

如果您打算坚持使用电子表格,这可能会对您有所帮助,但使用带有.Net应用程序的SQL数据库是一个更强大的系统,可以解决多个用户试图访问您的数据的任何问题。您也可以使用Entity Framework或NHibernate。

Excel并非设计用于同时访问它的多个用户,我认为你最终会遇到很多问题。

答案 2 :(得分:0)

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

罗斯