【问题标题】:Query Excel spreadsheet with C# .NET without using Jet OLE DB在不使用 Jet OLE DB 的情况下使用 C# .NET 查询 Excel 电子表格
【发布时间】:2010-11-02 00:45:52
【问题描述】:

有什么方法可以查询 excel 2010 电子表格,而不使用 Jet 或导出为 CSV 并查询 csv 文件。

我不能使用 Jet 的原因是因为应用程序需要在 Windows Server 2008 R2 上作为 Web 服务运行,不支持 32 位 - 因此 Jet 将无法工作。这是给定的,因为目标服务器上没有安装 WOW 64。

This thread 建议使用 32 位代理机器,但这也不是一个选项。

更多信息:服务器正在运行 Sharepoint 2010。

谢谢,

京东

【问题讨论】:

  • 您不能将 excel 电子表格导入“真实”数据库吗?由于您正在编写 Web 服务,因此您可能会遇到一些并发问题,如果您将数据源保存为 excel 文件......那么您可以安排一个作业来不时更新 sql server 表。跨度>
  • 没有。将信息存储在excel文件中是一项业务需求。不是我的选择...
  • 我不知道可以从安装中排除 WOW64 - 根据我的经验,任何 32 位程序都在 64 位机器上运行 - 大概 WOW64 就在那里,但你甚至没有注意到它。
  • Mrk Mnl:它不再默认安装在 Server 2008 R2 服务器核心中。 msdn.microsoft.com/en-us/library/dd371790(VS.85).aspx
  • 我明白了(必须弥补最小字符)

标签: c# .net excel oledb


【解决方案1】:

是的 - 您可以使用 Excel.Interop - 通过在 VS 添加引用对话框的 .Net 选项卡中添加对 Microsoft.Office.Interop.Excel(我认为是 Excel 2010 的版本 13)的引用,从 C# 程序中引用它.

仅供参考:使用 Interop 在服务器上运行守护进程不是一个好主意:http://support.microsoft.com/default.aspx?scid=kb;EN-US;q257757#kb2,但是如果它是一个运行时间短的程序,由用户运行并且您对其进行监控,它应该没事。。

如果您希望您的客户运行该程序,他们将需要安装主互操作程序集 (PIA)(如果他们在安装 Office 时尚未安装),可以在此处获取:

XP:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=C41BD61E-3060-4F71-A6B4-01FEBA508E52
2003:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=3C9A983A-AC14-4125-8BA0-D36D67E0F4AD
2007:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=59DAEBAA-BED4-4282-A28C-B864D8BFA513
2010:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=938fe8ad-583b-4bd7-a345-23250dc15855

我一直在我的 x64 Vista 机器上使用 Office11,所以我认为 x64 不会造成任何问题。

请注意,文档很糟糕!那里有大约 10 个不同版本的帮助和文档。我推荐:

熟悉:

  • 应用
  • 工作簿
  • 工作表
  • 范围

对象。您可以将数据读入 List> (在这种情况下,您的所有单元格都必须格式化为文本)或内存中的某些内容,然后您不必再处理 Interop 及其 v.fast 了。从 C# 始终使用一种方法(一些文档错误地告诉您不能使用它们供内部使用的方法),例如: Range.get_Values("A1") 相对于: Range.Cells;

这里是一个很好的起点:http://dotnetperls.com/excel-interop

官方文档在这里:http://msdn.microsoft.com/en-us/library/bb726434(v=office.12).aspx,但它包含大量营销华夫饼,直到您了解其中部分已有十年历史的 Interop 库。

请注意:Excel 索引是基于 1 的,即返回的二维数组中的第一个元素从 my2DArray[1,1] 开始!

【讨论】:

  • 这就是我要建议的。 64 位可能会造成一两个问题,但它应该可以工作。
  • 太棒了!唯一的问题是,这需要在服务器上安装 Office 2010 的副本,这并不理想 - 但我相信它会起作用。谢谢。
  • 我认为,无论您做出什么决定,都至少需要一些 Office 组件。
  • @JD:你可以只安装 PIA 而不是办公室,在这里获取它们:microsoft.com/downloads/en/…
  • @Mrk:我有点怀疑。 PIA 只是在您的程序和 Excel 之间传递消息,它本身实际上并不处理任何行为。如果没有将请求交给 Excel,则不会加载您的文件,也不会返回您的数据。
【解决方案2】:

除了 Excel.Interop,您是否可以使用 ADO.Net 来使用 ACE 引擎而不是旧的 JET 引擎? ACE 是随 Excel/Access 2007 引入的,旨在取代 JET。

【讨论】:

    【解决方案3】:

    我也遇到过这种情况。我的情况:需要在 Windows 7 x64 和 x86 上运行的重要客户端应用程序。需要从 Excel 电子表格中提取数据;不需要灵活性和最小的“用户痛苦”。 ACEDB (Access Database Engine redist.) 没有这样做,因为当 x86(32 位)Office 已安装时,显然无法安装 x64 版本。 PIA 不是一个选项 - “最小的用户痛苦”。

    我使用了这个库:http://npoi.codeplex.com

    它带有大量示例,我能够将应用程序构建到“任何 CPU”而不是限制到 x86,这导致我们尝试使用的其他一些第三方 dll 出现问题。我在大约 10 分钟内启动并运行了 NPOI,所以我绝对可以推荐它。

    【讨论】:

      【解决方案4】:

      这是另一个刚刚由同事向我推荐的第 3 方套餐: Aspose Excel Spreadsheet Components

      看起来这将减少对互操作的需求并且必须安装 Office PIA。

      虽然没有价格,所以可能不便宜。

      【讨论】:

      • 我认为正版 Microsoft 组件会更可靠,并且不应该存在成本问题,因为它已经是基于 Microsoft 的服务器 - 即。它并不是强制使用 3rd 方组件的 Linux 机器。
      • 如上所述,它需要在服务器上安装 Office 2010,因此使用互操作方法存在成本问题(因为您需要 Microsoft 许可证才能使用 Office)。其次,我建议的软件包是一个占用空间小的 DLL,它更适合可能无法/不希望安装 Office 2010 的服务器环境。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多