0

約 80000 行の Excel スプレッドシートがあります。ユーザーはオートフィルターをシートに適用し、VB.NET アプリケーションにロードします。ADO.NET を使用してフィルター処理された行のみを読み取る方法はありますか? すべてのユーザーが MS Office をインストールしているわけではないため、Excel Interop を使用したくありません。アプリケーションは、XLSX ファイルのみを読み取るように設計されています。

期待して感謝

4

2 に答える 2

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。まだ使っていません。

于 2013-10-01T16:48:26.557 に答える
0

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 によるすべてのファイルの読み取りに同じ時間がかかる可能性が非常に高くなります。

于 2013-10-02T10:03:49.883 に答える