【问题标题】:Line breaks lost when exporting datagrid to excel in CSV format WPF以 CSV 格式 WPF 将数据网格导出到 excel 时,换行符丢失
【发布时间】:2016-11-29 07:54:48
【问题描述】:

假设某些单元格中没有换行符,这可以正常工作。

        dgvResults.SelectAllCells()
        dgvResults.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader
        ApplicationCommands.Copy.Execute(Nothing, dgvResults)
        Dim result As [String] = DirectCast(Clipboard.GetData(DataFormats.CommaSeparatedValue), String)
        Clipboard.Clear()
        dgvResults.UnselectAllCells()

        Try
            Dim file As New System.IO.StreamWriter("c:\export.csv")
            file.WriteLine(result)
            file.Close()
            Process.Start("c:\export.csv")
        Catch ex As Exception
            MessageBox.Show(ex.Message, "Error")
        End Try

这就是我添加换行符的方式

        Dim x As New List(Of String)
        For Each item In res.Properties("proxyaddresses")
            x.Add(item)
        Next
        AllSMTPAddresses = String.Join(ControlChars.Lf, x)

当我导出这个时,它没有考虑到有换行符,并且完全忽略了它们......所以 excel 格式有点不稳定。我尝试过:Environment.NewLine、vbCrLf,现在是 ControlChars.Lf。我认为 excel 不知道如何处理换行符,所以它只是做它想要的,并用它们创建新行。

知道我将如何攻击它吗?

更新结果@Jimmy

这就是它应该看起来的样子......

【问题讨论】:

  • 假设数据中没有逗号,result = """" & result.Replace(",", """,""") & """" 有帮助吗?

标签: wpf vb.net datagridview


【解决方案1】:

如果不在导出之前修改这些行,我认为这是不可能的。我找到了一些可能有帮助的示例代码,

  Public Sub writeCSV(grid1 As Object, outputFile As String)
    ' Create the CSV file to which grid data will be exported.
    Dim sw As New StreamWriter(outputFile)
    ' First we will write the headers.
    Dim dt As DataTable = DirectCast(grid1.DataSource, DataSet).Tables(0)

    Dim iColCount As Integer = dt.Columns.Count
    For i As Integer = 0 To iColCount - 1
        sw.Write(dt.Columns(i))
        If i < iColCount - 1 Then
            sw.Write(",")
        End If
    Next
    sw.Write(sw.NewLine)
    ' Now write all the rows.
    For Each dr As DataRow In dt.Rows
        For i As Integer = 0 To iColCount - 1
            sw.Write("""") 'lets encapsulate those fields in quotes, quoted csv file!
            If Not Convert.IsDBNull(dr(i)) Then
                sw.Write(dr(i).ToString())
            End If
            sw.Write("""")
            If i < iColCount - 1 Then
                sw.Write(System.Globalization.CultureInfo.CurrentCulture.TextInfo.ListSeparator)
            End If
        Next
        sw.Write(sw.NewLine)
    Next
    sw.Close()
End Sub

modified from here

【讨论】:

  • 如果它是 DataGridView 就可以了,我使用的是 DataGridControl。
  • 您确定您没有将其解释为数据视图吗?我知道那是另一回事。您是否使用现有控件对此进行了测试?
  • writeCSV(dgvResults, "c:\export.csv")
  • 我知道如何使用它@Jimmy Smith,它用于完全不同的控制。例如,datagrid 没有以下成员...行数,也没有单元格。我可以通过使用 items.count 来绕过行数,但不能使用单元格。 Headertext 也不是“datagrid”的成员,但可以使用 header 代替。顺便说一句,我使用的是 WPF 数据网格,而不是 winforms 数据网格视图。
  • 考虑到这一点,我不得不大幅改变答案。此代码必须改为访问底层数据源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-23
相关资源
最近更新 更多