2012-02-06 10 views

답변

35
var fileName = @"C:\ExcelFile.xlsx"; 
var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ; 
using (var conn = new OleDbConnection(connectionString)) 
{ 
    conn.Open(); 

    var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 
    using (var cmd = conn.CreateCommand()) 
    { 
     cmd.CommandText = "SELECT * FROM [" + sheets.Rows[0]["TABLE_NAME"].ToString() + "] "; 

     var adapter = new OleDbDataAdapter(cmd); 
     var ds = new DataSet(); 
     adapter.Fill(ds); 
    } 
} 
+3

주 - 시트가 암호로 보호되어 있으면 OLEDB가 작동하지 않습니다. –

+0

감사합니다, 그냥 내가 무엇을 찾고 있었습니까 – Mana

+0

@ Aleksandar,이 솔루션은 또한 리눅스에서 작동합니까? – Dalton

1

OleDB를 사용하여 Excel 파일에서 데이터를 읽을 수 있습니다. 다음과 같이 해보십시오 ..

DataSet ds_Data = new DataSet(); 
OleDbConnection oleCon = new OleDbConnection(); 

string strExcelFile = @"C:\Test.xlsx"; 
oleCon.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + strExcelFile + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\"";; 

string SpreadSheetName = ""; 

OleDbDataAdapter Adapter = new OleDbDataAdapter(); 
OleDbConnection conn = new OleDbConnection(sConnectionString); 

string strQuery; 
conn.Open(); 

int workSheetNumber = 0; 

DataTable ExcelSheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); 

SpreadSheetName = ExcelSheets.Rows[workSheetNumber]["TABLE_NAME"].ToString(); 

strQuery = "select * from [" + SpreadSheetName + "] "; 
OleDbCommand cmd = new OleDbCommand(strQuery, conn); 
Adapter.SelectCommand = cmd; 
DataSet dsExcel = new DataSet(); 
Adapter.Fill(dsExcel); 
conn.Close(); 
2

OleDB를 사용하지 않을 것을 강력히 권합니다. 특히 서버에서 실행될 경우 더욱 그렇습니다. 장기적으로 볼 때 더 많은 비용을 지불 할 가능성이 있습니다. 예를 들어, SSI 작업을 통해 OleDB가 sptroc에서 Excel 파일을 읽고 SQL 상자를 손상시키지 않고 저장 프로 시저를 호출했습니다. 나는 sproc에서 OleDB를 꺼내 서버 중단을 막았다.

더 나은 방법은 Office 2003과 XML 파일 (Considerations for server-side Automation of Office)을 사용하는 것입니다. 참고 :

참조를 엑셀에서 읽어 : http://www.roelvanlisdonk.nl/?p=924 엑셀 스프레드 시트를 작성하기위한

참조을 (다른 예를 찾기 위해 더 많은 연구를 바랍니다) : http://weblogs.asp.net/jgaylord/archive/2008/08/11/use-linq-to-xml-to-generate-excel-documents.aspx 오피스 2003이 비행 할 수있는 최소 요구 사항입니다

public void ReadExcelCellTest() 
     { 
      XDocument document = XDocument.Load(@"C:\BDATA\Cars.xml"); 
      XNamespace workbookNameSpace = @"urn:schemas-microsoft-com:office:spreadsheet"; 

      // Get worksheet 
      var query = from w in document.Elements(workbookNameSpace + "Workbook").Elements(workbookNameSpace + "Worksheet") 
         where w.Attribute(workbookNameSpace + "Name").Value.Equals("Settings") 
         select w; 
      List<XElement> foundWoksheets = query.ToList<XElement>(); 
      if (foundWoksheets.Count() <= 0) { throw new ApplicationException("Worksheet Settings could not be found"); } 
      XElement worksheet = query.ToList<XElement>()[0]; 

      // Get the row for "Seat" 
      query = from d in worksheet.Elements(workbookNameSpace + "Table").Elements(workbookNameSpace + "Row").Elements(workbookNameSpace + "Cell").Elements(workbookNameSpace + "Data") 
        where d.Value.Equals("Seat") 
        select d; 
      List<XElement> foundData = query.ToList<XElement>(); 
      if (foundData.Count() <= 0) { throw new ApplicationException("Row 'Seat' could not be found"); } 
      XElement row = query.ToList<XElement>()[0].Parent.Parent; 

      // Get value cell of Etl_SPIImportLocation_ImportPath setting 
      XElement cell = row.Elements().ToList<XElement>()[1]; 

      // Get the value "Leon" 
      string cellValue = cell.Elements(workbookNameSpace + "Data").ToList<XElement>()[0].Value; 

      Console.WriteLine(cellValue); 
     } 
+1

그것은 서버에 대한 위험이다 순전히 인 OleDB이다; 그것은 매우 위험한 Stored Proc를 통해 외부 SQL 서버를 실행합니다. – philu

48

은 내가보기 엔 엑셀 2007/2010 파일 (오피스 오픈 XML 포맷, XLSX)를 읽기 위해 엑셀 97-2003 파일 (XLS)와 ExcelPackage를 읽는 CSharpJExcel을 권장합니다.

