2017-03-02 62 views
-1

我有一个excel文件,我正在使用OleDB在我的C#程序中用SQL进行查询。 但我面临一个问题。我的文件有大约300K行,查询需要很长时间。我已经搜索了这个问题,并使用了一些库,如spreadsheetlight和EPPlus,但他们没有查询功能。 任何人都可以建议我最快的方式来查询我的文件?C#查询excel最快的方法

在此先感谢。

+0

你能说明你试过的代码花了很长时间来处理吗? – frostbyte

+0

@downvoters,这是来自OP的一个合理的问题!如果你曾经使用OleDB处理过300-400K行的Excel文件,你会知道的。甚至不需要代码。至少当这样的语句被执行时,它会很慢:'“SELECT * FROM [”+ sheetName +“$]”;' – andrews

+0

实际上查询非常简单。 (“SELECT [”+ date +“] FROM [Sheet1 $] WHERE [”+ key +“] =”+ array [i] .ToString(),connection); –

回答

1

我曾与400-800K行的Excel文件。任务是读取所有行并将它们插入到SQL Server数据库中。根据我的经验,OleDB无法及时处理这些大文件,因此我们不得不使用SQL Server的方式直接将Excel文件导入到数据库中。 OPENROWSET

甚至更​​小的文件,如260K行大约需要。一个小时的OleDB使用Core2 Duo生成硬件逐行导入数据库表。

所以,你的情况,你可以考虑以下几点:在块

1.Try读取Excel文件,使用范围SELECT

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

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

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

我个人建议选项#2。如果您可以使用数据库,以及您可以使用的RDBMS产品/版本(如果有的话),请留言。

希望这会有所帮助!

+0

我非常感谢您的回答。这里是细节。我正在撰写一篇关于病人在3天内再次去医院并进行研究的理由的论文。我有一年的医院记录,包括病人到医院的日期和档案有30万行。首先,我通过patientID进行分组。然后,在for循环中,我为每个单个患者ID调用select查询,如下所示; “从sheet1 where patientID = myarray [i]”中选择日期。 (正如我在评论中提到的那样)。通过这种方式,我可以为每位患者提供所有到达日期,如果日期<3,我会检查它。我没有关于mssql unf的信息。 @andrews –

+0

@FK如果这是一次性活动,那么最好的解决方案是首先在数据库中获取数据,然后用户SQL对其进行查询。否则,这将是一个痛苦。你以前曾经使用Relation Database Management Systems,MySQL,PostregSQL,SQL Server吗?任何这些将为你工作。 – andrews

+0

我以前使用过mysql。我想我会将所有的数据导出到MySQL数据库。我怎样才能将excel导出到mysql? –