Hallo Zusammen,
meine Verwirrung ist wiedermal ziemlich groß. Folgendes Problem:
Ich möchte aus einer Excel- Datei Daten importieren ohne Excel selbst zu öffnen. Dazu habe ich die Ausgangsdaten als *.xml Dateien gespeichert, um dann mithilfe des Excel-XML-Schemas wieder auf den Inhalt zugreifen zu können. Soweit so gut, dazu habe ich zwei Funktionen gesschrieben:
''' <summary>
''' Öffnet eine Excel *.xml Datei und gibt den Inhalt als Dataset zurck.
''' </summary>
''' <param name="p_Filepath">Der Pfad in dem die Datei gespeichert ist.</param>
''' <param name="p_Filename">Der Name der Datei.</param>
''' <returns>Ein Dataset das den Inhalt der Excel- Datei darstellt.</returns>
''' <remarks></remarks>
Public Function OpenExcelXmlFile(ByVal p_Filepath As String, ByVal p_Filename As String) As Data.DataSet
Dim t_XDoc As XDocument = XDocument.Load(p_Filepath & p_Filename)Dim t_DataSet As New Data.DataSet()
t_DataSet.DataSetName = p_Filename & "_DataSet"
For Each worksheet In t_XDoc.<ss:Workbook>.<ss:Worksheet>
Dim t_Table = CreateDataTableFrom_XMLspreadsheet(worksheet)
t_DataSet.Tables.Add(t_Table)
Next worksheet
Return t_DataSet
End Function
''' <summary>
''' Erstellt ein Datatable aus einem ExcelXML- Worksheet.
''' </summary>
''' <param name="p_XMLspreadsheet">Ein ExcelXML- Worksheet als XElement.</param>
''' <returns>Ein Datatable das den ExcelXML- Worksheet darstellt.</returns>
''' <remarks></remarks>
Public Function CreateDataTableFrom_XMLspreadsheet(ByVal p_XMLspreadsheet As XElement) As DataTable
Dim t_Datatable As New DataTable(p_XMLspreadsheet.@ss:Name.ToString)
Dim t_ColumnCount As Integer = 0
t_Datatable.Columns.Clear()
For i = 0 To 255
Dim t_nCol As New DataColumn("F" & t_ColumnCount, GetType(String))
t_Datatable.Columns.Add(t_nCol)
t_ColumnCount += 1
Next i
For Each row As XElement In p_XMLspreadsheet.<ss:Table>.<ss:Row>
Dim t_nRow As DataRow = t_Datatable.NewRow()
t_ColumnCount = 0
For Each cell As XElement In row.<ss:Cell>
t_nRow.Item("F" & t_ColumnCount) = cell.Value.ToString
t_ColumnCount += 1
Next cell
t_Datatable.Rows.Add(t_nRow)
Next row
Return t_Datatable
End Function
Alles anzeigen
Wie man erkennen kann werden alle Werte von mir als String behandelt. Das hat den Hintergrund das die Werte in den Spalten der Ausgangsdaten unterschiedliche Datentypen haben.
Das Problem taucht nun auf wenn ich versuche auf die Reihen eines der Datasets das aus der 'OpenExcelXmlFile'- Funktion zurückgegeben wird einen Filter anzuwenden:
t_VacFile = OpenExcelXmlFile(My.Resources.VacFilePath, t_VacFilesNames(0))
Dim query = From table As DataTable In t_VacFile.Tables Where table.TableName Like "*-*"
Dim s_RowFilter As String = t_Table.Columns(189).ColumnName & "= " & p_PersonNo & ""
t_Rows = t_Table.Select(s_RowFilter)
Ich erhalte dann die überaus informative und vielsagende Fehlermeldung: 'Die Operation '=' kann nicht an System.String und System.Int32 durchgeführt werden.'
Wie gesagt habe ich absichtlich alle Werte als String behandelt um solche Fehler vorzubeugen. Kann mir einer Von Euch helfen und findet den Denkfehler?
Ich hab's schon mit diversen Anführungszeichenkombinationen versucht: F189='1400600' oder F189="1400600" oder "F189=1400600" oder "F189='1400600'" .
Zu erwähnen ist vielleicht noch das wenn ich im Direktfenster den Wert manuell ändere und einfache oder doppelte Anführungszeichen vor und hinter dem Wert einsetze dann klappst!
Wenn ich das Programmgesteuert mache kommt wieder die Fehlermeldung. Auch interessant ist, in der Datei sind zwei Arbeitsblätter die abgefragt werden, bei Nummer eins klappst, bei Nummer zwei dann nicht mehr. Beide werden aber über die selbe Funktion importiert.