2011-04-08 6 views
2

내 상사의 사양을 기반으로 일부 코드를 작성했습니다. 요구 사항은 많은 Excel 데이터를 프로그램으로 가져 오는 것이 었습니다. Excel 시트의 사용 범위를 클립 보드에 복사 한 다음 배열에 쓰는 방법으로이 작업을 수행했습니다. 이는 Interop을 사용하여 수행되었습니다. 이것은 잘 작동하며 약 4 개월 동안 아무런 문제없이 사용 된 코드입니다.배열을 Excel 데이터를 복사하는 방법

그러나 인턴쉽 시작시 너무 많은 것을 생각하지 않고이 코드를 작성했습니다. 나는 조용한 순간에 그것을 다시 방문하고있다. 그리고 나에게 생각이 떠올랐다. 더 효율적인 (보다 효율적이고 우아한) 방법이 있는가? 지금 당장 살펴보면 약간의 해킹처럼 보입니다.

감사합니다.

+0

Jet가 있습니다. http://www.connectionstrings.com/excel – Blorgbeard

답변

2

사용하면 엑셀은 상호 운용성을 사용하지 않고 파일을 직접 읽을 수있는 C#을 드라이버 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 
using System.Data.OleDb; 
using System.IO; 

namespace Immo.Areas.Administration.Controllers 
{ 
    public class SomethingSometingExcelClass 
    { 
     public void DoSomethingWithExcel(string filePath) 
     { 

      List<DataTable> worksheets = ImportExcel(filePath); 
      foreach(var item in worksheets){ 
       foreach (DataRow row in item.Rows) 
       { 
        //add to array 
       } 

      } 
     } 
     /// <summary> 
     /// Imports Data from Microsoft Excel File. 
     /// </summary> 
     /// <param name="FileName">Filename from which data need to import</param> 
     /// <returns>List of DataTables, based on the number of sheets</returns> 
     private List<DataTable> ImportExcel(string FileName) 
     { 
      List<DataTable> _dataTables = new List<DataTable>(); 
      string _ConnectionString = string.Empty; 
      string _Extension = Path.GetExtension(FileName); 
      //Checking for the extentions, if XLS connect using Jet OleDB 
      if (_Extension.Equals(".xls", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       _ConnectionString = 
        "Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0};Extended Properties=Excel 8.0"; 
      } 
      //Use ACE OleDb 
      else if (_Extension.Equals(".xlsx", StringComparison.CurrentCultureIgnoreCase)) 
      { 
       _ConnectionString = 
        "Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 8.0"; 
      } 

      DataTable dataTable = null; 

      using (OleDbConnection oleDbConnection = 
       new OleDbConnection(string.Format(_ConnectionString, FileName))) 
      { 
       oleDbConnection.Open(); 
       //Getting the meta data information. 
       //This DataTable will return the details of Sheets in the Excel File. 
       DataTable dbSchema = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables_Info, null); 
       foreach (DataRow item in dbSchema.Rows) 
       { 
        //reading data from excel to Data Table 
        using (OleDbCommand oleDbCommand = new OleDbCommand()) 
        { 
         oleDbCommand.Connection = oleDbConnection; 
         oleDbCommand.CommandText = string.Format("SELECT * FROM [{0}]", 
          item["TABLE_NAME"].ToString()); 
         using (OleDbDataAdapter oleDbDataAdapter = new OleDbDataAdapter()) 
         { 
          oleDbDataAdapter.SelectCommand = oleDbCommand; 
          dataTable = new DataTable(item["TABLE_NAME"].ToString()); 
          oleDbDataAdapter.Fill(dataTable); 
          _dataTables.Add(dataTable); 
         } 
        } 
       } 
      } 
      return _dataTables; 
     } 
    } 
} 
+0

각 줄 앞에 네 개의 공백을 넣어 코드 서식을 지정해야합니다. 그것을 선택하고'{}'버튼을 클릭 할 수도 있습니다. [Markdown Editing Help] (http://stackoverflow.com/editing-help) 페이지에서 유용한 팁. –

+0

긴 답변을 보내 주셔서 감사합니다. 나는 실제로 oleDB로 놀아 왔습니다. 그리고이 문자열과 함께 xlsx 파일을 사용합니다 : string connectionString = "Provider = Microsoft.ACE.OLEDB.12.0; 데이터 원본 ="+ 파일 이름 + "; 확장 속성 = Excel 8.0"conn.Open()에 오류가 발생합니다. 올바른 형식이 아닌 파일을 말하고 있습니까? 어떤 아이디어? 감사합니다 –

+0

{0} 및 string.format와 함께 내 버전을 사용해 보셨습니까? 그렇지 않은 경우 .. IIS에 올바른 드라이버가 설치되어 있는지 확인하십시오 –

0

예, 확실히 해킹입니다. interop을 사용하여 사용 된 범위를 가져 오는 경우 해당 범위를 직접 루프하고 클립 보드 상호 작용없이 배열에 쓸 수 있습니다. 이 라인을 따라

뭔가 :

for(int i = 1; i <= sheet.UsedRange.Rows.Count; i++) 
{ 
    for(int j = 1; j <= sheet.UsedRange.Columns.Count; j++) 
    { 
     DoStuffWith(sheet.UsedRange.Cells(i, j).Value) 
    } 
} 
+1

예,이 시간에 시도했지만 셀을 개별적으로 읽으므로 속도가 매우 느립니다 (매우 눈에.니다). –

0

그것은 확실히 해킹.

전에 제트 연결 (http://connectionstrings.com/excel)을 성공적으로 사용했습니다.

다른 옵션은 Excel 스프레드 시트를 CSV 형식으로 저장하고 파일을 직접 읽는 것입니다. 스프레드 시트의 내용에 따라 실용적이지 않을 수도 있습니다.

관련 문제