C# EPPlus OfficeOpenXml检查工作表存在,但未将整个文件加载到内存中

C# EPPlus OfficeOpenXml检查工作表存在,但未将整个文件加载到内存中,c#,excel,epplus,C#,Excel,Epplus,我正在使用Visual Studio 2013 C#,EPPLus.dll。我有一个功能来检查Excel是否包含提供的工作表。下面是我使用的代码,我注意到在本例中,EPPlus在检查工作表之前将Excel文件的所有内容加载到内存中 我们能做些什么来减少这种情况?我正在阅读大量包含许多工作表的大型Excel文件,我只需要获取具有指定工作表名称的文件 internal static bool SheetExist(string fullFilePath, string sheetName)

我正在使用Visual Studio 2013 C#,EPPLus.dll。我有一个功能来检查Excel是否包含提供的工作表。下面是我使用的代码,我注意到在本例中,EPPlus在检查工作表之前将Excel文件的所有内容加载到内存中

我们能做些什么来减少这种情况?我正在阅读大量包含许多工作表的大型Excel文件,我只需要获取具有指定工作表名称的文件

    internal static bool SheetExist(string fullFilePath, string sheetName)
    {
        using (var package = new ExcelPackage(new FileInfo(fullFilePath)))
        {
            return package.Workbook.Worksheets.Any(sheet => sheet.Name == sheetName);
        }
    }

我通过使用OleDbConnection找到了另一种选择,使用它,您可以在不加载所有数据的情况下获取工作表信息

    internal static bool SheetExist(string fullFilePath, string sheetName)
    {
        var connString = string.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties='Excel 8.0;HDR=NO'",fullFilePath)
        var excelSheetName = "'" + sheetName + "$'";
        using (OleDbConnection excelCon = new OleDbConnection(connString))
        {
            excelCon.Open();
            try
            {
                var dtSheets = excelCon.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
                if (dtSheets == null) return false;
                var sheetList = dtSheets.Select().ToList();
                return sheetList.Any(sheet => sheet["TABLE_NAME"].ToString() == excelSheetName);
            }
            finally
            {
                excelCon.Close();
            }
        }
    }

我用下面的方法检查工作表是否存在。我正在使用EPPlus库

   ExcelPackage objExcelPackage = new ExcelPackage();
   if (objExcelPackage.Workbook?.Worksheets?.Count > 0)
   {
     // Generate Excel file object
     // send email with attachment 
   }

只有将文件加载到excel包中,才能从excel包中获取图纸列表。看看ExcelPackage类的构造函数。您可以直接加载文件,也可以以流的形式加载文件。速度更快,但您还是要打开整个文件。