둘 다 완벽하게 작동합니다. 그들은 절대적으로 어떤 것에도 의존하지 않습니다.

CSharpJExcel를 사용하여 샘플 :

Workbook workbook = Workbook.getWorkbook(new System.IO.FileInfo(fileName)); 
var sheet = workbook.getSheet(0); 
... 
var content = sheet.getCell(colIndex, rowIndex).getContents(); 
... 
workbook.close(); 

ExcelPackage 사용하여 샘플 :

using (ExcelPackage xlPackage = new ExcelPackage(existingFile)) 
{ 
    // get the first worksheet in the workbook 
    ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[1]; 
    int iCol = 2; // the column to read 

    // output the data in column 2 
    for (int iRow = 1; iRow < 6; iRow++) 
    Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol, 
     worksheet.Cell(iRow, iCol).Value); 

    // output the formula in row 6 
    Console.WriteLine("Cell({0},{1}).Formula={2}", 6, iCol, 
    worksheet.Cell(6, iCol).Formula); 

} // the using statement calls Dispose() which closes the package. 

편집 :

가있는 것 같다 다른 프로젝트, ExcelDataReader,이를 능력 두 가지 형식 모두를 처리 할 수 ​​있습니다. 그것은 내가 언급 한 다른 것들처럼 쉽습니다.

  • NPOI: Port of the Apache POI library to .NET :
    매우 강력한 무료 및 오픈 소스

    는 다른 라이브러리가 있습니다. Excel (97-2010) 외에 Word 및 PowerPoint 파일도 지원합니다.

  • ExcelLibrary :
    Excel 97-2003 (xls) 파일 만 지원합니다.

  • EPPlus :
    ExcelPackage의 확장 프로그램입니다. 사용하기 쉽다 (아마).

+2

이 ExcelDataReader는 OLEDB보다 빠르며 엄청나게 빠릅니다. –

+0

ExcelDataReader가 GitHub로 마이그레이션 중입니다. https://github.com/ExcelDataReader/ExcelDataReader –

0

interop을 사용하지 않으려는 경우 OfficeWriter을 사용해보세요. 파일에서 실제로 처리해야하는 처리량에 따라 지나치게 많을 수도 있습니다. 무료 평가판을 요청할 수 있습니다. documentation site에는 완전히 문서화 된 API가 있습니다.

면책 조항 : 저는 최신 버전을 제작 한 엔지니어 중 한 명입니다.

0

또한 내가해야 할 일이 같은 상용 제어에 의한 수 : 나는 상용 솔루션을 종료하기 전에 년 동안 struging 된 http://www.syncfusion.com/products/reporting-edition/xlsio

. 우선 개발 환경에서 사용하기가 쉬운 OLEDB 방식을 시도했지만 배포 할 기사가 될 수 있습니다. 그럼 오픈 소스 솔루션을 시도했지만 대부분의 구식이며 나쁜 지원.

syncfusion의 xlsio 컨트롤은 내가 사용하고 만족 스럽지만 다른 것들이 있습니다. 당신이 그것을 권유 할 수 있다면 주저하지 말고 가장 좋은 해결책입니다. 왜? 그것은 시스템과 아무런 관련이 없으며 모든 버전의 사무소를 즉시 지원하기 때문입니다. 같은 다른 장점들 중, 정말 빠릅니다.

그리고 아니, 내가 synfusion 작동하지 않습니다

2

당신이 XLS 파일이 아닌 XLSX 파일을 열해야하는 경우), http://npoi.codeplex.com/는 좋은 선택이 될 것입니다. 우리는 그것을 프로젝트에 좋은 영향을 미치기 위해 사용했습니다.

1

I는 Excel.dll 라이브러리를 사용하고 있습니다 :

  • 경량

    • 오픈 소스를
    • 빠른
    • XLS와 호환 및 XLSX
    • ,

    여기에 사용할 수있는 문서 : https://exceldatareader.codeplex.com/

    강력 추천.

  • 0

    필자는 단지 솔루션을 찾고 매우 유망한 보이는 Spreadsheetlight

    건너되었다. 오픈 소스이며 너겟 패키지로 제공됩니다.

    2

    GSpread.NET을 찾으십시오. 또한 OpenSource 프로젝트이기 때문에 Office를 설치할 필요가 없습니다. Microsoft Excel의 API를 사용하여 Google 스프레드 시트 작업을 할 수 있습니다. Google 스프레드 시트에 액세스하기 위해 이전 코드를 다시 사용하려면 GSpread.NET이 가장 좋습니다.

    Set objExcel = CreateObject("GSpreadCOM.Application") 
    // Name    - User name, any you like 
    // ClientIdAndSecret - `client_id|client_secret` format 
    // ScriptId   - Google Apps script ID 
    app.MailLogon(Name, ClientIdAndSecret, ScriptId); 
    

    또한 코드가 변경되지 : 당신은 몇 행을 추가해야합니다.

    http://scand.com/products/gspread/index.html

    관련 문제