如何读取包含超过200,000行的大型excel文件,并在C#

时间:2016-03-07 08:05:34

标签: c# excel datatable

我正在从excel读取数据并将其加载到datatable中。我的问题是它在加载大型Excel文件时给出了SystemOutOfMemoryException。 excel中的colomns没有修复,因此我无法在sql表中加载该数据。 我需要对数据进行一些操作,所以我将它加载到datatable中。 有谁能建议我如何解决这个问题?

我这样做

 OleDbConnection conn = new OleDbConnection();
                OleDbCommand cmd = new OleDbCommand();
                OleDbDataAdapter da = new OleDbDataAdapter();
                conn = new OleDbConnection(GetOleDbConnectionString(strFileType, strNewPath));
                if (conn.State == ConnectionState.Closed) conn.Open();    
                string query = null;
                DataTable dt = new DataTable();              

                query = "SELECT  * FROM [" + SpreadSheetName + "]";               

                cmd.Connection = conn;
                cmd.CommandText = query;
                da.SelectCommand = cmd;
                da.Fill(dt);
                da.Dispose();
                conn.Close();
                conn.Dispose();

2 个答案:

答案 0 :(得分:0)

您的问题是内存不足 - 可能您的应用程序以32位应用程序运行,而您加载的所有内容都会超载它。

使其成为64位应用程序(在可执行项目下的设置中) - 并确保您的物理内存足以用于现代机器(8 + gb)。

答案 1 :(得分:0)

您正在将整个Excel工作表的数据加载到内存中,从不这样做,很少有环境变量进入可用内存的情况,如果应用程序部署在另一台机器上可能会更改,并且列中填入excel表 - 如果全部这些列使用冗长的文本,然后几千条记录就足以耗尽内存。

更好的方法是触发查询以仅获取列名称,如

query = "SELECT  * FROM [" + SpreadSheetName + "]" where 1=2"

这将为您提供所有列名,使用它来在数据库中创建表。 创建表后,要么一次加载少量记录,并在有限的记录中进行操作,并重复直到结束。