2013-10-01 3 views
0

약 80000 행의 Excel 스프레드 시트가 있습니다. 사용자가 시트에 자동 필터를 적용하고 VB.NET 응용 프로그램에서로드합니다. ADO.NET을 사용하여 필터링 된 행만 읽을 수있는 방법이 있습니까? 모든 사용자가 MS Office를 설치하지 않았기 때문에 Excel Interop을 사용하고 싶지 않습니다. 이 응용 프로그램은 XLSX 파일 만 읽기 전용으로 설계되었습니다. 기대에autofilter를 사용하여 VB.NET에서 Excel 파일을 읽습니다.

감사 SQL 쿼리와 ODBC 또는 OLEDB의 dataProvider의와

답변

0

. 예 :

Dim connection = New OdbcConnection("Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\MyExcel.xlsx;") 
Dim com As New OdbcCommand("SELECT * FROM [SheetName$] WHERE ID > 5", connection) 

connection.Open() 

Dim reader = com.ExecuteReader() 
While reader.Read() 
    'get data 
    Console.WriteLine("{0} {1}", reader(0), reader(1)) 
End While 

connection.Close() 

또 다른 방법 :linq-to-excel. 아직 사용하지 않았습니다.

+0

감사합니다. Lomed, 문제는 Excel이 이미 사용자가 다양한 기준으로 사전 필터링되어 있다는 것입니다. 필터링 된 행만로드하면됩니다. 요컨대, Visible 행만로드 할 수 있어야합니다. 어떤 아이디어? - 다시 한번 감사드립니다! – user2003438

0

필터 자동 필터에 따르면 파일에서 자동 필터를 읽고 SQL 식을 생성해야합니다. 난 당신에게 OPENXML 라이브러리를 사용하여 자동 필터를 읽을 수있는 구조로 코드를 작성 :

Dim SheetName = "SheetName" 
Dim fileFullName As String = "C:\MyExcel.xlsx" 
Dim SqlFilterExpression As String 

Using xslDoc As SpreadsheetDocument = SpreadsheetDocument.Open(fileFullName, False) 
    Dim theSheet As Sheet = xslDoc.WorkbookPart.Workbook.Sheets.FirstOrDefault(Function(SheetEl) CType(SheetEl, Sheet).Name = SheetName) 
    Dim WorkSheetPart As WorksheetPart = xslDoc.WorkbookPart.GetPartById(theSheet.Id) 

    Dim Filter = WorkSheetPart.Worksheet.Elements(Of AutoFilter).First 

    If Not IsNothing(Filter) Then 
     For Each FilterPerColumn In Filter.Elements(Of FilterColumn)() 

      Dim CustomFilters = FilterPerColumn.Elements(Of CustomFilters).FirstOrDefault 
      If Not IsNothing(CustomFilters) Then 


       Dim filters = CustomFilters.Elements(Of CustomFilter)() 

       'check if filter contient tow condition 
       If filters.Count = 1 Then 
        Select Case CType(filters(0).Operator, FilterOperatorValues) 
         Case FilterOperatorValues.LessThan 
          '...Ect. 
        End Select 

       Else 
        'check if condition joined by or/and 
        If CustomFilters.And Then 
         'and joined 
        Else 
         'or joined 
        End If 
       End If 

      End If 
     Next 
    End If 
End Using 

모든 XML은 OPENXML 모든 파일을 읽는 것은 같은 시간이 걸릴 것으로, 직렬 액세스 파일 매우 가능하다 후에 때문에.

+0

좋아요! 대단히 감사합니다, 나는 그것을 시도해 볼 것입니다. – user2003438

관련 문제