在C#中,可以强制Clipboard.GetData在每个CSV值周围输出引号吗?

时间:2014-06-09 15:24:58

标签: c# wpf clipboard

在C#中,我使用以下代码将数据从WPF DataGrid复制到剪贴板,然后从剪贴板复制到CSV:

var originalSelectionMode = dataGrid.SelectionMode;
dataGrid.SelectionMode = DataGridSelectionMode.Extended;
dataGrid.SelectAllCells();
dataGrid.ClipboardCopyMode = DataGridClipboardCopyMode.IncludeHeader;
ApplicationCommands.Copy.Execute(null, dataGrid);
dataGrid.UnselectAllCells();

// this is the line that's not working quite right:
var text = (string)Clipboard.GetData(DataFormats.CommaSeparatedValue);

Clipboard.Clear();
dataGrid.SelectionMode = originalSelectionMode;

File.WriteAllText(fullPathToFile, text);

此代码适用于大多数情况,但如果在其中一个单元格中有多行文本,则会出现问题。我们假设您在这样的网格中有数据:

A     |B     |C
-------------------
A1    |B1    |C1a,C2b
-------------------
A2    |B2    |C2a
      |      |C2b
-------------------

如果您的单元格内容中有逗号或双引号字符,Clipboard.GetData函数似乎只会在单元格内容周围插入双引号,但如果您在单元格内容中有逗号或双引号字符,则不会自动插入双引号你有一个换行符,所以上面网格的输出看起来像这样:

A,B,C
A1,B1,"C1a,C1b"
A2,B2,C2a
C2b

请注意,它确实在单元格C1周围放置引号,但不在单元格C2中放置引号。

有没有办法可以强制Clipboard.GetData始终在每个单元格周围加上引号?如果没有,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

最简单的方法是使用数据绑定并将字符串写入csv。我创建了一个示例类,可以绑定到DataGrid并允许创建/编辑新行(如果需要,可以在此类上添加通知):

 public class Data
{
    public Data()
    {
    }

    public Data(string col1, string col2, string col3)
    {
        Col1 = col1;
        Col2 = col2;
        Col3 = col3;
    }

    public string Col1 { get; set; }
    public string Col2 { get; set; }
    public string Col3 { get; set; }
}

现在我覆盖datagrid的Copy命令来控制自定义复制:

 this.DataGrid.CommandBindings.Add(new CommandBinding(ApplicationCommands.Copy,
            new ExecutedRoutedEventHandler(CopyClicked)));

在CopyClicked中,我们使用Data ViewModel绑定类创建数据:

 private void CopyClicked(object sender, ExecutedRoutedEventArgs e)
    {
        var stringBuilder = new StringBuilder();
        IList l = this.DataGrid.SelectedItems;
        foreach (Data data in l)
        {
            stringBuilder.Append("\"" + data.Col1 +"\",");
            stringBuilder.Append("\"" + data.Col2 + "\",");
            stringBuilder.Append("\"" + data.Col3 + "\"");
            stringBuilder.AppendLine();
        }
        //Write to a file or straight to clipboard etc
        Debug.WriteLine(stringBuilder.ToString());
    }