SQL查询到C#中的Excel
我一直在努力解决这个问题。 我正在编写一个程序来处理SQL数据库中服务器上的大量数据。 表中有数百万条logging,包含50列。
我的程序做的第一件事就是执行一个查询来检索一组这样的数据。 设定的大小可以从500个logging到150万个。 150万是非常罕见的,但可能会发生。 目前我正在检索数据并将其存储在DataTable中,然后使用EPPlus将其导出为excel。 我开始耗尽大约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而无需DataTable,并直接写入CSV文件而不是Excel文件(您的问题并未显示您需要公式,格式等)。
此外,这将有助于把自己放在最终用户的地方。 用户可能会发现处理100万行excel文件的问题。
如果您正在为每个单元格或每一行设置值和格式,则需要花费时间。
你应该总是使用set_range(“A1:A50”)=string数组。 您可以创build一个由50个string组成的string数组,并使用set_range()进行设置。
我不知道EPPlus的configuration,如果你正在创build很多的对象来设置你的DataTable而不处置它,它会抛出内存的问题,因为那些可能不是CLR对象。
您可能会尝试使用多个表格来编写用户可读性的数据。
有关将sql数据表导出为excel的更多信息
首先,你已经在使用一个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可以处理的数据量。