C# 用C语言加载大型Excel文件#

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

我正在尝试使用以下代码加载一个包含11列和485k行的大型excel文件(~30MB):

                    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才能将数据加载到内存中吗?