引起问题的原因:是NPOI没办法读取数据量过大的EXCEL会导致内存溢出的问题。

解决方法是参展使用OpenXml操作Excel,创建Excel,导入DataTable的数据_呼噜噜哟的博客-CSDN博客

这位博主的使用OpenXml的方式来读取EXCEL

代码如下

      public void Gte( string filePath)
        {
            try
            {
                DataTable dt = new DataTable();
                using (SpreadsheetDocument spreadSheetDocument = SpreadsheetDocument.Open(filePath, false))
                {
                    WorkbookPart workbookPart = spreadSheetDocument.WorkbookPart;
                    IEnumerable<Sheet> sheets = spreadSheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
                    string relationshipId = sheets.First().Id.Value = sheets.First(x => x.Name == "Sheet1").Id.Value;
                    WorksheetPart worksheetPart = (WorksheetPart)spreadSheetDocument.WorkbookPart.GetPartById(relationshipId);
                    Worksheet workSheet = worksheetPart.Worksheet;
                    SheetData sheetData = workSheet.GetFirstChild<SheetData>();
                    Row[] rows = sheetData.Descendants<Row>().ToArray();

                    int count = rows.Count();

                    // 设置表头DataTable
                    foreach (Cell cell in rows.ElementAt(1))
                    {
                        dt.Columns.Add((string)GetCellValue(spreadSheetDocument, cell));
                    }
                    for (int rowIndex = 2; rowIndex < rows.Count(); rowIndex++)
                    {
                        DataRow tempRow = dt.NewRow();
                        string sql = "";
                        for (int i = 0; i < rows[rowIndex].Descendants<Cell>().Count(); i++)
                        {
                            string str = GetCellValue(spreadSheetDocument, rows[rowIndex].Descendants<Cell>().ElementAt(i));
                           
                        }
                      
                    }

                }

            }
            catch (Exception ex)
            {

                throw;
            }
        }

 public static string GetCellValue(SpreadsheetDocument document, Cell cell)
        {
            SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
            string value = cell.CellValue.InnerXml;

            if (cell.DataType != null && (cell.DataType.Value == CellValues.SharedString || cell.DataType.Value == CellValues.String || cell.DataType.Value == CellValues.Number))
            {
                return stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
            }
            else //浮点数和日期对应的cell.DataType都为NULL
            {
                // DateTime.FromOADate((double.Parse(value)); 如果确定是日期就可以直接用过该方法转换为日期对象,可是无法确定DataType==NULL的时候这个CELL 数据到底是浮点型还是日期.(日期被自动转换为浮点
                return value;
            }
        }

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