2013-04-25 2 views
1

Excel 파일에서 열을 읽는 코드를 작성했습니다. Microsoft.Office.Interop.Excel을 사용하면 먼저 Range 전체를 읽고 System.Array 값으로 System.Array에 몇 가지 연산을 수행 한 다음 ListBox 요소를 채우기 때문에 List로 변환합니다.Microsoft.Office.Interop.Excel 또는 EPPlus가 큰 Excel 파일을 읽음

private List<string> bd = new List<string>(); 
private static System.Array objRowAValues; 

private List<string> bl = new List<string>(); 
private static System.Array objRowBValues; 

private List<string> cm = new List<string>(); 
private static System.Array objRowCValues; 

private List<string> pl = new List<string>(); 
private List<string> bdCleanList; 
private static Microsoft.Office.Interop.Excel.Application appExcel; 

Excel.Application xlApp; 
Excel.Workbook xlWorkBook; 
Excel.Worksheet xlWorkSheet; 
Excel.Range rngARowLast, rngBRowLast, rngCRowLast; 

long lastACell, lastBCell, lastCCell, fullRow; 

private void btnCargarExcel_Click(object sender, EventArgs e) 
    { 
     if (this.openFileDialog1.ShowDialog() == DialogResult.OK) 
     { 
      if (System.IO.File.Exists(openFileDialog1.FileName)) 
      { 
       Stopwatch stopWatch = new Stopwatch(); 
       stopWatch.Start(); 
       Thread.Sleep(10000); 

       filePath.Text = openFileDialog1.FileName.ToString(); 

       xlApp = new Microsoft.Office.Interop.Excel.Application(); 
       xlWorkBook = xlApp.Workbooks.Open(openFileDialog1.FileName, 0, true, 5, "", "", true, 
                Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, 
                false, 0, true, 1, 0); 
       xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1); 

       fullRow = xlWorkSheet.Rows.Count; 
       lastACell = xlWorkSheet.Cells[fullRow, 1].End(Excel.XlDirection.xlUp).Row; 
       rngARowLast = xlWorkSheet.get_Range("A1", "A" + lastACell); 
       objRowAValues = (System.Array)rngARowLast.Cells.Value; 

       foreach (object elem in objRowAValues) 
       { 
        if (elem != "") 
        { 
         bd.Add(cleanString(elem.ToString(), 10)); 
        } 
       } 

       nrosProcesados.Text = bd.Count().ToString(); 
       listBox1.DataSource = bd; 

       xlWorkBook.Close(true, null, null); 
       xlApp.Quit(); 

       releaseObject(xlWorkSheet); 
       releaseObject(xlWorkBook); 
       releaseObject(xlApp); 

       stopWatch.Stop(); 

       TimeSpan ts = stopWatch.Elapsed; 
       executiontime.Text = 
        String.Format("{0:00}:{1:00}:{2:00}.{3:00}", ts.Hours, ts.Minutes, ts.Seconds, 
            ts.Milliseconds/10).ToString(); 
      } 
      else 
      { 
       MessageBox.Show("No se pudo abrir el fichero!"); 
       System.Runtime.InteropServices.Marshal.ReleaseComObject(appExcel); 
       appExcel = null; 
       System.Windows.Forms.Application.Exit(); 
      } 
     } 
    } 

나는 ~ 800 000 개의 셀을 가진 Excel 파일로 테스트하고 2 분 이내에 끝내기 만합니다. 그런 다음 EPPlus에서 샘플을 테스트하고 내 접근 방식보다 빠르기 때문에 Microsoft 대신 EPPlus를 사용하는 것으로 생각합니다 .Office.Interop.Excel OpenXML SDK를 사용하는 것으로 생각합니다 (그러나 내 목표로 스위트 룸을 찾을 수는 없습니다. 지금). 그들이 여기 LINQ를 사용 물론

ExcelWorksheet sheet = package.Workbook.Worksheets[1]; 

var query1= (from cell in sheet.Cells["d:d"] where cell.Value is double && (double)cell.Value >= 9990 && (double)cell.Value <= 10000 select cell); 

하지만이 주제에 대한 내 질문은 다음과 같습니다 : 예에서 그들은 Excel 파일에서 읽을이 코드를 사용

  • 어떤 방법 당신이 사용 했습니까?
  • 이것에 대한 권장 사항은 무엇입니까?
  • EPPlus 또는 OpenXML SDK를 사용하여 동일한 내용을 작성하는 데 도움이 필요합니까?

나는 C#을 세계에서 초보자는 PHP 세계에서오고 이것은 내 첫 번째 프로젝트

답변

2

당신이 방법을 사용 했입니까? -EPPlus

이것에 대한 권장 사항은 무엇입니까? - EPPLus가 훨씬 빠름을 발견했습니다. 내 의견으로는 더 쉬운 API이기도합니다. 많은 이유 때문에 COM interop (속도와 사용 용이성 모두)이 부족합니다. 또한 특히 서버 환경에 배포 할 때 요구 사항이 적습니다. Excel 설치가 필요 없습니다.

EPPlus 또는 OpenXML SDK를 사용하여 작성하는 데 도움이 필요합니까? -EPPlus API는 상당히 직설적입니다. 지금까지 시도한 내용으로 더 구체적인 질문을 게시하고 시도해보십시오.

셀을 반복하는 또 다른 방법 :

var firstColumnRows = sheet.Cells["A2:A"]; 

// Loop through rows in the first column, get values based on offset 
foreach (var cell in firstColumnRows) 
{ 
    var column1CellValue = cell.GetValue<string>(); 
    var neighborCellValue = cell.Offset(0, 1).GetValue<string>(); 
} 
+0

덕분에, 나는 모든 샘플 코드를 확인하고 나를 내가 물어 그것을 위해 EPPlus를 사용하여 동일한을 얻기 위해 따라야 단계를 이해하기에 충분하지 않습니다 여기에서 도움이 필요하면 Excel에서 셀을 읽고 System.Array에 쓰는 것과 동일한 논리가 필요한지 모르겠습니다. – Reynier

+0

이것은 셀 위로 반복하는 방법입니다. http://codealoc.wordpress.com/2012/04/19/reading-an-excel-xlsx-file-from-c/ – AaronLS

+0

다른 예제로 업데이트되었습니다. 또한 EPPlus에는 범위 기능이있어 사용자에게 도움이 될 수 있습니다. – AaronLS

관련 문제