Excel.Application Directcast Alternativen bei OptionStrict ON

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Mabbi.

    Excel.Application Directcast Alternativen bei OptionStrict ON

    Hallo,

    ich lade aktuell eine externe Excel Tabelle, greife auf das Tabellenlatt "Internet" zu und hole dann mit Directcast die Werte die ich haben möchte wenn vorhanden.
    Funktioniert soweit auch.

    Normalerweise lese ich .csv Daten ein und zerlege die so (Option Strict ON):

    VB.NET-Quellcode

    1. 'Excel file laden (.csv)
    2. If System.IO.File.Exists(Dateiname) Then
    3. Try
    4. 'CSV-Datei einlesen und Split pro Zeile
    5. AlleZeilen = IO.File.ReadAllText(Dateiname, System.Text.Encoding.Default).Split(CChar(vbCrLf))
    6. Catch ex
    7. MsgBox(DateipfadSource & " laden Fehler:" & ex.Message)
    8. Exit Sub
    9. End Try
    10. End If


    Die Verarbeitung von "AlleZeilen" ist dann sehr shnell, ich splitte die einzelnen Elemente anhand des Trenners der csv Datei und hab dann direkt schnellen Zugriff auf alle Elmente einer Tabellenzeile.

    Nun das Problem:
    Leider liegt die "Internet" Tabelle aber nur in einem sehr grossen makroverseuchten Excel xlsm-File vor.

    Das Lade ich dann so (Option Strict ON):

    VB.NET-Quellcode

    1. 'Datei laden mit ausgeschalteten Events, damit die Source-Makros nicht anspringen
    2. Try
    3. Dim objExcel As Excel.Application = CType(CreateObject("Excel.Application"), Application)
    4. objExcel.Visible = False
    5. objExcel.EnableEvents = False
    6. Dim oWbk As Workbook = objExcel.Workbooks.Open(DateipfadSource)
    7. Dim Seite As Worksheet = CType(oWbk.Worksheets("Internet"), Worksheet)
    8. 'Anzahl der geladenen WW-Zeilen
    9. Dim Anzahl As Integer = CType(Seite.Cells(Seite.Rows.Count, 1), Excel.Range).End(Excel.XlDirection.xlUp).Row
    10. 'Variablen Setup
    11. Dim Fileout As String = ""
    12. Dim DateiZaehler As Integer = 1
    13. 'Alle Zeilen in Datensätze wandeln (erste Zeile ist Headerzeile)
    14. For i As Integer = Anzahl To 2 Step -1
    15. 'Datensatz generieren
    16. 'Hersteller
    17. If DirectCast(Seite.Cells(i, 2), Excel.Range).Value IsNot Nothing Then
    18. Fileout = Fileout & "###" & arrGDB_WW(1, 0) & Trim(DirectCast(Seite.Cells(i, 2), Excel.Range).Value.ToString)
    19. End If
    20. Next
    21. Catch ex As Exception
    22. MsgBox("Abbruch: " & DateipfadSource & " lässt sich nicht öffnen oder Fehler beim Auswerten der Daten." & vbCrLf & ex.ToString)
    23. Exit Sub
    24. End Try


    Die Tabelle hat 14k+ Zeilen mit jeweils 20 benötigten Daten-Werten pro Zeile die ich einzeln mit Directcast hole derzeit.
    Und diese 280k Zugriffe sind sehr langsam, die Auswertung dauert grobe 8 Minuten.

    Gibt es mit Option Strict ON eine Möglichkeit, schneller auf die Tabelle und deren Inhalte zuzugreifen ?
    Ich würde gerne wie bei der .csv Zeilenweise einlesen, bekomme das aber partout nicht hin.

    Vielen Dank im voraus für Eure Hilfe.

    Edit:

    Das habe ich hierzu noch gefunden, vom Ansatz her gut. social.msdn.microsoft.com/Foru…bnet-ffnen?forum=officede

    Ich bekomme es aber an 2 Stellen wegen "late binding" nicht zum Laufen :(
    Ist schon ein crux, wenn man probiert sauber zu programmieren...

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mabbi“ ()

    versuche es mal mit dem Datareader

    Test ist eine Tabelle in der Exceldatei

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\vbExcel.xlsx;Extended Properties='Excel 12.0 Xml;HDR=YES'"
    3. Dim sSql As String = "Select "
    4. sSql &= "Spalte1, "
    5. sSql &= "Spalte2, "
    6. sSql &= "Spalte3, "
    7. sSql &= "Spalte4 "
    8. sSql &= "FROM [Test$]"
    9. sSql &= " Where Spalte1 <> NULL;"
    10. MsgBox(sSql)
    11. Using connection As New OleDbConnection(connectionString)
    12. Dim cmd As New OleDbCommand(sSql, connection)
    13. connection.Open()
    14. Dim dr As OleDbDataReader = cmd.ExecuteReader()
    15. Using Writer As New System.IO.StreamWriter("E:\TestFolder\Kasi.csv")
    16. 'CSV Header schreiben
    17. Writer.WriteLine(String.Format("{0};{1};{2}", "Spalte1", "Spalte2", "Spalte4"))
    18. If dr.HasRows Then '
    19. Do While dr.Read() 'hier daten in CSV schreiben
    20. Writer.WriteLine(String.Format("{0};{1};{2}", dr("Spalte1"), dr("Spalte2"), dr("Spalte4")))
    21. Loop
    22. Else
    23. 'nix da
    24. Debug.Print("keine Daten")
    25. End If
    26. dr.Close()
    27. End Using
    28. End Using
    29. End Sub

    @Kasi: Das ist ein interessanter Ansatz.
    Probiere ich morgen aus und gebe Rückmeldung dazu.
    Vielen Dank.

    Edit:
    @Kasi:
    Ich habe meine Pfaddaten eingetragen.

    Bekomme leider hier einen Fehler:
    Dim dr As OleDbDataReader = cmd.ExecuteReader()
    "Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."

    System.Data.OleDb.OleDbException wurde nicht behandelt.
    ErrorCode=-2147217904
    HResult=-2147217904
    Message=Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben.
    Source=Microsoft Access Database Engine
    StackTrace:
    bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
    bei System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
    bei System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
    bei System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
    bei System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
    bei System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
    bei System.Data.OleDb.OleDbCommand.ExecuteReader()
    bei xxx.xxx.Button1_Click(Object sender, EventArgs e) in C:\Users\xxx\documents\visual studio 2010\Projects\xxx\xxx\xxx.vb:Zeile 407.
    bei System.Windows.Forms.Control.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnClick(EventArgs e)
    bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
    bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
    bei System.Windows.Forms.Control.WndProc(Message& m)
    bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
    bei System.Windows.Forms.Button.WndProc(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
    bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
    bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
    bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
    bei System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
    bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
    bei Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
    bei xxx.My.MyApplication.Main(String[] Args) in 17d14f5c-a337-4978-8281-53493378c1071.vb:Zeile 81.
    bei System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.AppDomain.nExecuteAssembly(RuntimeAssembly assembly, String[] args)
    bei System.Runtime.Hosting.ManifestRunner.Run(Boolean checkAptModel)
    bei System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()
    bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext, String[] activationCustomData)
    bei System.Runtime.Hosting.ApplicationActivator.CreateInstance(ActivationContext activationContext)
    bei System.Activator.CreateInstance(ActivationContext activationContext)
    bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()
    bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
    bei System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
    bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
    bei System.Threading.ThreadHelper.ThreadStart()
    InnerException:

    DIe MS-Hilfe ist da auch eher vage. Für mich ist das leider total kryptisch... :(

    Und eine Frage habe ich noch: Wie bringe ich Ihm bei, ein bestimmtes Tabellenblatt aus dem Exelfile zu verarbeiten ?

    Edit2:
    Beim Suchen nach einer Lösung für den fehlenden Parameter bin ich über das hier gestolpert:
    OleDbDataReader alles auf mal auslesen.

    Das funktioniert mit 2-3 kleinen Änderungen einwandfrei, auch mit .xlsm Dateien.
    Einlesen der kompletten Daten dauert ca. 3 Sekunden, also voll akzeptabel.
    @RodFromGermany: :thumbsup: Problem gelöst :D

    @Kasi: Vielen Dank für Deine Hilfe

    Dieser Beitrag wurde bereits 13 mal editiert, zuletzt von „Mabbi“ ()

    Da bin ich nochmal....

    ich bin bei der Kontrolle der Daten auf Fehler gestossen, manche Items des Datasets sind leer obwohl die Excel Tabelle dort Daten vorhält

    Der Fehler tritt auf, wenn in einer Excel Zelle eine Zahl kombiniert mit Buchstaben steht, z.B.: "704 HP"
    Das zugehörige Dataset Itemarray hat an der Stelle ein leeres Feld {}.

    Ich habe mit dem ConnString rumexperimentiert und wenn ich "HDR = NO" benutze, dann werden die Daten korrekt eingelesen.
    'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=NO; IMEX=1"";"

    Die HDR Option generiert doch eigentlich nur HEADER aus der ersten Zeile der Excel Tabelle wenn sie aktiviert ist.
    Zumindest laut dieser website: connectionstrings.com/excel/

    Den Unterschied sieht man hier deutlich:

    HDR=YES





    HDR = NO



    Ich brauche die Header nicht, mir macht die Lösung aber Bauchschmerzen, weil es irgendwie Pfusch ist.
    Weiß jemand, wie ich die Zellen mit numerischen & alphanumerischen Inhalt als String erkannt bekomme und korrekt lade mit HDR=YES ?

    Vielen Dank vorab für Eure Unterstützung

    Dieser Beitrag wurde bereits 7 mal editiert, zuletzt von „Mabbi“ ()

    @Mabbi - bei dem Punkt mit dem HDR=NO Fehler - liest du dort bereits die gesamte Tabelle ein oder tritt dieser Fehler nur auf wenn du ab einer bestimmten Zeile einliest,
    Z.B. weil du durch irgendeinen Filter vorher weißt, dass du erst ab Zeile 887 (hier bei dir als ARRAY 0 angegeben) einlesen musst?

    Das wäre ja dann klar, denn dann denkt er, dass genau diese Zeile deine Überschrift ist - denn wie du selbst gesagt hast:

    Mabbi schrieb:

    Die HDR Option generiert doch eigentlich nur HEADER aus der ersten Zeile der Excel Tabelle wenn sie aktiviert ist.

    Für Excel, bzw. den Importer, wäre dies dann die erste Zeile und du gibst ihm den Befehl daraus ein HEADER zu machen
    @ThomasG82
    Ich benutze eine Funktion die RodFromGermany hier an anderer Stelle mal gepostet hat mit kleinen Modifikationen:
    OleDbDataReader alles auf mal auslesen.

    VB.NET-Quellcode

    1. Public Sub LoadExcelFile(path As String, table As String, ByRef Dtset As DataSet)
    2. 'Excel File mit Pfad und Blattnamen auslesen in ein Dataset
    3. Try
    4. Dim connString As String
    5. Dim fi = New IO.FileInfo(path)
    6. If path.ToLower.EndsWith(".xlsm") Then
    7. 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    8. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=NO; IMEX=1"";"
    9. Else
    10. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    11. End If
    12. Using myConnection = New OleDb.OleDbConnection(connString)
    13. Dim myCommand As OleDb.OleDbDataAdapter
    14. myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
    15. myCommand.TableMappings.Add("Table", "TestTable")
    16. myCommand.Fill(Dtset)
    17. myConnection.Close()
    18. End Using
    19. Catch ex As Exception
    20. MessageBox.Show(ex.Message)
    21. End Try
    22. End Sub


    Die liest ein komplettes Excel-Datenblatt in ein Dataset ein.

    Wenn ich beim Einlesen die Header weglasse (HDR=NO ) liest er alles als STRINGs ein. MIT HDR=YES Tauschen da auch Double etc. auf.
    ->siehe die Beiden Bilder die ich weiter oben gepostet habe

    Nun mal ein philosophischer Ansatz:
    In den Headern (Tabelle Zeile 1) stehen nur Worte und keine numerischen Werte drin. Legt er anhand der 1. Zeile das Format des Dataset.Columns fest ?
    HDR= NO -> 1. Zeile wird als Datenbasis behandelt, also STRING
    HDR= YES -> 2. Zeile wird als Datenbasis behandelt, also STRING, Double, etc.
    Da 2. Zeile in der org. Excel Tabelle dort nur numerisch gefüllt ist nimmt er double und ignoriert alles was er nicht nach Double konvertieren kann weiter unten in der Tabelle beim EInlesen?


    Schon etwas schräg... wer weis da mehr ?
    Kann man irgendwie die Typprüfung pro Datenfeld machen beim Erstellen des Datasets oder im Vorfeld festlegen?

    Dieser Beitrag wurde bereits 8 mal editiert, zuletzt von „Mabbi“ ()

    @Mabbi
    Das ist ja der Original Code der Seite, auf welcher du geschaut hast:

    VB.NET-Quellcode

    1. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=DeineDatei.XLSX;Extended Properties="Excel 12.0 Xml;HDR=YES;IMEX=1";

    Daher sollte deiner lauten:

    VB.NET-Quellcode

    1. Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";Extended Properties="Excel 12.0 Xml;HDR=NO;IMEX=1";

    Du hast eine Menge "" auch wenn das eigentlich egal sein sollte.

    Laut Beschreibung liest er dir hiermit aber ALLES als TEXT ein - siehe Überschrift Treating data as text
    Und es wird auch gesagt, dass wenn alle Felder nach der Überschrift NUMERISCH sind, dass nutze IMEX=1 (was wohl Systemabstürzen vorbeugen soll)
    Damit macht er alles richtig wenn du HDR=YES benutzt. Sprich:
    Erste Zeile als Überschrift nutzen: JA und also alles andere numerische Werte!
    Somit KANN und DARF er keine STRING Daten erzeugen und du kannst froh sein, dass du keine Fehlermeldung bekommst. 8-)

    Und bei diesem Punkt kannst du bei XLSM Dateien gar kein IMEX=1 nutzen sondern nur HDR=YES für Überschriften oder halt HDR=NO.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThomasG82“ ()

    @Mabbi

    ich blick nicht mehr durch was du jetzt nutzt
    meine Variante oder die von Rod

    du schreibst.
    Bekomme leider hier einen Fehler:
    Dim dr As OleDbDataReader = cmd.ExecuteReader()
    "Für mindestens einen erforderlichen Parameter wurde kein Wert angegeben."


    was steht in der ersten Zeilen in deiner Mappe?

    wenn du Spaltennamen mit leerzeichen hast, must du das in der SQL mit klammern versehen
    siehe unten 704 HP in der SQL

    VB.NET-Quellcode

    1. Dim sSql As String = "Select "
    2. sSql &= "Spalte1, "
    3. sSql &= "Spalte2, "
    4. sSql &= "[704 HP], "
    5. sSql &= "Spalte4 "
    6. sSql &= "FROM [Test$]"
    7. sSql &= " Where Spalte1 <> NULL;"
    8. MsgBox(sSql)
    @Kasi - ich glaube er nimmt die von @RodFromGermany. Und er kann ja keine Spaltennamen angeben wenn er nicht weiß wie die Spaltennamen lauten.
    Sein Problem ist ja, dass Zelleninhalte nicht weitergereicht werden aufgrund einer fehlerhaften Syntax

    ThomasG82 schrieb:

    Und er kann ja keine Spaltennamen angeben wenn er nicht weiß wie die Spaltennamen Syntax


    wenn die Spaltennamen unbekannt sind werden diese in der SQL mit F1 usw. angegeben,
    HDR muss dann auf N0 gestellt sein

    hier geändert

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim connectionString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=E:\vbExcel.xlsx;Extended Properties='Excel 12.0 Xml;HDR=NO'"
    3. Dim sSql As String = "Select "
    4. sSql &= "F1, "
    5. sSql &= "F2, "
    6. sSql &= "F3, "
    7. sSql &= "F4 "
    8. sSql &= "FROM [Tabelle4$]"
    9. sSql &= " Where F1 <> NULL;"
    10. MsgBox(sSql)
    11. Using connection As New OleDbConnection(connectionString)
    12. Dim cmd As New OleDbCommand(sSql, connection)
    13. connection.Open()
    14. Dim dr As OleDbDataReader = cmd.ExecuteReader()
    15. Using Writer As New System.IO.StreamWriter("E:\TestFolder\Kasi.csv")
    16. 'CSV Header schreiben
    17. Writer.WriteLine(String.Format("{0};{1};{2}", "Spalte1", "Spalte2", "Spalte4"))
    18. If dr.HasRows Then '
    19. Do While dr.Read() 'hier daten in CSV schreiben
    20. Writer.WriteLine(String.Format("{0};{1};{2}", dr("F1"), dr("F2"), dr("F4")))
    21. Loop
    22. Else
    23. 'nix da
    24. Debug.Print("keine Daten")
    25. End If
    26. dr.Close()
    27. End Using
    28. End Using
    29. End Sub
    @Kasi: Ich benutze aktuell die Variante von RofFromGermany. Vielen Dank für Deine Hilfe.

    @ThomasG82: Ich habe nun diesen connection-string verwendet:

    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & "; Extended Properties=""Excel 12.0 Macro; HDR=YES"";
    Ergebnis: Die Daten fehlen

    Mit
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & "; Extended Properties=""Excel 12.0 Macro; HDR=NO"";
    Ergebnis: Die Daten fehlen

    Mit
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & "; Extended Properties=""Excel 12.0 Macro; HDR=NO; IMEX=1"";
    liest er fehlerfrei alles als strings ein, auf die Header kann ich verzichten.

    Ist die einzige Combo die das gewünschte Ergebnis liefert.
    Und das ist mal weit von dem entfernt, was die "connection" website schreibt... ?

    Ich habe auf der "Connection" website viel gelesen, nach meinem Verständnis ist da ein Fehler in der Dokumentation oder Funktionalität.
    Oder mach ich noch irgendetwas falsch ?

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mabbi“ ()

    @Kasi: connectionstrings.com/excel/
    Such dort mal bitte nach "xlsm".


    Xlsm files

    Connect to Excel 2007 (and later) files with the Xlsm file extension. That is the Office Open XML format with macros enabled.

    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=c:\myFolder\myExcel2007file.xlsm;Extended Properties="Excel 12.0 Macro;HDR=YES";

    "HDR=Yes;" indicates that the first row contains columnnames, not data. "HDR=No;" indicates the opposite.

    @Mabbi
    Ich würde dir raten deinen String zu lassen wie du ihn hättest. Also:
    Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & path & ";Extended Properties="Excel 12.0 Xml;HDR=NO;IMEX=1";

    Du musst dich nur vom Punkt HDR verabschieden. Das wird wohl in einer XLSM nicht funktionieren. Das einzige, was du probieren könntest, um zu wissen ob es ein Fehler in der API ist, die Datei als XLSX abzuspeichern und dann einlesen lassen.

    HAUPTSACHE ist jedoch:
    Wenn HDR=YES dann alles andere nur ZAHLEN.
    Wenn HDR=NO dann alles andere ZAHLEN und TEXT

    Im Endeffekt musst du entscheiden ob du es als MACRO oder XML einlesen lässt. Da du vermutlich die Marcos in der Mappe nicht benötigst geht ja auch XML. Es könnte allerdings passieren, dass wenn ein Makro in einer Zelle liegt er dir dann einen Import Fehler ausgibt

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ThomasG82“ ()

    Jo, das ist so'n Excel-Tick. Oder ein Tick von OleDb.
    Beim Einlesen rät der OleDb den Spalten-Datentyp - wenn da also etwas steht, was als Zahl durchgehen könnte rät er "Zahl"
    WEnn in weiteren Zeilen dann da Text erscheint liest er das einfach nicht ein, sondern lässt den Wert ungesetzt.

    Der Trick mit HDR=No ist also zielführend, weil dann liest er die Überschriften als Daten ein, und stellt fest: Alles Strings.
    Die Weiteren Daten werden folglich sämtlich als String eingelesen, was ja (zunächst) auch die wenigsten Probleme macht.

    ThomasG82 schrieb:

    @Mabbi

    Im Endeffekt musst du entscheiden ob du es als MACRO oder XML einlesen lässt. Da du vermutlich die Marcos in der Mappe nicht benötigst geht ja auch XML. Es könnte allerdings passieren, dass wenn ein Makro in einer Zelle liegt er dir dann einen Import Fehler ausgibt


    Hallo Thomas G82,
    mich interessieren nur die Rohdaten, in dem abgefragten ExcelBlatt sind auch keine Makros drin, die Excel Mappe enthält über tausend Zeilen Makros.
    Danke für den Hinweis.

    Der Trick mit HDR=No ist also zielführend, weil dann liest er die Überschriften als Daten ein, und stellt fest: Alles Strings.
    Die Weiteren Daten werden folglich sämtlich als String eingelesen, was ja (zunächst) auch die wenigsten Probleme macht.

    @ErfinderDesRads: Danke, das bestätigt meine Annahme, das für die gesamte Spalte beim Einlesen der Datentyp anhand der ersten eingelesenen Zelle festgelegt wird.
    Ich werde den Workaround mit "OHNE Header" nutzen, die Daten verarbeite ich eh alle als string weiter zum befüllen einer Datenbank. Danach lösche ich den(das?) DataTable sowieso wieder.

    Das Thema sehe ich als erfolgreich gelöst an, vielen Dank für Eure Hilfe.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Mabbi“ ()