1

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

4

2 回答 2

4

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

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

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

您还需要在具有正确权限的服务器上创建一个专用用户帐户。我不能告诉你究竟是什么,因为在我的例子中,我们控制了服务器并且我们给了这个用户管理员权限。

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

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

默认情况下,Office 应用程序会尝试在屏幕上显示各种消息:警告、问题等。这些必须关闭,因为当您从 Web 应用程序使用 Office 应用程序时,它会在服务器上运行,因此人类用户不会关闭这些消息 - 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 实例。这对我来说不是问题,因为我们控制了服务器。

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

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

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

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

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

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

编辑:John Saunders 可能对许可协议有意见 - 我不能就此提出建议。我使用 Word/Excel 做的项目都是大客户的 Intranet 应用程序,使用 Word/Excel 的要求是给定的。

他提供的链接也有一些可能有用的工具,尽管这些库不具备完整的 Excel 功能,如果这是您需要的,您别无选择。如果您不需要完整的 Excel 功能,请查看这些库 - 它们可能更易于使用。

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

于 2012-02-29T03:24:04.707 回答
0

不久前,HPC Services for Excel发生了变化。

有了它,您可以在 Web 服务器上执行 Office 自动化。我仍在尝试确定它是否适合我的情况,但您可能想检查一下。

于 2012-03-26T20:25:38.463 回答