2009-09-15 6 views
3

Excel 통합 문서의 첫 번째 워크 시트 이름을 모른다고 가정 해보십시오. 그리고 첫 번째 페이지에서 읽을 수있는 방법을 찾고 싶습니다. 이 스 니펫은 때때로 작동하지만 항상 그렇지는 않습니다. 나 뿐인가요? 아니면 이것을 할 방법이 없는가?Excel 통합 문서의 첫 페이지 이름은 어떻게 구합니까?

  MyConnection = new System.Data.OleDb.OleDbConnection("provider=Microsoft.Jet.OLEDB.4.0;Data Source='" + inputFile + "';Extended Properties=Excel 8.0;"); 

      String[] excelSheets = new String[tbl.Rows.Count]; 
      int i = 0; 
      foreach (DataRow row in tbl.Rows) 
      { 
       excelSheets[i] = row["TABLE_NAME"].ToString(); 
       i++; 
      } 
      string pageName = excelSheets[0]; 

      OleDbDataAdapter myAdapter = new System.Data.OleDb.OleDbDataAdapter("SELECT * FROM [" + pageName + "]", MyConnection); 

참고 : 나는 이름 첫 번째 워크 시트의 찾고 있습니다.

+0

Eviljack를 소유, 당신은 당신이 독점적으로 샘플 코드은 OleDb를 사용하고 (이 질문을 명확히해야 야곱에게 의견에서, VSTO가이 프로젝트에 허용되지 않는다고 말하면 VSTO가 필요없는 Jacob 솔루션에 체크 표시를했지만 자동화는 사용합니다. 기술적으로 "VBTO 없음"이라는 문구를 무시한 것은 아닙니다 ...하지만 전반적으로, 당신이 원래 찾고 있던 것과 더 가까워 보이는 것처럼 보일 것입니다. –

답변

8

Office가 컴퓨터에 설치되어있는 경우 Office 용 Visual Studio Tools (VSTO)를 사용하지 않는 것이 좋습니다.

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application(); 
Microsoft.Office.Interop.Excel.Workbook workbook = app.Workbooks.Open(fileName,otherarguments); 
Microsoft.Office.Interop.Excel.Worksheet worksheet = workbook.Worksheets[1] as Microsoft.Office.Interop.Excel.Worksheet; 
+0

OleDbConnection을 사용해야합니다 .VSTO는 좋은데,이 프로젝트에는 허용되지 않습니다. 감사합니다. – eviljack

+1

실제로 작동하는 거룩한 쓰레기입니다. – eviljack

+0

미안, 나 나가 "otherarguments"를 운동 할 때까지 당신을 downvoted 그때 그것이 효과가 있다는 것을 깨달았다. upvote하려고하지만 그것은 나를 허용하지 않습니다. – eviljack

1

이 내가 반환 된 테이블의 순서가 엉망이됩니다 생각이 다른 질문 First sheet Excel

과 동일 다음은 워크 시트를 얻을 수있는 코드는 본질적이다. 우리는 탭의 순서를 얻는 방법을 찾아야 할 것입니다. 지금은 코드를 확인하면 언젠가 첫 번째 시트가 인덱스 0이됩니다. 그러나 임의의 순서로 반환 될 수 있습니다. 다른 시트를 삭제하려고 시도했지만 단 하나만 사용하면 올바른 이름을 얻을 수 있습니다. 그러나 그것은 소판적이지 않을 것입니다.

편집 : 몇 가지 조사 후,이 탭이 이름 Using Excel OleDb to get sheet names IN SHEET ORDER 의 순서로 반환 될 수 링크

2

귀하의 코드는 TBL의 (고화질) 누락 것 같다 참조하십시오. 나는 그것이 무언가라고 가정합니다.

DataTable tbl = MyConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); 

그렇다면 아마도 시트 이름을 잘못 주문했을 것입니다.

이 문제에 대한 적절한 해결책을 찾을 수 없어 다른 관점에서 접근했습니다. 나는 실제 정보가있는 시트를 찾기로 결정했습니다. 아마도 행을 보면이 작업을 수행 할 수 있지만 필자가 사용한 방법은 스키마 정보에서 열을 보는 것입니다. (이것은 분명히 사용 된 시트에서 실패 할 것입니다. 하나의 열만있는 미사용 시트이기도하지만 제 경우에는 효과가있었습니다. 그리고 예상 한 수의 열 (내 경우 9 개)을 확인하는데도 사용했습니다.

GetOleDbSchemaTable (OleDbSchemaGuid.Columns, null) 메서드를 사용하여 열 정보를 반환합니다.

코드는 아마/무관 trival이고, 나는이 문제를 가로 질러 왔을 때 LINQ를 학습 할 일이, 그래서 LINQ 스타일을 쓴

그것은 당신이 얻을 수있는 LinqList라는 작은 클래스를 필요로하지 않습니다 here

DataTable columnDetails = objConn.GetOleDbSchemaTable(
          System.Data.OleDb.OleDbSchemaGuid.Columns, null);  

LinqList<DataRow> rows = new LinqList<DataRow>(columnDetails.Rows);   

var query= (from r in rows 
      group r by r["Table_Name"] into results 
      select new { results.Key , count=results.Count() } 
      ); 

var activeSheets = (from sheet in query 
         where sheet.count == 9 
         select sheet.Key 
        ).ToList(); 

if (activeSheets.Count != 1) 
    ... display error 
+0

+1 자동화 사용을 피하고 OleDbConnection.GetOleDbSchemaTable 메서드의 실제 예제를 보여주는 +1. –

+1

LinqList 클래스가 필요하다는 것을 확신하지 못합니다. 대신 'LinqList rows = columnDetails.Rows.Cast ();'에서와 같이 Enumerable.Cast () 확장 메소드를 사용할 수 있습니다. –

+0

나는 그것을 의미한다 'var rows = columnDetails.Rows.Cast (); ' 네, 그렇게 잘 작동하는 것 같습니다. 감사합니다. – sgmoore

0

SpreadsheetGear for .NET는 ([sheetIndex] .name을 IWorkbook.Worksheets와)과 원시 데이터 또는 각 셀 (더 수행의 형식의 텍스트를 얻을하지만 그건 아마 통합 문서를로드 및 시트의 이름을 얻을 수있게된다 현재 OleDB를 사용하고 있다면 무엇을 찾고 있는지).

무료 시험판 here을 다운로드 할 수 있습니다.

면책 조항 : 문제는 자동화를 사용하지 않는 것 같이 내가하는 SpreadsheetGear LLC

관련 문제