2017-12-12 8 views
0

Visual Studio 2013 C#, EPPLus.dll을 사용하고 있습니다. Excel에 제공된 워크 시트가 포함되어 있는지 확인하는 기능이 있습니다. 아래 코드는 내가 사용한 코드입니다.이 경우 EPPlus가 워크 시트를 검사하기 전에 Excel 파일의 모든 내용을 메모리에로드하고 있습니다.EPPlus OfficeOpenXml 메모리에 전체 파일을로드하지 않고 워크 시트가 있는지 확인하십시오.

이 문제를 줄이기 위해 다른 방법이있을 수 있습니까? 저는 많은 시트가있는 많은 큰 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); 
     } 
    } 
+0

Excel 패키지에 파일을로드 할 때까지 Excel 패키지에서 시트 목록을 가져올 수 없습니다. ExcelPackage 클래스의 생성자를 살펴보십시오. 파일을 직접로드하거나 파일을 스트림으로로드 할 수 있습니다. –

답변

0

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(); 
      } 
     } 
    }