C# 用C语言加载大型Excel文件#
我正在尝试使用以下代码加载一个包含11列和485k行的大型excel文件(~30MB):C# 用C语言加载大型Excel文件#,c#,excel,file,C#,Excel,File,我正在尝试使用以下代码加载一个包含11列和485k行的大型excel文件(~30MB): OpenFileDialog ofd = new OpenFileDialog();NameOfFile = ofd.SafeFileName; if (NameOfFile.Contains("xlsx")) { NameOfFile = NameOfFile.S
OpenFileDialog ofd = new OpenFileDialog();NameOfFile = ofd.SafeFileName;
if (NameOfFile.Contains("xlsx"))
{
NameOfFile = NameOfFile.Substring(0, NameOfFile.Length - 5);
}
else
{
NameOfFile = NameOfFile.Substring(0, NameOfFile.Length - 4);
}
string dbConn = "Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + ofd.FileName + ";Extended Properties=" + "Excel 12.0;";
OleDbConnection con = new OleDbConnection(dbConn);
OleDbDataAdapter da = new OleDbDataAdapter("select * from [Contacts$]", con); //Contacts$ -> onoma filou sto excel
da.Fill(dataBase1);
dataGridView1.DataSource = dataBase1.Tables[0];
dataGridView1.Columns[0].Width = 35;
dataGridView1.Columns[1].Width = 35;
dataGridView1.Columns[2].Width = 35;
dataGridView1.Columns[3].Width = 35;
dataGridView1.Columns[4].Width = 35;
dataGridView1.Columns[5].Width = 40;
dataGridView1.Columns[9].Width = 55;
dataGridView1.Columns[10].Width = 60;
问题是,每当我运行程序并尝试加载文件时,程序就会冻结,必须关闭。该程序已经用较小的excel文件(11列100行)进行了测试,运行良好。
有什么想法吗?有485K行,很难说问题是OLEDB还是DataGridView。我建议您转储OLEDB并使用本机excel库,然后在DataGridView中使用虚拟模式 可以读取xlsx格式(Office 2007及更高版本),也可以读取较旧的xls二进制格式(Office 2007之前)
检查DataGridView中是否实现了虚拟模式,这样网格就不必同时管理屏幕和内存中的所有485K行。使用OLEDB加载大型Excel文件可能会出现问题。查看此加载Excel文件并填充DataGridView的代码示例:
它使用。如果您的DataGridView无法显示如此大的数据量,您可以调整代码以从Excel文件加载范围,并逐页显示数据,或仅显示感兴趣的数据。我遇到了与大Excel文件相同的问题,并使用Excel数据读取器库解决了这个问题:
它是用C#编写的轻量级、快速且免费的库 用法:
FileStream stream = File.Open( file, FileMode.Open, FileAccess.Read );
IExcelDataReader excelReader = null;
if (file.ToLower().EndsWith("xls"))
//1. Reading from a binary Excel file ('97-2003 format; *.xls)
excelReader = ExcelReaderFactory.CreateBinaryReader( stream );
else
//2. Reading from a OpenXml Excel file (2007 format; *.xlsx)
excelReader = ExcelReaderFactory.CreateOpenXmlReader( stream );
DataSet result = excelReader.AsDataSet();
然后你可以对数据集做任何你想做的事情。你确定它是冻结的,而不仅仅是处理超大的Excel文件吗?您是否尝试过使用调试器并在认为它卡住时暂停?试图一次将48000行加载到数据网格是疯狂的。您需要使用某种分页机制。是否想过先发送一个数据库,然后单击所需的网格?关系数据库将是存储这种大小数据的更好地方。必须尝试MemoryStream才能将数据加载到内存中吗?