C#读取大型excel xlsx并将数据写入到sql server express数据库中,出现entity framework性能问题

我有非常大的xlsx文件(6张,每张100万行,每列19列)。 这个想法是读取所有表中的所有行,并用entity framework填充数据库。

我已经试过ms打开xml sdk,但它真的很慢。 只是遍历所有的行和单元格(以sax的方式)我可能会运行我的程序一个月或更多。

我也试过这个库https://github.com/ExcelDataReader/ExcelDataReader 。 最初,用这个库读起来要快得多(在db插入的情况下,在2秒钟内大概有100行),但是它比较慢(50000行,1分钟以上)。 也许速度下降会导致entity framework – 我没有testing(我只testing没有db访问的前1000行),但即使是这样,没有任何东西的阅读也太慢了。

有没有人有任何想法如何加快阅读xlsx? 另外,我应该放弃entity framework,并自己插入?

目前我的代码看起来像(有像columnMapper.Populate(tmpColumns, columns);columnMapper.getCOlumnId因为不同的工作表有不同的列顺序,甚至不同的列数)

 using (FileStream stream = File.Open(inputFilePath, FileMode.Open, FileAccess.Read)) { IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream); DataSet result = excelReader.AsDataSet(); int tableNo = 0; string[] tmpColumns = new string[20]; Console.WriteLine("Start processing..."); foreach (DataTable table in result.Tables) { // skip bad table if (++tableNo > 5) { continue; } for (int i = 0; i < tmpColumns.Length; ++i) { tmpColumns[i] = string.Empty; } int columns = 0; var rowEnumerator = table.Rows.GetEnumerator(); rowEnumerator.MoveNext(); foreach (string item in ((DataRow)rowEnumerator.Current).ItemArray) { tmpColumns[columns++] = item; } columnMapper.Populate(tmpColumns, columns); int rowNumber = 0; while (rowEnumerator.MoveNext()) { var row = (DataRow)rowEnumerator.Current; int col = 0; foreach (object item in row.ItemArray) { tmpColumns[columnMapper.GetColumnId(col++)] = item.ToString(); } var newBoxData = new BoxData() { ... Year = tmpColumns[4], RetentionPeriod = tmpColumns[6], ContractNumber = tmpColumns[7], Mbr = tmpColumns[8], CardId = tmpColumns[10], Package = tmpColumns[12], UnitType = tmpColumns[13], MFCBox = tmpColumns[14], DescriptionNameAndSurname = tmpColumns[15], DateFromTo = tmpColumns[16], OrderNumberRange = tmpColumns[17], PartnerCode = tmpColumns[18], }; db.BoxesDatas.Add(newBoxData); if (++rowNumber % SaveAfterCount == 0) { db.SaveChanges(); Console.WriteLine(rowNumber); } } } db.SaveChanges(); 

编辑:解决scheme是删除实体FW和插入数据与普通的SQL命令。 所以,在离开ms库(实体fw,打开xml sdk)并将其replace为ExcelDataReader和普通的sql插入所有工作得更快。 〜2,000,000行被提取并插入到db中less于20分钟

请参阅:将Excel工作表数据读入DataTable:代码项目和最佳/最快的方式来读取Excel表格到数据表

解决XL表演后,你也有EF表演的问题。
第一步是创build一个新的DbContext(即在SaveChanges之后)。
第二步是使用不同的ORM。