SQL查询到C#中的Excel

我一直在努力解决这个问题。 我正在编写一个程序来处理SQL数据库中服务器上的大量数据。 表中有数百万条logging,包含50列。

我的程序做的第一件事就是执行一个查询来检索一组这样的数据。 设定的大小可以从500个logging到150万个。 150万是非常罕见的,但可能会发生。 目前我正在检索数据并将其存储在DataTable中,然后使用EPPlus将其导出为ex​​cel。 我开始耗尽大约15万条logging。 整个任务大约需要2-3分钟才能完成。 我相信我填充我的DataTable时,内存不足。

数据在SQL数据库的服务器上,我们必须有一个导出的excel文件到我们的本地机器。 这些标准必须继续得到满足。

我到底怎么做到这一点?

编辑:这里是一些示例代码。 我也应该更新,我不关心格式。

string query = "SELECT * FROM DB.dbo.Table WHERE [Client Name] = '" + clientName + "'"; System.Data.DataTable dt = new System.Data.DataTable(); using (SqlConnection sqlConn = new SqlConnection(connString)) { using (SqlCommand cmd = new SqlCommand(query, sqlConn)) { sqlConn.Open(); using (SqlDataReader myReader = cmd.ExecuteReader()) { dt.Load(myReader); sqlConn.Close(); } } } 

我认为我需要在更大的事物上进行调整。 正如你们许多人所说的那样,不可能处理这么多的行。 我将从另一个angular度来看待整个问题。 谢谢大家的帮助!

DataTable在这里显然没有帮助。 您可以直接使用StramWriter而无需Dat​​aTable,并直接写入CSV文件而不是Excel文件(您的问题并未显示您需要公式,格式等)。

此外,这将有助于把自己放在最终用户的地方。 用户可能会发现处理100万行excel文件的问题。

如果您正在为每个单元格或每一行设置值和格式,则需要花费时间。

你应该总是使用set_range(“A1:A50”)=string数组。 您可以创build一个由50个string组成的string数组,并使用set_range()进行设置。

我不知道EPPlus的configuration,如果你正在创build很多的对象来设置你的DataTable而不处置它,它会抛出内存的问题,因为那些可能不是CLR对象。

您可能会尝试使用多个表格来编写用户可读性的数据。

有关将sql数据表导出为ex​​cel的更多信息

首先,你已经在使用一个SqlDataReader 。 这是为了logging的logging处理。 如果你创build一个

 while (reader.Read()) { // Export row } 

循环,你不应该遇到内存问题 – 但它可能会很慢。

在上面的// Export row部分中,您可能想要使用ADO写入Excel工作表,这基本上归结为打开到SQL文件的数据库连接,并INSERT正常的数据库。 SO上应该有代码来告诉你如何做到这一点(例如这个 )。

[关于我怎么做的附注:

我会在我的应用程序资源中创build一个Excel模板文件。 然后,我将其保存到磁盘上,以便在每次导出时创build一个新文件,然后构build一个连接string以访问该新文件。 然后我会使用正常的OleDbCommand插入。

]

但是,正如其他人已经注意到,1.5百万行不是Excel可以处理的数据量。