2013-02-21 4 views
2
난 엑셀 파일 가져 오기 위해 사용하고 서비스를 가지고 있고, 구현은 다음과 같습니다

:엑셀 가져 오기 나누기

[Attributes.ImportFileExtension(Extension=".xls")] 
[Attributes.ImportFileExtension(Extension=".xlt")] 
[Attributes.ImportFileExtension(Extension=".xlsx")] 
public class ExcelImportService:FileImportServiceBase,IFileImportService 
{ 
    public DataSet Import(System.IO.Stream fileStream) 
    { 
     IExcelDataReader excelReader = null; 
     switch (Extension) 
     { 
      case ".xls": 
      case ".xlt": 
       excelReader = ExcelReaderFactory.CreateBinaryReader(fileStream); 
       break; 
      case ".xlsx": 
       excelReader = ExcelReaderFactory.CreateOpenXmlReader(fileStream); 
       break; 
     } 
     excelReader.IsFirstRowAsColumnNames = true; 
     DataSet dataSet = excelReader.AsDataSet(); 
     return dataSet; 
    } 
} 

은 또한, 나는이를 호출 다음 코드가 서비스가 생성되는 팩토리를 통해 제공됩니다. 이 서비스를 호출하는 코드는 다음과 같습니다가 수입되는 동안 파일이 열려하지 않는 한

 try 
     { 
      var extension = Path.GetExtension(dialog.FileName); 
      var importService = FileImportServiceFactory.Create(extension); 
      var stream = dialog.OpenFile(); 
      var data = importService.Import(stream); 
      stream.Close(); 
      stream.Dispose(); 

      var result = new FileImportedMessage { Data = data }; 
      result.Dispatch(); 
     } 
     catch (Exception e) 
     { 
      MessageDispatcher.Dispatch(new ExceptionMessage(e)); 
     } 

가져 오기 작품을 찾을 수 있습니다.

나는 두 가지 질문이 있습니다

1)이 상황을 처리하기위한 가장 좋은 방법/전략은 무엇입니까?

2) 어떻게 처리해야합니까?

답변

0

문제는 당신이 읽기 전용 모드에서 파일을 열고 adder 프로그램이 읽기 쓰기 모드로 파일을 열 때 파일을 잠그는 것입니다.

두 가지 옵션 만 있습니다.

1- 욕심 많은 방식으로 프로그램을 읽기 전용 모드로 파일을 잠급니다.

2- (파일이 크지 않은 경우에만) 전체 파일을 메모리 스트림으로 읽고 거기에서 처리합니다.

관련 문제