2008-11-04 4 views
2

을 사용하여 셀을 열거하는 효율적인 방법 통합 문서의 모든 시트에서 모든 셀을 열거하는 가장 효율적인 방법은 무엇입니까?Excel 통합 문서에서 C#

아래의 방법은 ~ 130,000 개의 셀이있는 통합 문서의 경우 제대로 작동하는 것으로 보입니다. 내 컴퓨터에서 파일을 열려면 약 26 초가 걸렸고 셀을 열거하는 데는 약 5 초가 걸렸습니다. 그러나 저는 Excel 전문가가 아니며 광범위한 커뮤니티에서이 코드 스 니펫을 검증하려고했습니다.

DateTime timer = DateTime.Now; 
Microsoft.Office.Interop.Excel.Application excelApplication = new Microsoft.Office.Interop.Excel.Application(); 
try 
{ 
    exampleFile = new FileInfo(Path.Combine(System.Environment.CurrentDirectory, "Large.xlsx")); 
    excelApplication.Workbooks.Open(exampleFile.FullName, false, false, missing, missing, missing, true, missing, missing, true, missing, missing, missing, missing, missing); 
    Console.WriteLine(string.Format("Took {0} seconds to open file", (DateTime.Now - timer).Seconds.ToString())); 

    timer = DateTime.Now; 
    foreach(Workbook workbook in excelApplication.Workbooks) 
    { 
      foreach(Worksheet sheet in workbook.Sheets) 
      { 
      int i = 0, iRowMax, iColMax; 
      string data = String.Empty; 

      Object[,] rangeData = (System.Object[,]) sheet.UsedRange.Cells.get_Value(missing); 

      if (rangeData != null) 
      { 
       iRowMax = rangeData.GetUpperBound(0);      
       iColMax = rangeData.GetUpperBound(1);              

       for (int iRow = 1; iRow < iRowMax; iRow++) 
       { 
         for(int iCol = 1; iCol < iColMax; iCol++) 
        { 
         data = rangeData[iRow, iCol] != null ? rangeData[iRow, iCol].ToString() : string.Empty; 
         if (i % 100 == 0) 
         { 
          Console.WriteLine(String.Format("Processed {0} cells.", i)); 
         } 

         i++; 
        }                         
       } 
      } 
     } 

     workbook.Close(false, missing, missing); 
    } 

    Console.WriteLine(string.Format("Took {0} seconds to parse file", (DateTime.Now - timer).Seconds.ToString()));    
    } 
    finally 
    { 
     excelApplication.Workbooks.Close();    
     excelApplication.Quit();     
    }     

편집 :

내가 Excel 파일로 직접 작업 API 년대에 의해 노출되지 엑셀 통합 문서의 속성에 액세스하기 위해 PIA 및 상호 운용성을 사용하고자한다는 가치

.

답변

2

Excel PIA Interop은 셀 단위로 작업 할 때 속도가 매우 느립니다.

당신은 단순히 Value 또는 Value2 속성을 읽어 단지 get_Value() (또는 호출하여 당신이 한 번에 전체 범위의 값을 읽어 다음은 Worksheet.UsedRange 속성처럼, 추출 할 범위를 선택해야합니다, I 어느 쪽인지 기억할 수 없다).

이것은 쉽게 열거되고 읽을 수있는 object[,] 즉 2 차원 배열을 산출합니다.

EDIT : 실제 코드를 읽고 실제로 제안한 것을 실현했습니다. 답변을하기 전에 질문을 제대로 읽지 않아서 부끄러운 줄 알았습니다. 이 경우 훨씬 빠르게 할 수 없습니다. Excel PIA Interop이 느립니다. 보다 빠른 솔루션이 필요한 경우 jExcelApi를 Java에서 C#으로 마이그레이션하거나 (또는 ​​끔찍한 일은 아님) 상용 구성 요소를 사용해야합니다. 나는 당신의 온건함을 유지하기 위해 모든 비용으로 OLEDB 인터페이스를 피하도록 제안합니다.

관련이 없지만 유용한 팁 : ?? 운영자. 정말 편리합니다. 대신

data = rangeData[iRow, iCol] != null ? rangeData[iRow, iCol].ToString() : string.Empty; 

당신은 Convert.ToString(object) 어쨌든 빈 문자열로 null 변환 이후에도 String.Empty로이 필요하지 않습니다,이 경우

data = Convert.ToString(rangeData[iRow, iCol]) ?? string.Empty; 

을 작성할 수 있습니다.

1

저는 이것이 PIA에서 가장 효율적인 방법이라고 생각합니다. "for"의 "foreach"insted를 사용하면 더 빠르게 비트가 작아 지지만 극적으로 변경되지는 않습니다.

효율성이 가장 중요한 경우에는 Excel 응용 프로그램없이 파일을 직접 Excel로 작업해야합니다.

2

Koogra이라고하는 Excel 판독기 및 기록기의 오픈 소스 구현이 있습니다. 이를 통해 Excel 파일을 읽고 순수한 관리 코드를 사용하여 수정할 수 있습니다. 이것은 현재 사용중인 코드보다 훨씬 빠릅니다.

+0

+1 Koogra에 대한 포인터 주셔서 감사합니다. 그것은 내 프로젝트에서 유용 할 것입니다. – dcharles

0

에 대한 자세한 내용 각 루프 열거 자 (Excel 시트를 사용하는 Foreach ADO.NET 스키마 행 집합 열거 자) 및 C# .NET 및 VB를 사용하는 프로그래밍 통합 서비스 (SSIS).인터넷의 경우 아래 링크를 방문하십시오. http://www.sqllion.com/2009/06/programming-foreach-loop-container-%e2%80%93-enumerating-excel-sheets/

+0

링크가 www [dot] yourcareeverywhere [dot] com에있는 임의의 기사로 리디렉션됩니다. – altso

관련 문제