繁体   English   中英

使用自动筛选器读取VB.NET中的excel文件

[英]read excel file in VB.NET with autofilter

我有一个约有80000行的Excel电子表格,用户将自动过滤器应用于工作表并将其加载到VB.NET应用程序中。 有没有一种方法可以使用ADO.NET读取经过过滤的行? 我不想使用Excel Interop,因为并非所有用户都安装了MS Office。 该应用程序旨在读取只读XLSX文件。

谢谢你的期待

与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 我还没有用过。

用于过滤器根据自动过滤器,您需要从文件中读取自动过滤器,并生成sql表达式。 我为您编写了一个结构代码,以使用OpenXml库读取AutoFilter:

 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读取所有文件很可能会花费相同的时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM