WPF DataGrid中有很好的默认特性,它将选定的单元格复制到剪贴板中,因此我们可以在其他应用程序中使用它。但是,似乎复制过程在性能上可以得到改进,而且还存在某种类型的.错误在粘贴到excel时我想,需要修复。
复制错误(不正确的excel使用)的步骤
A.1)从WPF DataGrid复制单元格,包含带有或不带前导零的文本值(例如"001";"002";"1";"12345";"ABC";“0 ABC”)
A.2)将复制的数据粘贴到excel中。预计将保留前导零,但如果可能的话,excel将将数值转换为数字数据格式(默认情况下,单元格数据类型为General,由它来完成)。
复制错误(正确使用excel )的步骤
B.1)从WPF DataGrid复制单元格,包含带有或不带前导零的文本值(例如"001";"002";"1";"12345";"ABC";“0 ABC”)
B.2)选择目标excel文件中的所有单元格,并将单元格数据类型更改为文本
B.3)将复制的数据粘贴到excel中。它是预期的,领先的零将被保留,但他们也离开了!
步骤查看excel (正确使用excel )中的预期结果
C.1)将相同的数据从记事本复制到剪贴板
C.2)选择目标excel文件中的所有单元格,并将单元格数据类型更改为文本
C.3)将复制的数据粘贴到excel中。这是预料中,领先的零将被保留,现在它是真的。我们可以看到与源数据相同的数据。所见即所得
我开始查看剪贴板数据,以找出B.1和C.1之间的区别(我还从excel复制了相同的数据,并检查了它.)。在微软的C#剪贴板查看器示例的帮助下,我发现了以下内容:
从Notepad++复制的数据剪贴板数据格式:
- Text (native)
- UnicodeText (native)
- System.String (autoconvertable)
- Locale (native)
- OEMText (native)
从WPF DataGrid复制的数据剪贴板数据格式:
- HTML Format (native)
- Csv (native)
- Text (native)
- UnicodeText (native)
- System.String (autoconvertable)
从Excel复制的数据剪贴板数据格式:
- EnhancedMetafile (native)
- System.Drawing.Imaging.Metafile (autoconvertable)
- MetaFilePict (native)
- Bitmap (native)
- System.Drawing.Bitmap (autoconvertable)
- System.Windows.Media.Imaging.BitmapSource (autoconvertable)
- Biff12 (native)
- Biff8 (native)
- Biff5 (native)
- SymbolicLink (native)
- DataInterchangeFormat (native)
- XML Spreadsheet (native)
- HTML Format (native)
- Text (native)
- UnicodeText (native)
- System.String (autoconvertable)
- Csv (native)
- Hyperlink (native)
- Rich Text Format (native)
- Embed Source (native)
- Object Descriptor (native)
- Link Source (native)
- Link Source Descriptor (native)
- Link (native)
- Format129 (native)
那么,在B.3步骤中解决问题的最佳方法是什么呢?我想知道目前有两种选择:
选项#1
了解如何向wpf数据集解释,它需要以特定格式将数据设置为剪贴板。
选项2
第二个选项是使用我自己的函数来处理Ctrl+C,它将运行在选定的单元格中,对话到数据集后面的视图,获取正确的数据,附加到字符串生成器并将文本设置到剪贴板。
对于上述B.3,您认为最好的解决方案是什么?
发布于 2014-05-14 16:36:12
好的。既然我说的是从WPF DataGrid复制到剪贴板.我查看了datagrid的源代码(我应该在此之前想出这个想法,而不是问这个问题)。
因此,源中副本处理程序的一部分是:
// Supported default formats: Html, Text, UnicodeText and CSV
Collection<string> formats = new Collection<string>(new string[] { DataFormats.Html, DataFormats.Text, DataFormats.UnicodeText, DataFormats.CommaSeparatedValue });
因此,简单的答案是:选项1是不可能的(换句话说,剪贴板的sinse数据格式是硬编码的,不可能影响这一点)。选项2是可以的。但是现在我认为继承方法是有意义的。
protected virtual void OnExecutedCopy(ExecutedRoutedEventArgs args)
这将给我很好的解决所有案件的办法。
发布于 2021-11-10 12:47:22
我发现DataFormats.Html是问题所在。更改Excel目标单元格格式文本。
protected override void OnExecutedCopy(ExecutedRoutedEventArgs args)
{
base.OnExecutedCopy(args);
var data = Clipboard.GetDataObject();
DataObject dataObject = new DataObject();
foreach (var format in data.GetFormats())
{
//We copy all formats, but DataFormats.Html,
//DataFormats.Html messed up paste in Excel very long number (15 pos +) and leading zero's
//You need to set the cell format to text before paste
if (format != DataFormats.Html)
dataObject.SetData(format, data.GetData(format), true);
}
Clipboard.SetDataObject(dataObject);
}
https://stackoverflow.com/questions/23648412
复制相似问题