私はSilverlightでいくつかのデータグリッドをエクスポートして優れたものにしようと試みてきましたが、これまでのところ成功していません。だから今私はそれらをExcelで開くことができるcsvファイルとしてエクスポートさせようとしています。データグリッドをエクスポートするために作成されたクラスがあり、csvファイルをエクスポートして保存します。ただし、csvファイルにはデータが含まれていません。
Imports System.IO
Public Class clsExportData
'Public Shared Sub Export(dg As DataGrid)
' SaveExportedGrid(ExportDataGrid(True, dg))
'End Sub
Public Shared Sub Export(dg As DataGrid, withHeaders As Boolean)
SaveExportedGrid(ExportDataGrid(withHeaders, dg))
End Sub
Private Shared Sub SaveExportedGrid(data As String)
Dim sfd As New SaveFileDialog()
sfd.DefaultExt = "csv"
sfd.Filter = "CSV Files (*.csv)|*.csv|All files (*.*)|*.*"
sfd.FilterIndex = 1
If If(sfd.ShowDialog(), False) Then
Using sr As New StreamWriter(sfd.OpenFile())
sr.Write(data)
End Using
End If
End Sub
Private Shared Function ExportDataGrid(withHeaders As Boolean, grid As DataGrid) As String
Dim colPath As String
Dim propInfo As System.Reflection.PropertyInfo
Dim binding As System.Windows.Data.Binding
Dim strBuilder As New System.Text.StringBuilder()
Dim source As System.Collections.IList = TryCast(grid.ItemsSource, System.Collections.IList)
If source Is Nothing Then
Return ""
End If
Dim headers As New List(Of String)()
grid.Columns.ToList().ForEach(Function(col)
If TypeOf col Is DataGridBoundColumn Then
headers.Add(FormatCSVField(col.Header.ToString()))
End If
End Function)
strBuilder.Append([String].Join(",", headers.ToArray())).Append(vbCr & vbLf)
For Each data As [Object] In source
Dim csvRow As New List(Of String)()
For Each col As DataGridColumn In grid.Columns
If TypeOf col Is DataGridBoundColumn Then
binding = TryCast(col, DataGridBoundColumn).Binding
colPath = binding.Path.Path
propInfo = data.[GetType]().GetProperty(colPath)
If propInfo IsNot Nothing Then
csvRow.Add(FormatCSVField(propInfo.GetValue(data, Nothing).ToString()))
End If
End If
Next
strBuilder.Append([String].Join(",", csvRow.ToArray())).Append(vbCr & vbLf)
Next
Return strBuilder.ToString()
End Function
Private Shared Function FormatCSVField(data As String) As String
Return [String].Format("""{0}""", data.Replace("""", """""""").Replace(vbLf, "").Replace(vbCr, ""))
End Function
エンドクラス