【问题标题】:How do you use Excel server-side?您如何使用 Excel 服务器端?
【发布时间】:2020-03-23 05:33:39
【问题描述】:

客户想要“启用网络”电子表格计算 - 用户指定某些单元格的值,然后在其他单元格中显示结果值。

(他们不想向用户显示“类似电子表格”的界面。这不是 UI 问题。)

他们有一个庞大的电子表格,其中包含很多很多工作表上的大量计算。但是,最后,只有两件事很重要——(1)你将数字放在一张纸上的几个单元格中,(2)你从另一张纸上的几个单元格中得到相应的数字。其余部分是一个黑匣子。

我想向用户展示一个 UI 以输入他们想要的数字,然后我想以编程方式打开 Excel 文件,设置数字,告诉它重新计算,然后读出结果。

这可能/可取吗?是否有商业组件使这更容易?我没有考虑他们的陷阱吗?

(我知道我可以使用 Office 自动化来执行此操作,但我知道不建议在服务器端执行此操作,因为它会尝试在用户的上下文中运行等)

很多人都说我需要在代码中重新创建公式。然而,这将是惊人的复杂。

【问题讨论】:

    标签: asp.net excel


    【解决方案1】:

    这是可能的,但不建议这样做(并且官方不支持)。

    您可以通过 COM 或 .NET Primary Interop Assemblies 与 Excel 交互,但这是一个客户端进程。

    在服务器端,没有可用的显示器或桌面,任何意外的对话框(例如)都会使您的 Web 应用挂起 - 您的应用会表现得不稳定。

    此外,将 Excel 流程附加到每个请求并不完全是一种低资源方法。

    解决黑盒并用适当的编程语言重新实现它显然是更好的选择(如“更可靠和更快”)。

    相关阅读:KB257757: Considerations for server-side Automation of Office

    【讨论】:

    • 对这些问题的出色讨论。 +1
    【解决方案2】:

    您绝对不想在服务器端使用互操作,在客户端使用它作为杂物已经够糟糕了。

    我可以看到两个选项:

    弄清楚电子表格的逻辑。通过使业务逻辑成为已知数量,这可能会使您在长期内受益,并且在短期内您可能会发现电子表格中实际上存在错误(我遇到过使用多年的大量怪物电子表格,结果很简单它们中的错误 - 每个人都认为答案一定是正确的)

    评估 SpreadSheetGear.NET,它基本上是互操作的替代品,无需 Excel 即可完成所有操作(它在 .NET 中复制了大量 Excel 的非可视逻辑和 IO)

    【讨论】:

    • 很高兴听到,我并没有真正将它用于 Excel 计算。我们主要使用它为 Intranet 应用程序导入和导出 Excel 文件,这非常棒(比我们仍然具有互操作遗留代码的桌面文件要好得多)
    【解决方案3】:

    虽然使用 ASP.NET 肯定可以做到这一点,但这是非常不可取的。它不可扩展且容易出现并发错误。

    最好的办法是分析电子表格的计算并复制它们。现在,诚然,您的企业不会喜欢这样做所需的时间,但它(可能)会给他们一个更可用的系统。

    或者,您可以简单地将电子表格从您的网站提供给用户,在这种情况下,您几乎什么都不做。

    编辑:如果您的利益相关者真的坚持使用 Excel 服务器端,我建议您按照@John Saunders 的建议仔细研究 Excel Services。它可能无法得到你想要的所有东西,但它会给你带来不少好处,并且应该可以解决你在尝试使用 ASP.NET 进行服务器端处理时遇到的一些问题.

    这并不是说它是灵丹妙药;您的里程肯定会有所不同。而且 Sharepoint 的购买或维护并不便宜。事实上,如果您采用 Sharepoint 路线,短期成本很容易与长期成本相形见绌——但它可能是满足要求的最佳选择。

    我仍然建议您支持将所有逻辑编码在单独的 .NET 模块中。这样您就可以在服务器端 客户端使用它。 Excel 可以轻松地将计算传递给 COM 对象,并且您可以非常轻松地将 .NET 库发布为 COM 对象。最后,您将拥有一个更易于维护和可用的架构。

    【讨论】:

    • +1 您还可以对您的计算进行单元测试。
    • 当然。如果您有超过一两个用户,那么您很容易遇到麻烦。 (至少,它会很慢)。最好使用一种用于并发 Web 访问的技术。
    • 即使我没有将任何内容保存到 Excel 文件中,我是否会冒并发问题的风险?我不想保存任何东西——我只想输入一些数据,重新计算,读取一些数据,然后放弃。
    • 假设客户可能希望不时调整 Excel 工作表,在 ASP.NET 中硬编码所有乱七八糟的公式可能会有一些缺点......
    • @Deane: 嗯...文件在打开时可能会被锁定,因此您必须进行一些灵巧的服务器端编程,以确保只有一个用户在一次。然后事情真的变得有趣......
    【解决方案4】:

    忽略在服务器端操作 excel 表是否有意义的讨论,执行此操作的一种方法可能看起来像采用

    Microsoft.Office.Interop.Excel.dll

    使用这个库,您可以告诉 Excel 打开电子表格,更改和读取 .NET 中的内容。我在一个 WinForm 应用程序中使用过这个库,我想它也可以从 ASP.NET 中使用。

    不过,考虑一下已经提到的并发问题...但是,如果不经常访问工作表,为什么不...

    【讨论】:

      【解决方案5】:

      最简单的方法可能是:

      将 Excel 工作簿上传到 Google Docs -- 根据我的经验,这非常干净

      使用 Google 电子表格数据 API 更新数据并返回数字。

      如果您想朝那个方向发展,这里有一个链接可以帮助您开始:

      http://code.google.com/apis/spreadsheets/overview.html

      【讨论】:

        【解决方案6】:

        让我比其他人更坚定:不要使用 Excel 服务器端。它旨在用作桌面应用程序,这意味着它不打算用于随机不同的线程,可能一次使用多个线程。您最好编写自己的电子表格,而不是尝试使用 Excel(或任何其他 Office 桌面产品)形成服务器。

        这是 Excel Services 存在的原因之一。在 MSDN 上快速搜索发现此链接:http://blogs.msdn.com/excel/archive/category/11361.aspx。这是一个类别列表,因此包含有关该主题的博客文章列表。另见Microsoft.Office.Excel.Server.WebServices Namespace

        【讨论】:

          【解决方案7】:

          听起来您是在说用户在其本地系统上打开了电子表格,并且您希望网站来操作该本地电子表格?

          如果是这样的话,你真的不能那样做。即使是 Office 自动化也无济于事,除非您想要求他们将工作表上传到服务器并下载新的更改版本。

          您可以做的是创建一个 Web 服务来进行计算,并将一些 vba 或 vsto 代码添加到 Excel 工作表中以与该服务通信。

          【讨论】:

          • 不,与客户端无关。我本质上想将电子表格用作服务器上的事务计算器——一个大而复杂的公式。
          • 好的,我现在知道了。在这种情况下,Randolpho 很好地涵盖了它。
          猜你喜欢
          • 1970-01-01
          • 2013-07-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-18
          相关资源
          最近更新 更多