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
a.ploetzeneder@hotmail.com
ploetzeneder
118145310
ploetzeneder
gmail.com
wie ich e schon geschrieben habe oder?
lg Admin
sry, falls dir diese antowrt blöde vorkommt ;) :$
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
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