我一直在尝试将Silverlight中的一些数据网格导出为excel,但到目前为止还不成功。所以现在我只是想让它们作为csv文件导出,然后可以在excel中打开。我创建了一个类来导出datagrids,它确实导出并保存了一个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
结束班
答案 0 :(得分:1)
请尝试以下
Dim source As System.Collections.IEnumerable = TryCast(grid.ItemsSource, System.Collections.IEnumerable)
If source Is Nothing Then
Return ""
End If
另外,请确保使用调试器逐步执行代码,并查看失败的位置。