繁体   English   中英

如何读取包含超过 200,000 行的大型 excel 文件并将该数据加载到 C# 中的数据表中

[英]How to read large excel files containing more that 200,000 rows and load that data in datatable in C#

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

我这样做

 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();

您的问题是内存不足 - 可能您的应用程序作为 32 位应用程序运行,并且您加载的所有内容都使其过载。

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

您正在内存中加载整个 excel 表格的数据,永远不要这样做,很少有环境变量进入场景,例如如果应用程序部署在另一台机器上可能会改变可用内存,并且在 Excel 表格中填充列 - 如果所有列都是与冗长的文本一起使用,那么几千条记录可能足以耗尽内存。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM