Andreas Ploetzeneder

DatagridView in Excel exportieren

Immer wieder ist es nötig ein DataGridView unter Excel zu speichern. Hierzu gibt es von Microsoft eigene Funktionen. Oftmals ist es aber besser das selbst zu schreiben. Zum einen sind die Dateien schlanker, zum anderen erfordert diese Variante kein installiertes Office am PC:

 

Public Sub exportExcel(ByVal grdView As DataGridView, ByVal filePath As String)

        ' Open the file and write the headers
        Dim fs As New IO.StreamWriter(filePath, False)
        fs.WriteLine("<?xml version=""1.0""?>")
        fs.WriteLine("<?mso-application progid=""Excel.Sheet""?>")
        fs.WriteLine("<ss:Workbook xmlns:ss=""urn:schemas-microsoft-com:office:spreadsheet"">")
        ' Create the styles for the worksheet
        fs.WriteLine("  <ss:Styles>")
        ' Style for the column headers
        fs.WriteLine("    <ss:Style ss:ID=""1"">")
        fs.WriteLine("      <ss:Font ss:Bold=""1""/>")
        fs.WriteLine("      <ss:Alignment ss:Horizontal=""Center"" ss:Vertical=""Center"" " & _
            "ss:WrapText=""1""/>")
        fs.WriteLine("      <ss:Interior ss:Color=""#C0C0C0"" ss:Pattern=""Solid""/>")
        fs.WriteLine("    </ss:Style>")
        ' Style for the column information
        fs.WriteLine("    <ss:Style ss:ID=""2"">")
        fs.WriteLine("      <ss:Alignment ss:Vertical=""Center"" ss:WrapText=""1""/>")
        fs.WriteLine("    </ss:Style>")
        fs.WriteLine("  </ss:Styles>")
        ' Write the worksheet contents
        fs.WriteLine("<ss:Worksheet ss:Name=""Measurement Results"">")
        fs.WriteLine("  <ss:Table>")
        For i As Integer = 0 To grdView.Columns.Count - 1
            fs.WriteLine(String.Format("    <ss:Column ss:Width=""{0}""/>", _
            grdView.Columns.Item(i).Width))
        Next
        fs.WriteLine("    <ss:Row>")
        For i As Integer = 0 To grdView.Columns.Count - 1
            fs.WriteLine(String.Format("      <ss:Cell ss:StyleID=""1"">" & _
                "<ss:Data ss:Type=""String"">{0}</ss:Data></ss:Cell>", _
                grdView.Columns.Item(i).HeaderText))
        Next
        fs.WriteLine("    </ss:Row>")

        ' Check for an empty row at the end due to Adding allowed on the DataGridView
        Dim subtractBy As Integer, cellText As String
        If grdView.AllowUserToAddRows = True Then subtractBy = 2 Else subtractBy = 1
        ' Write contents for each cell
        For i As Integer = 0 To grdView.RowCount - subtractBy
            fs.WriteLine(String.Format("    <ss:Row ss:Height=""{0}"">", _
                grdView.Rows(i).Height))
            For intCol As Integer = 0 To grdView.Columns.Count - 1
                cellText = grdView.Item(intCol, i).Value
                ' Check for null cell and change it to empty to avoid error
                If cellText = vbNullString Then cellText = ""
                fs.WriteLine(String.Format("      <ss:Cell ss:StyleID=""2"">" & _
                    "<ss:Data ss:Type=""String"">{0}</ss:Data></ss:Cell>", _
                    cellText.ToString))
            Next
            fs.WriteLine("    </ss:Row>")
        Next
        ' Close  the document
        fs.WriteLine("  </ss:Table>")
        fs.WriteLine("</ss:Worksheet>")
        fs.WriteLine("</ss:Workbook>")
        fs.Close()

    End Sub

 


Gästebucheintrag
Der Beitrag hat Ihnen weitergeholfen?
Dann würde ich mich sehr über einen Eintrag in mein Gästebuch freuen.
Jetzt eintragen 

Der Code kann hier gedownloaded werden : Download

 
Kommentare (5)
Genau was ich gesucht habe :-)
5 Mittwoch, 28. Oktober 2009 um 09:50 Uhr
Michael
Eine feine Routine. Die Möglichkeit über OleProvider das ganze zu machen wäre vermutlich deutlich schneller, aber in meinem Fall war diese Routine genau was ich suchte. Danke :)
jo e ...
4 Freitag, 28. August 2009 um 05:31 Uhr
Andreas
Hallo,
wie ich e schon geschrieben habe oder?

lg Admin
Double-Konvert
3 Mittwoch, 26. August 2009 um 15:05 Uhr
Julian
Hast dus schon mit "Replace" versucht? also zum beispiel ds.Tables("Tabelle").Rows(3).Items(4).ToString.Replace(".", ",")

sry, falls dir diese antowrt blöde vorkommt ;) :$
Vorschlag
2 Dienstag, 25. August 2009 um 08:23 Uhr
Administrator
Es kann natuerlich sein dass ich falsch liege, da ich das noch nicht ausprobiert habe.

Ich wuerde das wie folgt angehen:
In der Zeile:
cellText = grdView.Item(intCol, i).Value

wuerde ich stattdessten:
cellText = grdView.Item(intCol, i).Value.ToString().Replace(".",",")

schreiben
Verwendung von Zahlenwerten + Double-Wert Problem (Punkt/Komma)
1 Mittwoch, 19. August 2009 um 08:33 Uhr
Robert
Hallo,

nachdem man einen DataGrid erstellt hat, funktioniert die Übertragung in ein Excel Dokument sehr gut und vorallem schnell!
Nur leider habe ich noch Probleme mit bei der weiteren Bearbeitung der Excel Tabellen, wenn Zahlenwerte übergeben werden....

Wenn die Datenwerte per --> ss:Type=""String"" übergeben werden, werden die Zahlenwerte als Text in die Excel Tabellen eingetragen und man kann sie nicht sofort weiter bearbeiten. Es ist erst eine manuelle Format-Umwandlung in Typ Zahl nötig.
Dies kann man umgehen, wenn man u.a. --> ss:Type=""Number"" verwendet und z.B. einen Double Wert übergibt. Dann taucht aber das zweite Problem auf, zu dem ich noch keine Lösung gefunden habe:
In dem DataGridView habe ich einen Double-Wert von z.B. 0.854. In dem späteren Excel Dokument wird dieser Wert aber auf 854 geändert. (Es liegt am Format, da der Punkt als 1.000-er Trennzeichen interpretiert wird.)
Gibt es jetzt eine Möglichkeit direkt Double Werte aus dem DataGridView an das Excel Dokument zu übergeben und zwar so, dass diese auch danach sofort in dem Excel Dokument als Zahlen (!Kommazahlen!) erkannt werden?

Gruß
Robert

Kommentar hinzufügen

Ihr Name:
Titel:
Kommentar:
You are here: