約 80000 行の Excel スプレッドシートがあります。ユーザーはオートフィルターをシートに適用し、VB.NET アプリケーションにロードします。ADO.NET を使用してフィルター処理された行のみを読み取る方法はありますか? すべてのユーザーが MS Office をインストールしているわけではないため、Excel Interop を使用したくありません。アプリケーションは、XLSX ファイルのみを読み取るように設計されています。
期待して感謝
約 80000 行の Excel スプレッドシートがあります。ユーザーはオートフィルターをシートに適用し、VB.NET アプリケーションにロードします。ADO.NET を使用してフィルター処理された行のみを読み取る方法はありますか? すべてのユーザーが MS Office をインストールしているわけではないため、Excel Interop を使用したくありません。アプリケーションは、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。まだ使っていません。
for filter AutoFilter に従って、ファイルから AutoFilter を読み取り、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 によるすべてのファイルの読み取りに同じ時間がかかる可能性が非常に高くなります。