【问题标题】:How to fill DataTable from an in-memory Excel Worksheet如何从内存中的 Excel 工作表中填充 DataTable
【发布时间】:2010-09-24 09:52:39
【问题描述】:

我们的客户获取 Excel 的 HTML 格式的 Excel 文件。(它就是这样到达的;没有人可以控制它。)然后我们需要根据文件中的数据运行报告。使用 ADO.NET (OleDbReader) 会导致“外部文件不是预期格式”异常。

如果将数据转换为常规 Excel 格式,则可以正常读取。然而,这并不是一个真正的解决方案,因为它要求他们必须采取额外的步骤,而且他们在最好的情况下也不太懂计算机。

我能想到的唯一解决方案是使用 Excel 自动化创建一个新的电子表格,用相同的数据填充它,然后读取那个数据。但是 ADO.NET 似乎只能从磁盘上的文件中读取。我当然可以保存文件并在完成后删除它(我已经验证过它可以工作)。但是我对弄乱他们的文件系统的想法感到不舒服。所以我的第一个问题是 - 有没有办法从内存中的 Excel 工作表中填充数据表?

此外,我不喜欢使用自动化的整个业务;它非常慢。即使没有填充 DataTable,该操作也需要 30 多秒。因此,使其速度变慢的解决方案不会有任何好处。这让我想到了第二个问题 - 有没有更好的方法来完成我在这里尝试的事情?

【问题讨论】:

    标签: .net excel ado.net automation


    【解决方案1】:

    试用 HTML 敏捷包:http://www.codeplex.com/htmlagilitypack

    我在类似的场景中使用它。就我而言:...

    • 有人将 Excel 中的表格粘贴到剪贴板中
    • 检索 HTML 文本
    • 使用 HTML Agility 返回找到 TABLE、TR、TH、TD 标签
    • 然后从中构造DataTable

    在我的情况下,HTML 绝不会保存到磁盘

    【讨论】:

      【解决方案2】:

      我不确定您所说的“Excel 的 HTML 格式”是什么意思。最新版本的 Excel 具有 XML 文件格式,我 Excel 可以打开包含表格的 HTML 文件并将其转换为工作表,但 Í 不知道任何特定的 Excel HTML 格式。

      关于使用 Excel 自动化的解决方案,一旦内存中有工作表,就可以使用 Value2 属性将值放入对象的二维数组中,然后使用它来构建 DataTable。我认为这样做不会在使用自动化的初始开销(需要创建 Excel 流程)之上增加太多额外开销。

      有没有更好的方法?解析任意 HTML 并非易事,但如果您收到的文件具有一致的格式,则可以解析它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-07-12
        • 1970-01-01
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多