none
Excel Datei auslesen RRS feed

  • Frage

  • Hallo zusammen.

    Ich stelle meine Frage etwas unbedarft, das liegt leider daran das ich in dem Thema nicht sonderlich bewandert bin.

    Ich kann in eine Excel Tabelle z.B. in die Zelle B4 einen Wert schreiben. 
    Diesen Wert kann ich auch oben über der Tabelle bei "fx" schreiben. Im Feld Links daneben steht B4.
    In dieses Feld kann ich auch einen Namen schreiben, z.B. BetriebNr.
    Wie ist es möglich aus der Zelle, wenn ich über Zeile und Spalte iteriere, diesen Namen (BetriebNr) auszulesen?

    Gruss Peter

    Mittwoch, 17. Dezember 2014 15:05

Antworten

Alle Antworten

  • Excel bietet von Haus an eine eigene API für das .NET Framework an (wenn Excel installiert ist).

    Siehe dazu auch: https://support.microsoft.com/kb/302084/de

    Wenn du unabhängig von Excel sein möchtest, dann bedenke, dass das neue Excel-Format (*.xlsx) einfach nur eine .ZIP-Datei ist, die das .NET Framework bediehen kann.

    Wegen ZIP und .NET: http://msdn.microsoft.com/de-de/library/system.io.packaging.zippackage%28v=vs.110%29.aspx

    Dann kannst du die inneren Datein, die einfach nur normales XML sind manipulieren.

    .NET und Xml: http://msdn.microsoft.com/de-de/library/system.xml.xmldocument%28v=vs.110%29.aspx

    Ich hoffe ich konnte Helfen und freue mich auf eine Rückmeldung.


    (C) 2014 Thomas Roskop

    Mittwoch, 17. Dezember 2014 15:12
  • Hallo,
    mit was und wie iterierst du denn über die Zellen? Machst du das aus VBA (also direkt in Excel) oder über .NET? Welche Technik verwendest du unter .NET?

    Grundsätzlich ist es so, dass die Name-Eigenschaft die Zellenadresse zurück gibt. Der Name dieser Adresse ist dann der benutzerdefinierte Zellenname. In VBA also so:

    customName = Range("B2").Name.Name
    MsgBox customName
    Diese Eigenschaft müsste sich auch über Excel InterOp auslesen lassen.


    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    Mittwoch, 17. Dezember 2014 15:19
    Moderator
  • Hallo Thomas,

    vielen Dank für deinen Hinweis, ohne installierten Excel wäre auch nicht schlecht, jedoch bin ich vor XmlDocument zurückgeschreckt.

    Gruss Peter

    Mittwoch, 17. Dezember 2014 15:35
  • Hallo Tom,

    Dank für deine Antwort.

    Mit iterieren meine ich.

    Dim pos As Integer

    Dim o as Object

                For r = 7 To xlRange.Rows.Count
                    exRange = xlWorksheet.Cells(r, pos + 1)  
                    sH = exRange.Text
                    o=exRange.Name     'gibt eine Exception, wenn kein Name vorhanden ist
                    o = exRange.Name.namelocal   'hier kann ich den Namen finden, falls vorhanden
                   End If
                Next

    Aber wie geht's wenn kein Name angegeben ist?

    Gruss Peter

    Mittwoch, 17. Dezember 2014 15:40
  • Hallo,
    grundsätzlich kannst du natürlich immer mit den Zelladressen arbeiten. Wenn du ggf. den Namen wissen willst, kannst du das in einem try-catch-Block prüfen:
    For r = 1 To 5
        Dim exRange As Excel.Range = CType(xlWorksheet.Cells(r, 1), Range)
        Dim name As String = ""
        Try
            name = CType(exRange.Name, Name).Name.ToString()
        Catch ex As COMException
            If ex.HResult = &H800A03EC Then
                name = exRange.Address
            Else
                Throw ex
            End If
        End Try
        Console.WriteLine(name)
    Next




    Tom Lambert - C# MVP
    Wozu Antworten markieren und für Beiträge abstimmen? Klicke hier.
    Nützliche Links: .NET Quellcode | C# ↔ VB.NET Konverter | Account bestätigen (Verify Your Account)
    Ich: Webseite | Code Beispiele | Facebook | Twitter | Snippets

    • Als Antwort markiert peter haus Donnerstag, 18. Dezember 2014 09:29
    Mittwoch, 17. Dezember 2014 16:03
    Moderator
  • Hallo Peter,

    grundsätzlich kannst Du auch per JET (immer vorhanden, allerdings nur als 32 Bit) bzw. ACE (gibts für 32 und 64 Bit, muss aber grundsätzlich nachinstalliert werden und dann auch noch mit einer ggfs. vorhandenen Officeinstallation zusammenpassen) auf Exceldateien zugreifen.

    Wenn es Dateien im alten Excelformat sind, geht das bspw. so:

    Dim ConnectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=X:\Datei.xls;Extended Properties=Excel 8.0;"
    Dim Connection       As New OleDbConnection( ConnectionString )
    Dim DataAdapter      As New OleDbDataAdapter( "SELECT * FROM [Tabelle1$A:C]", Connection )
    Dim DataTable        As New DataTable( "Tabelle1" )
        DataAdapter.Fill( DataTable )
     
        ExcelData.DataSource = DataTable
        ExcelData.DataBind()
     
        DataTable.Dispose()
        DataAdapter.Dispose()
        Connection.Close()
        Connection.Dispose()

    Du kannst auch mit einer WHERE Klausel arbeiten, nur bestimmte Spalten auslesen, ... Ggfs. ist das zielführender.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Mittwoch, 17. Dezember 2014 16:30
    Moderator
  • Hallo Stefan,

    vielen Dank für deinen Hinweis, ich muss mal überlegen was ich verwenden möchte.
    Ich überlege auch gerade bezüglich XmlDocument. Falls du einen Link kennst, wie auf Excel Ranges mit Namen zugegriffen wird, könntest du in mir gerne senden.

    Gruss Peter

    Donnerstag, 18. Dezember 2014 09:28
  • Hallo Tom,

    das wäre eine Möglichkeit.

    Ich habe ´den Code so verwendet, da HResult nicht geht?? Ist Protected!

    Try
                        Name = CType(exRange.Name, Excel.Name).Name.ToString()
                    Catch ex As Runtime.InteropServices.COMException
                        'If ex.HResult = &H800A03EC Then

                        'End If
                        If ex.ErrorCode = -2146827284 Then
                            Name = exRange.Address
                        Else
                            Throw ex
                        End If

                    End Try

    Geht HResult bei dir?

    Gruss Peter


    • Bearbeitet peter haus Donnerstag, 18. Dezember 2014 09:46
    Donnerstag, 18. Dezember 2014 09:29