Excel Tabelle mit Hyperlinks in Datagridview laden.

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

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel Tabelle mit Hyperlinks in Datagridview laden.

    Guten Tag zusammen,

    mal wieder benötige ich ein wenig hilfe.

    Es geht darum eine exceltabelle in ein DGV zu laden.
    Das funktioniert soweit auch, nur werden die Hyperlinks nicht mit übertragen.
    Gibt es eine möglichkeit diese mit anzuzeigen?

    Mein Code bisher:

    VB.NET-Quellcode

    1. Dim xDset As System.Data.DataSet
    2. Dim xConn As System.Data.OleDb.OleDbConnection
    3. Dim xAdapter As System.Data.OleDb.OleDbDataAdapter
    4. ' Connection-String für die DB.Verbindung zur Excel-Datei
    5. Dim sConn As String = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=datei; Extended Properties=Excel 8.0;"
    6. ' Connection herstellen
    7. xConn = New System.Data.OleDb.OleDbConnection(sConn)
    8. xAdapter = New System.Data.OleDb.OleDbDataAdapter( _
    9. "SELECT * FROM [" & sTable & "$]", xConn)
    10. xDset = New System.Data.DataSet
    11. Try
    12. xAdapter.Fill(xDset)
    13. ' DataGrid füllen und Daten anzeigen
    14. With DataGridView2
    15. .DataSource = xDset.Tables(0)
    16. .ReadOnly = True
    17. .Refresh()
    18. End With
    19. DataGridView1.= New System.Windows.Forms.DataGridViewLinkColumn
    20. Catch ex As Exception
    21. MsgBox("Fehler beim Anzeigen der Excel-Daten!")
    22. Finally
    23. xConn.Close()
    24. End Try
    Nicht mit OleDB.
    Hyperlinks zählen nicht zu den Daten.
    Wenn du das möchtest, musst du die Excel-Datei direkt verarbeiten (Office.Interop).

    Falls du die Excel-Datei selbst im Griff hast, kannst du ja eine (versteckte?) Zusatzspalte mit den Informationen der Hyperlinks anlegen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    hi, danke für deine Antwort.

    ich habe jetzt dank Hilfe von Google folgendes gebastelt:


    VB.NET-Quellcode

    1. Dim xlApp As New Microsoft.Office.Interop.Excel.Application
    2. Dim xlWB As Microsoft.Office.Interop.Excel.Workbook = xlApp.Workbooks.Open("Pfad")
    3. Dim xlWS As Microsoft.Office.Interop.Excel.Worksheet = xlWB.Worksheets("Ziel")
    4. DataGridView3.RowCount = xlWS.UsedRange.Rows.Count - 1
    5. DataGridView3.ColumnCount = xlWS.UsedRange.Columns.Count
    6. Try
    7. For c As Integer = 1 To xlWS.UsedRange.Columns.Count
    8. DataGridView3.Columns(c - 1).HeaderText = xlWS.UsedRange.Cells(1, c).Value
    9. Next
    10. For r As Integer = 2 To xlWS.UsedRange.Rows.Count
    11. For c As Integer = 1 To xlWS.UsedRange.Columns.Count
    12. With DataGridView3(c - 1, r - 2)
    13. .Value = xlWS.UsedRange.Cells(r, c).Value
    14. .Style.BackColor = ColorTranslator.FromOle(xlWS.UsedRange.Cells(r, c).Interior.Color)
    15. End With
    16. Next
    17. Next
    18. Catch ex As Exception
    19. MsgBox(ex.Message)
    20. Finally
    21. xlWS = Nothing
    22. xlWB.Close(False)
    23. xlWB = Nothing
    24. xlApp.Quit()
    25. xlApp = Nothing
    26. End Try


    mir werden noch immer keine Hyperlinks angezeigt, muss ich noch irgendwas einstellen? formatieren? oder habe ich dich falsch verstanden?
    außerdem ist mir aufgefallen das es auf diese art relativ lang dauert bis das dgv gefüllt ist. gibt es eine möglichkeit das zu beschleunigen?
    Die excel liegen leider nicht in meiner Obhut, werden außerdem ständig vom sharepoint geupdatet.
    Hinter jeder Zelle liegt eine Collection von Hyperlinks (die meist leer ist oder nur einen Eintrag hat).

    VB.NET-Quellcode

    1. For Each HypLink in xlWS.UsedRange.Cells(r, c).HyperLinks
    2. Debug.Print(HypLink.Address)
    3. Next

    Alternativ hat das Worksheet auch noch eine Auflistung aller darin befindlichen Hyperlinks

    VB.NET-Quellcode

    1. For Each HypLink in xlWS.HyperLinks
    2. Debug.Print(HypLink.Address)
    3. Next

    Nimm, was dir besser gefällt.

    Julia89 schrieb:

    außerdem ist mir aufgefallen das es auf diese art relativ lang dauert bis das dgv gefüllt ist.
    Klar, der Overhead, den du erzeugst ist um ein Vielfaches höher.

    Wie groß ist denn UsedRange?
    Beachte, dass der wesentlich größer sein kann, als nur die gefüllten Zellen.
    Notfalls schränkst du deine Schleifenbegrenzung ein auf
    For r As Integer = 2 To xlWS.Cells(xlWS.UsedRange.Rows.Count,1).End(xlup).Row
    und
    For c As Integer = 1 To xlWS.Cells(1,xlWS.UsedRange.Columns.Count).End(xlToLeft).Column
    xlUp und xlToLeft sind irgendwo in Office.Interop als Konstanten definiert, die genaue Bezeichnung weiss ich nicht auswendig.

    Aber du kannst nicht alles haben.
    Entweder Geschwindigkeit und nur Daten.
    Oder die Hintergrundinformationen der Zellen und dafür die Performance-Einbuße.

    Edit:
    Du kannst im übrigen die Daten auch als komplettes Array auslesen, das du ggf an dein DGV binden kannst:
    DataArray = xlWS.UsedRange.Value
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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