在ASP.net中使用宏编辑Excel文档

时间:2012-02-29 03:16:36

标签: asp.net excel excel-vba edit office-automation vba

是否可以通过包含宏的ASP.net页面编辑Excel工作表。我试图打开Excel工作表,它似乎只是挂起而不是加载excel。在没有宏的页面上进行测试可以完美地运行吗?

2 个答案:

答案 0 :(得分:3)

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

此解决方案有效,但它有一些限制,需要对运行它的服务器进行相当大的控制。服务器还需要大量内存。

首先,请确保在服务器上执行每个Office功能的完整安装,以便在尝试使用不存在的功能时,Excel不会尝试安装某些功能。< / p>

您还需要在具有适当权限的服务器上创建专用用户帐户。 我无法告诉您究竟是什么原因,因为在我的情况下我们控制了服务器并且我们为此用户授予了管理员权限。

当您拥有用户帐户时,您需要以该用户身份登录并至少运行一次Excel(最好是所有Office应用程序),以便它可以创建其设置。

当您将用户帐户创建为COM对象时,还需要将Excel配置为在此用户帐户下运行。为此,您需要进入服务器上的DCOM配置并为Launch and Activation Permissions对象配置Excel.Application以使用您的新用户帐户。 我不确定我是否记得正确,但我认为在此步骤之后,以交互式用户身份运行Excel有点问题。

默认情况下,Office应用程序尝试在屏幕上显示各种消息:警告,问题等。必须关闭这些消息,因为当您从Web应用程序使用Office应用程序时,它会在服务器上运行,以便人类用户赢得& #39;要解雇这些消息 - Office程序将无限期地坐着,等待消息被解除。

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

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

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

如果您的Excel文件中包含宏,则可能必须在Excel中禁用宏安全性 - 由于显而易见的原因,无法以编程方式完成。

要访问Excel服务,请实现一个实际保存Excel引用的管理器对象 - 不要尝试在页面中保存Excel.Application对象,因为您的页面代码将变得非常复杂而您可能无法访问妥善清理。

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

如果可以,请尝试创建一个out-of-proc(.exe)COM服务器,因为这样您就可以在单独的进程中保存Excel引用。可以使用进程内(.dll)COM对象使其工作,但它会对您的应用程序池造成更大的风险 - 如果Excel崩溃,它也会使您的应用程序池崩溃

当您拥有.exe服务器时,您可以通过以下几种方式传递参数:

  1. 让您的经理观察COM对象并将参数作为属性传递。
  2. 在启动时将参数作为命令行参数传递给.exe。
  3. 在文本/二进制文件中传递参数;在命令行上传递文件名。
  4. 我使用了所有这些,发现COM对象选项最干净。

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

    • try..catch块中使用Excel的每个函数包装起来,以捕获任何可能的异常。
    • 始终通过调用Marshal.ReleaseComObject()显式释放所有Excel对象,然后在您不需要时立即将变量设置为null。始终在finally块中释放这些对象,以确保失败的Excel方法调用不会导致悬空的COM对象。
    • 如果您尝试在Excel中使用任何格式设置功能(页眉,边距等),则必须安装打印机,并且可以使用用于运行Excel的用户帐户访问该打印机。如果您没有活动打印机(最好连接到服务器),格式化相关功能可能无效。
    • 发生错误时,请关闭您正在使用的Excel实例。您可能无法从与Excel相关的错误中恢复,并且保留实例的时间越长,使用资源的时间就越长。
    • 当您退出Excel时,请确保您针对递归调用保护该代码 - 如果您的异常处理程序在您的代码已经在关闭Excel的过程中尝试关闭Excel时,您最终会得到一个死的Excel实例。
    • 在调用GC.Collect()方法后立即调用GC.WaitForPendingFinalizers()Application.Quit(),以确保.NET Framework立即释放所有Excel COM对象。

    编辑:John Saunders可能对许可协议有一点意见 - 我无法就此提出建议。我使用Word / Excel进行的项目都是大客户端的内部网应用程序,并且使用Word / Excel的要求是给定的。

    他提供的链接也有一些可能有用的工具,虽然这些图书馆不具备完整的Excel功能,如果这就是你需要的,你就没有选择权。如果您不需要完整的Excel功能,请查看这些库 - 它们可能更易于使用。

    一些可能对尝试实施此方法的人有用的链接:

答案 1 :(得分:0)

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

这样,您就可以在Web服务器上执行Office Automation。我仍在尝试确定它是如何适合我的情况的,但你可能想看看它。