【问题标题】:C# Query an excel fastest methodC#查询一个excel最快的方法
【发布时间】:2017-03-02 19:34:24
【问题描述】:

我有一个 excel 文件,我正在使用 OleDB 使用 SQL 在我的 C# 程序上查询它。 但我遇到了一个问题。我的文件有大约 300K 行,查询需要很长时间。我已经搜索了这个问题并使用了一些库,例如电子表格和 EPPlus,但它们没有查询功能。 任何人都可以建议我查询我的文件的最快方法吗?

提前致谢。

【问题讨论】:

  • 您能说明您尝试过哪些代码处理时间过长吗?
  • @downvoters,这是来自 OP 的合法问题!如果您曾经使用 OleDB 处理过 300-400K 行的 Excel 文件,您就会知道。甚至不需要代码。至少在执行这样的语句时它会很慢:"SELECT * FROM [" + sheetName + "$]";
  • 查询其实很简单。 OleDbCommand date = new OleDbCommand("SELECT ["+date+"] FROM [Sheet1$] WHERE ["+key+"]= " + array[i].ToString(), connection);
  • @andrews 是的,它很慢,我之前提到过。你能给我一个建议来加快查询文件吗?
  • 为什么 EPPlus 不起作用? “查询”功能是什么意思?

标签: c# sql database excel oledb


【解决方案1】:

我使用过 400-800K 行的 Excel 文件。任务是读取所有行并将它们插入 SQL Server DB。根据我的经验,OleDB 无法及时处理如此大的文件,因此我们不得不使用 SQL Server 手段将 Excel 文件直接导入 DB,例如OPENROWSET.

即使是更小的文件,例如 260K 行,也需要大约 260K 行。使用 OleDB 一个小时,使用 Core2 Duo 生成硬件将逐行导入 DB 表。

因此,在您的情况下,您可以考虑以下几点:

1.尝试使用范围SELECT分块读取Excel文件:

OleDbCommand date = new OleDbCommand("SELECT ["+date+"] FROM [Sheet1$A1:Z10000]
                                  WHERE ["+key+"]= " + array[i].ToString(), connection);

注意,[Sheet1$A1:Z10000] 告诉 OleDB 只处理工作表的 A 到 Z 列的前 10K 行,而不是整个工作表。例如,如果您的 Excel 文件已排序,并且您知道不需要检查所有行而只需要检查今年,则可以使用此方法。或者您可以动态更改Z10000 以读取文件的下一个块并将结果与​​前一个块合并。

2.使用直接 DB 导入将所有 Excel 文件内容直接导入 DB,例如 MS SQL Server 的 OPENROWSET,然后针对 RDBMS 而不是 Excel 文件运行搜索查询。

我个人建议选项 #2。评论您是否可以使用 DB,以及您可以使用哪些 RDBMS 产品/版本(如果有)。

希望这会有所帮助!

【讨论】:

  • 非常感谢您的回答。这是详细信息。我正在写一篇关于 3 天后再次去医院的病人的论文,并研究原因。我有一年的医院记录,包括患者到达医院的日期,文件有 300K 行。首先,我按患者 ID 分组。然后在 for 循环中,我为每个患者 ID 调用选择查询,如下所示; “从 sheet1 中选择日期,其中 patientID = myarray[i]”。 (正如我在评论中提到的那样。)通过这种方式,我获取每个患者的所有到达日期,我检查,如果 day
  • @FK 如果这是一次性活动,您最好的解决方案是先在数据库中获取数据,然后使用 SQL 进行查询。否则会很痛苦。您以前使用过关系数据库管理系统、MySQL、PostregSQL、SQL Server 吗?其中任何一个都适合你。
  • 我以前用过mysql。我想我要将所有数据导出到 mysql 数据库。如何将excel导出到mysql?
  • @FK 搜索 google 或 StackOverflow 关于如何将 Excel 导入 MySQL,有很多示例。如果您定期收到带有访问的新文件,那么您可以设置一个夜间进程将所有数据导入 mysql,然后在白天运行您的 SQL 查询。如果此答案对您有所帮助,请确保将其标记为已接受,不幸的是,由于代表人数少,您无法投票。
  • @FK 不客气!在发布答案之前,我已经对您的问题进行了投票。如果您在将 Excel 数据导入 MySQL 时遇到问题,请使用适当的标签发布另一个问题,但请务必包含您的实际代码,以显示您试图让反对者远离。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-04
  • 2018-04-27
  • 1970-01-01
相关资源
最近更新 更多