2012-08-22 3 views
1

Excel 통합 문서에서 시트를 읽고 목록을 채우는 데 사용하는 코드가 있습니다.Excel 통합 문서의 시트를 목록에 삽입하는 더 좋은 방법이 있습니까?

2 차원 배열에 배치 한 다음 주기로 이동하고 목록을 채우는 범위가 생깁니다.

제 질문은 동일한 결과를 얻는 더 좋은 방법이 있습니까? 코드가 적게 들고 빠릅니다. 4 장에 대해이 작업을 수행해야하며 260ms가 걸립니다.

public static void LoadDdrDataIntoObjects(ref List<Receivables> recList, ref List<Dilution> dilList, ref List<Accountable> accList, ref List<Outstanding> outList, string sheet) 
{ 
    Workbook pantaReiWorkBook = PantaReiApplication.ActiveWorkbook; 
    Sheets pantaReiWorkSheets = pantaReiWorkBook.Sheets; 

    Worksheet pantaReiWorkSheet = pantaReiWorkSheets[sheet]; 
    Range pantaReiLastCell = 
     pantaReiWorkSheet.Cells.SpecialCells(XlCellType.xlCellTypeLastCell); 

    Range pantaReiRange = 
     pantaReiWorkSheet.Range["A1:" + pantaReiLastCell.Address.Trim(new char['$']), Type.Missing]; 

    object[,] pantaReidataRange = (object[,]) pantaReiRange.Value[Type.Missing]; 

    for (var row = 2; row <= pantaReidataRange.GetLength(0); row++) 
    { 
     Receivables pantaReiReceivable = new Receivables 
     { 
      FileID = fileID.ID, 
      SheetType = 
       pantaReidataRange[row, 1].ToString(), 
      SellerCompany = 
       pantaReidataRange[row, 2].ToString(), 
      Contract = pantaReidataRange[row, 3].ToString(), 
      DebitID = pantaReidataRange[row, 4].ToString(), 
      CompanyCode = 
       pantaReidataRange[row, 5].ToString(), 
      NoteNumber = 
       pantaReidataRange[row, 6].ToString(), 
      Installment = 
       Convert.ToInt32(pantaReidataRange[row, 7]), 
      InvoiceDate = 
       (DateTime) pantaReidataRange[row, 8], 
      DueDate1 = (DateTime) pantaReidataRange[row, 9], 
      DueDate2 = 
       (DateTime) pantaReidataRange[row, 10], 
      DueDate3 = 
       (DateTime) pantaReidataRange[row, 11], 
      Currency = 
       pantaReidataRange[row, 12].ToString(), 
      Amount = 
       (float) 
       Convert.ToDouble(pantaReidataRange[row, 13]), 
      Sign = pantaReidataRange[row, 14].ToString(), 
      ProductType = 
       pantaReidataRange[row, 15].ToString(), 
      DilutionType = 
       Convert.ToString(pantaReidataRange[row, 16]), 
      MaturityStatus = 
       Convert.ToInt32(pantaReidataRange[row, 17]), 
      DebitStatus = 
       pantaReidataRange[row, 18].ToString(), 
      DealerFlag = 
       pantaReidataRange[row, 19].ToString(), 
      CustomerDescription = 
       pantaReidataRange[row, 20].ToString(), 
      AssetType = 
       Convert.ToInt32(pantaReidataRange[row, 21]) 
     }; 

     recList.Add(pantaReiReceivable); 
    } 
} 

답변

0

나는 스스로 관리하고 있습니다. 나는 반사를 사용했다.

0

코드를 프로파일하는 것이 가장 좋은 방법입니다. JetBrains dotTrace은 자주 사용하는 도구입니다.

처리 할 행 수가 많으면 List<T> 용량을 설정하거나 심지어 완료 될 때까지 개별 레코드 개체를 List에 추가하는 작업을 연기하는 것이 좋습니다. processing - 루핑하는 동안 배열에 넣는다. for-loop를 입력하기 전에 배열을 선언 할 수 있습니다. 당신은 이미 for-loop의 반복 횟수를 기반으로 배열의 크기를 알고 있습니다. 일단 처리가 끝나면 모든 배열을 수집 할 수 있으며 원하는대로 LINQ를 목록으로 변환 할 수 있습니다.

관련 문제