在C#中加载大型Excel文件

我试图加载一个大型的Excel文件(〜30MB)与11列和485k行使用下面的代码:

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; 

问题是每当我运行我的程序,并尝试加载文件程序冻结,必须closures。 该程序已经testing与较小的Excel文件(11列和100行),并运行完美。 有任何想法吗?

用485K行,很难说如果问题是OLEDB或DataGridView。 我build议你转储OLEDB,并使用本机的Excel库,然后使用DataGridView的虚拟模式。

EPPlus库可以读取xlsx格式(Office 2007及更高版本)的开源Excel库和可以读取较旧的xls二进制格式(Office 2007之前) 的ExcelLibrary项目 。

请查看本教程以在DataGridView中实现虚拟模式,以便网格无需一次pipe理屏幕上和内存中的所有485K行。

使用OLEDB加载大型Excel文件可能是一个问题。 看看这个加载Excel文件并填充DataGridView的代码示例:

http://www.easyxls.com/manual/FAQ/import-excel-to-datagridview.html

它使用EasyXLS Excel库 。 如果DataGridView无法显示如此大的数据量,则可以调整代码以从Excel文件中加载范围,并逐页显示数据或仅显示感兴趣的数据。

我遇到了与大的Excel文件相同的问题,并通过使用Excel数据读取器库解决:
https://exceldatareader.codeplex.com/
这是用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(); 

然后你可以用DataSet做任何你想要的。