使用C# ASP.NET/MVC在Web浏览器中打开巨大Excel文件中的单个工作表(单个标签页)。

5

我有一些非常大的Excel文件,需要从Web浏览器中打开。加载这些大文件需要几分钟时间。是否可能只打开包含单个工作表(单个选项卡)的Excel文件中的一个工作表?我需要使用C# / asp.net MVC实现此操作。


如果您需要在客户端打开文件,则服务器与之无关。 - John Saunders
您可以使用OpenXML格式SDK提取特定的电子表格,并将其作为自己的工作簿提供给客户端。我不确定您所说的“从包含多个电子表格的Excel文件中一次只打开一个电子表格”的意思,但您可以查看OpenXML用法并查看它是否适合您:http://msdn.microsoft.com/en-us/library/dd440953.aspx - Joseph Yaduvanshi
为了更明确,我稍微修改了我的问题。感谢到目前为止的回复...它们都很有帮助。 - Venkata Uma Lakkakula
如果客户需要上传一个Excel文件,而你需要在服务器端读取它,我建议使用http://npoi.codeplex.com/。试一试吧。如果这正是你想要做的事情(从你的问题中不太清楚),并且需要更多信息,请给我发送消息。 - Francisco
6个回答

1

我假设您已经在服务器上有Excel工作簿,只想将单个工作表发送给客户端。用户是否会编辑工作表?他们会上传回来吗?

假设这只是一份报告,那么为什么不使用OpenXML SDK读取工作簿,提取相关的工作表并将其发送回客户端呢?这就是评论中@Jim所建议的。您可以在此处获取SDK:Microsoft Office的Open XML SDK 2.0。但是,我不确定它是否适用于“旧”的Excel格式。我假设您需要将模板工作簿保存为新的Office格式(xslx)。


0

即使通过Interop,您也无法“告诉”Excel只需要一个工作表。有很多解释,例如公式、引用和它们之间的链接,这使得任务变得不可能。

如果您只想从工作表中读取数据,可能OLEDB数据提供程序是最好的选择。以下是一个完整的示例:使用OLEDB数据提供程序读取Excel文件

否则,在执行任何操作之前,您将需要将整个工作簿加载到内存中。


0

您的问题稍微不太清楚电子表格存储在哪里。

如果它存储在您控制的服务器上,请处理它,提取所需的工作表,并创建其他大小较小的工作表(或可能以不同格式保存它们)。

如果它们不在您控制的服务器上,请使用C#下载文件,然后进行类似的提取工作表的过程,再打开它。

话虽如此,我处理过一些相对较大的电子表格(大约20MB左右),并没有真正遇到整个电子表格处理的问题。

那么瓶颈在哪里?是您的网络还是可能是运行的机器?


顺便提一下,当您在服务器上处理它时,请不要使用Excel自动化API来处理。它是为桌面应用程序设计的,在服务器环境中无法正常工作。 - John Saunders

0

使用第三方组件。
我们多年来一直在与服务器端Excel生成进行斗争,但最终失败了。
我们购买了第三方组件,所有问题都解决了。


@AMissico 为什么?无论如何,祝你在服务器端的 Excel 上好运。我确信这是一条死路。它永远不会起作用,因为一个简单的原因 - Excel 是客户端应用程序。 - Sergey Mirvoda
1
因为你只是随意地抛出了一些单词和句子片段。 - AMissico
Excel自动化是“客户端应用程序”。 Excel工作簿是“数据存储”。 他想提供数据,而不是自动化Excel来检索数据。 因此,您的答案与问题无关。 - AMissico
@AMissico Excel的OleDb提供程序远非理想。全球化是万恶之源。小数点和千位分隔符是我们这些非美国用户面临的最大问题。TypeGuessRows也是其中之一。 - Sergey Mirvoda
这不是关于技术的讨论。我只是在解释我的反对票。提供一个答案。不要随意抛出词汇。 - AMissico

0

0
从你的问题来看,似乎你想通过使用(打开)一个工作表中的数据而不是整个工作簿来提高加载时间。如果是这种情况,并且你只需要数据,则可以使用带有OLEDB提供程序的ADO.NET访问工作簿。(你可以使用线程来加载每个工作表以提高加载性能。例如,将三个大数据集加载到三个工作表中需要17秒。在单独的线程上加载每个工作表,相同的数据集在5秒内加载完成。)
从经验来看,当工作簿达到40MB或更大时,性能开始受到严重影响。特别是,如果工作簿包含许多公式。我最大的工作簿大小为120MB,需要几分钟才能加载。使用OLEDB访问,我可以在几秒钟内加载、访问和处理相同的数据。
如果你想让客户端在Excel中打开数据,请通过ADO.NET/OLEDB收集数据,获取XML并使用Xslt转换为XMLSS。这很容易,有很多文档和示例。
如果你只想呈现数据,请通过ADO.NET/OLEDB收集数据,获取XML并使用Xslt转换为HTML。这很容易,有很多文档和示例。
请注意,当处理大量数据时,浏览器和计算机可能会变得无响应。我不得不设置一个上限。如果达到了限制,我会通知用户结果被截断,否则,用户会认为计算机被“锁定”了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接