2013-10-01 3 views
0

У меня есть таблица Excel размером около 80000 строк. Пользователи применяют автофильтр к листу и загружают его в приложение VB.NET. Есть ли способ читать только отфильтрованные строки с помощью ADO.NET?. Я не хочу использовать Excel Interop, потому что не все пользователи имеют MS Office. Приложение предназначено для чтения только файлов XLSX.прочитайте файл excel в VB.NET с автофильтром

Благодаря в ожидании

ответ

0

с ODBC или OLEDB DataProvider годов с SQL-запроса. пример:

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

Спасибо Ломед, проблема в том, что Excel уже предварительно фильтруется различными критериями для пользователя. Мне просто нужно загрузить только отфильтрованные строки. В двух словах, я должен иметь возможность загружать только видимые строки. Есть идеи? - Еще раз спасибо! – user2003438

0

для фильтра Согласно автофильтру, вам необходимо прочитать AutoFilter из файла и сгенерировать выражение 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

Смежные вопросы