你如何使用Excel服务器端?

时间:2009-04-07 15:50:58

标签: asp.net excel

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

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

他们有一个巨大的电子表格,在很多很多表上都有很多计算。但是,最后,只有两件事情很重要 - (1)你将数字放在一张纸上的几个单元格中;(2)你从另一张纸上的几个单元格中得到相应的数字。剩下的就是一个黑盒子。

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

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

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

编辑:很多人都说我需要在代码中重新创建公式。然而,这将是非常复杂的。听起来这可能是一个已经解决的问题 - 是否有人知道某种类型的组件会为我做这件事?有人必须创建一些“Excel-formula-to-code”生成系统。我很乐意为此付出代价。

编辑/解决方案: SpreadsheetGear正是我所寻找的。除此之外,它还允许您使用XLS作为计算器。您可以设置所选单元格的原始值,然后读出计算单元格的值。正是我在寻找的东西。

7 个答案:

答案 0 :(得分:7)

这是可能的,但不可取(并且官方不支持)。

您可以通过COM或.NET主互操作程序集与Excel交互,但这是一个客户端进程。

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

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

制作黑匣子并以适当的编程语言重新实现它显然更好(如“更可靠和更快”)选项。

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

答案 1 :(得分:6)

你绝对不希望在服务器端使用互操作,使用它作为客户端的kludge已经够糟糕了。

我可以看到两个选项:

找出电子表格逻辑。从长远来看,通过使业务逻辑成为已知数量,这可能会对您有所帮助,并且在短期内您可能会发现电子表格中确实存在错误(我遇到了大量使用多年的怪物电子表格,结果很简单他们中的错误 - 每个人都认为答案必须正确)

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

答案 2 :(得分:4)

尽管使用ASP.NET肯定是可行的,但这是非常不可取的。它不可扩展,容易出现并发错误。

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

或者,您只需向您网站上的用户提供电子表格,在这种情况下,您几乎什么都不做。

编辑:如果您的利益相关方真的坚持使用Excel服务器端,我建议您仔细查看Excel Services,@John Saunders建议。它可能无法为您提供所需的所有,但它会让您相当多,并且应该解决一些问题,您最终会尝试使用ASP.NET在服务器端执行此操作。

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

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

答案 3 :(得分:1)

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

Microsoft.Office.Interop.Excel.dll

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

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

答案 4 :(得分:1)

最简单的方法可能是:

将Excel工作簿上传到Google文档 - 根据我的经验,这非常简洁

使用Google Spreadsheets Data API更新数据并返回数字。

如果您想要朝着这个方向前进,可以使用以下链接开始:

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

听起来你说的是用户在本地系统上打开了电子表格,你想要一个网站来操作那个本地电子表格吗?

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

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