在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
始终在每个单元格周围加上引号?如果没有,我该如何解决这个问题?
答案 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());
}