[英]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.