ASP.NET下C#读取Excel文件,有好几种方法,我了解到的有:Microsoft.Office.Interop.Excel.dll 、 Microsoft.Jet.OLEDB 、NPOI,其中NPOI应该是用的比较多的吧,我个人来说比较倾向使用NPOI,很方便。不过今天我的一个小伙伴突然微信我,说她现在的公司需要解析一个上百兆的Excel文件,使用NPOI会有内存溢出的问题,即使根据需求将文件大小控制在最小50M以内还是不行,问我有什么办法能解决这个问题。
这个问题虽然我没做深入的了解,但是按照经验来看很可能是NPOI的瓶颈,或者说是她用的这个版本NPOI版本的瓶颈。
那么这个问题怎么解决呢?上菜!
DocumentFormat.OpenXmlSDK
对,没错!就是他,微软提供的一个读取Excel的类库
1、通过NuGet搜索 DocumentFormat.OpenXml
我下载的是第二个,至于为啥是第二个,因为小.... 而且对.NetFramework版本没有依赖
2、解析Excel
1 /// <summary> 2 /// 获取Excel指定工作表数据 3 /// </summary> 4 /// <param name="filePath">Excel所在路径</param> 5 /// <param name="sheetName">工作表名</param> 6 /// <returns></returns> 7 public static void GetExcelVlaue(string filePath, string sheetName) 8 { 9 //打开文件 10 SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false); 11 WorkbookPart workbook = document.WorkbookPart; 12 IEnumerable<Sheet> sheets = document.WorkbookPart.Workbook.Descendants<Sheet>().Where(s => s.Name == sheetName);//此处改成读取第一个sheet页面即可 13 if (sheets.Count() == 0) 14 { 15 //sheet空判断 16 } 17 WorksheetPart worksheetPart = (WorksheetPart)document.WorkbookPart.GetPartById(sheets.First().Id); 18 Worksheet worksheet = worksheetPart.Worksheet; 19 IEnumerable<Row> rows = worksheet.Descendants<Row>(); 20 foreach (Row row in rows)//获取行的值 21 { 22 foreach (Cell cell in row) 23 { 24 string columnValue = GetValue(cell, workbook.SharedStringTablePart); 25 } 26 } 27 }