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

Asp.net 使用Excel作为.NET代码的模板,asp.net,.net,multithreading,excel,openxml,Asp.net,.net,Multithreading,Excel,Openxml,我目前正处于一个应用程序的设计阶段,该应用程序目前正在Excel中运行。它是一个包含复杂数学(三角代数等)公式的科学应用。起初,我尝试用代码完成所有工作,但很快发现将这些科学公式翻译成.NET将非常乏味(很有可能出现bug) 另一种选择是使用Excel电子表格及其单元格公式的“模板”,在该模板中,.NET中的用户界面允许用户输入数据,.NET(web应用程序)将此输入数据传递给Excel电子表格,Excel电子表格完成工作并给出结果,.NET应用程序读取并显示给用户。(这是对拟议设计的简化解释)

我目前正处于一个应用程序的设计阶段,该应用程序目前正在Excel中运行。它是一个包含复杂数学(三角代数等)公式的科学应用。起初,我尝试用代码完成所有工作,但很快发现将这些科学公式翻译成.NET将非常乏味(很有可能出现bug)

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

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

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

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


谢谢,

尽管坚持原来的计划可能会很乏味,但它仍然是比读/写excel电子表格更好的解决方案

我相信,如果你仔细研究,你会找到将excel电子表格中的公式复制到.Net应用程序的解决方案,此外,你还可以将其视为学习曲线

你曾经遇到过吗

如果您打算坚持使用电子表格,这可能会对您有所帮助,但将SQL数据库与.Net应用程序结合使用是一个更健壮的系统,可以解决多个用户试图访问您的数据时出现的任何问题。您也可以使用实体框架或NHibernate


Excel不是为多个用户同时访问而设计的,我认为最终会出现很多问题

就我个人而言,我并不认为这是一个坏主意——我开发了一个应用程序,它可以生成几百个电子表格(基于不同用户的一些模板),我使用ActiveMQ和Spring.Net服务总线使其速度足够快——通常3分钟就可以生成200多个电子表格:

我有大约5台运行excel as service的专用服务器,前端应用程序只发送请求,不执行电子表格创建/写入/读取过程

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

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

那只是我的经验。忘了提到,我使用了Office Interop而不是OpenXML,现在我正在考虑采用OpenXML

----编辑------------- 避免使用多个实例的另一个选项是使用单线程单实例,这是一个快速示例(在vb.Net中):

singleton plus SyncLock将确保您只有一个excel实例,并且相信它对于您的案例来说足够快-它只从excel工作表读取/写入,excel实例将在服务器上保持活动状态

它的好处是,您可以轻松地用任何其他方法代替excel计算,例如,您自己的实现


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

如果您在then server上自动化excel,可能会出现很多问题,那么每次网页发送请求时,您只需启动应用程序的新实例并在该应用程序实例中打开工作簿副本即可。对于合理数量的用户来说应该是可以的-取决于硬件和图纸的大小


Ross

不要在web环境中使用excel,出现错误的概率为110%…使用OpenXML将避免在服务器上安装excel。但是,OpenXML只允许您修改Excel文件。要执行计算,您必须在Excel中打开文件,在web应用程序中这样做可能会涉及黑客和挫折。@MartinLiversage我认为对于计算部分,我可以这样做。。。谢谢@Derek,有人知道任何可以将数学公式(例如从word)或Excel公式转换为.NET/XML的库吗?谢谢@Rex,你是说在一台web服务器上无法处理超过5份Excel副本吗?我的服务服务器是winXP pro。但我认为您不需要那么多实例,是吗?另一种选择是使用单实例和单线程,并在您的服务器上永久保留一个excel实例。我在vb.net中做了一个快速示例,请参阅我文章的编辑部分。如果你需要的话,我可以用C版本,只要给我你的电子邮件地址就行了。。。。每个web会话打开一个excel实例(副本),完成工作,关闭并删除excel文件。我想你会遇到很多挫折。。。您无法控制有多少并发会话,尽管它可能适用于您的开发环境,因为您可能一次有一个或两个会话
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