使用ASP.net中的macros编辑Excel文档

是否有可能以任何方式通过包含macros的ASP.net页面编辑Excel工作表。 我试图打开Excel工作表,它似乎只是挂起而不是加载Excel。 在没有macros的页面上testing工作很好吗?

免责声明 :我不知道Excel许可协议,我不知道是否在服务器进程中利用Excel违反了它。 这纯粹是如何使其工作的技术说明。 build议读者检查许可证协议,看是否允许这样做。 不同的Office版本可能有不同的许可协议。 我在几家财富100/500公司使用这种方法,他们似乎并不在乎。 去搞清楚。

这个解决scheme有效,但是它有一些限制,需要对它运行的服务器进行相当程度的控制。 服务器还需要有大量的内存。

要开始,请确保您在服务器上执行每个Officefunction的完整安装,以便如果您尝试使用不存在的function,Excel将不会尝试安装某些function。

您还需要在具有正确权限的服务器上创build一个专用用户帐户。 我不能告诉你究竟是因为在我的情况下,我们控制了服务器,我们给了这个用户的pipe理员权限。

如果拥有用户帐户,则需要以该用户身份login并至less运行一次Excel(最好是所有Office应用程序),以便创build其设置。

创buildCOM对象时,还需要将Excelconfiguration为在此用户帐户下运行。 为此,您需要进入服务器上的DCOMconfiguration,并configurationExcel.Application对象的Launch and Activation Permissions以使用新的用户帐户。 我不确定如果我没有记错,但我认为在这一步之后,以交互式用户身份运行Excel稍微有问题。

默认情况下,Office应用程序尝试在屏幕上显示各种消息:警告,问题等。这些消息必须closures,因为当您使用来自Web应用程序的Office应用程序时,它将在服务器上运行,以免人为用户解散这些信息 – 办公室程序将无限期地放置,等待信息被解雇。

您需要设置(至less)这些属性:

 DisplayAlerts = false AskToUpdateLinks = false AlertBeforeOverwriting = false Interactive = false Visible = false FeatureInstall = 0 'msoFeatureInstallNone 

从Excel中禁用UI消息。 如果您使用Excel 2010,可能会有更多,但我不熟悉这一点。

如果您的Excel文件中包含macros,则可能需要在Excel中禁用macros安全性 – 这是无法以编程方式完成的,原因很明显。

要访问Excel服务,实现一个实际上将保存Excel引用的pipe理器对象 – 不要尝试在页面中保存Excel.Application对象,因为页面代码将变得非常复杂,并且可能无法正确清理。

保存Excel引用的对象可能是一个单独的DLL或一个进程外服务器。 但是,您必须确保在给定线程上获取Excel的实例时,您总是创build一个新的Excel实例 。 默认情况下,已经运行的Excel实例也会提供其他请求,但是这对您不起作用,因为同一个Excel实例不能在多个线程之间共享。 IIS中的每个请求处理线程都必须有自己的Excel实例 – 如果共享实例,则会遇到各种问题。 这意味着您的服务器需要有相当多的内存来运行Excel的许多实例。 这对我来说不是问题,因为我们控制着服务器。

如果可以,请尝试创build一个超出proc(.exe)的COM服务器,因为这样可以将Excel引用保存在一个单独的进程中。 使用一个进程内(.dll)COM对象可以使它工作,但是它对你的应用程序池会更危险 – 如果Excel崩溃,它也会崩溃你的应用程序池。

当你有一个.exe服务器时,你可以用几种可能的方式传递参数:

  1. 使您的pipe理器objet一个COM对象,并作为属性传递参数。
  2. 将参数作为命令行parameter passing给启动时的.exe文件。
  3. 在文本/二进制文件中传递参数; 在命令行上传递文件的名称。

我使用了所有这些,发现COM对象选项最干净。

在您的经理对象中,请遵循以下准则:

  • try..catchtry..catch每个使用Excel的函数,以捕获任何可能的exception。
  • 总是通过调用Marshal.ReleaseComObject()显式释放所有Excel对象,然后一旦不需要它们就将variables设置为null 。 总是在finally块中释放这些对象,以确保失败的Excel方法调用不会导致一个悬而未决的COM对象。
  • 如果您尝试在Excel中使用任何格式化function(页眉,边距等),则必须安装打印机,并且可以使用用户帐户访问用于运行Excel的打印机。 如果您没有有效的打印机(最好连接到服务器),格式相关的function可能无法正常工作。
  • 发生错误时,closures您正在使用的Excel实例。 您不可能从Excel相关错误中恢复,并且保留实例的时间越长,使用资源的时间越长。
  • 当您退出Excel时,请确保您防范recursion调用的代码 – 如果您的exception处理程序尝试closuresExcel,而您的代码已经在closuresExcel的过程中,则最终将导致一个死的Excel实例。
  • 调用Application.Quit()方法后立即调用GC.Collect()GC.WaitForPendingFinalizers() ,以确保.NET Framework立即释放所有Excel COM对象。

编辑 :约翰·桑德斯可能有一个关于许可协议的一点 – 我不能build议。 我使用Word / Excel进行的项目都是大型客户端的Intranet应用程序,并且要求使用Word / Excel。

他提供的链接也有一些可能有用的工具,虽然这些库不会有完整的Excelfunction,如果这是你所需要的,你没有select。 如果您不需要完整的Excelfunction,请查看这些库 – 它们可能更简单易用。

一些可能对试图实施这种方法的人有用的链接:

  • StackOverflow的问题
  • 可能的替代产品
  • COM服务器激活和窗口站

不久前, HPC Services for Excel改变了这个故事。

这样,您可以在Web服务器上执行Office Automation。 我仍然在试图确定它是如何适合我的情况的,但是你可能想要检查一下。