How to paste CSV data to Windows Clipboard with C#

后端 未结 3 425
暖寄归人
暖寄归人 2020-12-24 11:59

What I\'m trying to accomplish

  • My app generates some tabular data
  • I want the user to be able to launch Excel and click \"paste\" to place the data a
相关标签:
3条回答
  • 2020-12-24 12:39

    The .NET Framework places DataFormats.CommaSeparatedValue on the clipboard as Unicode text. But as mentioned at http://www.syncfusion.com/faq/windowsforms/faq_c98c.aspx#q899q, Excel expects CSV data to be a UTF-8 memory stream (it is difficult to say whether .NET or Excel is at fault for the incompatibility).

    The solution I've come up with in my own application is to place two versions of the tabular data on the clipboard simultaneously as tab-delimited text and as a CSV memory stream. This allows the destination application to acquire the data in its preferred format. Notepad and Excel prefer the tab-delimited text, but you can force Excel to grab the CSV data via the Paste Special... command for testing purposes.

    Here is some example code (note that WinForms-equivalents from the WPF namespaces are used here):

    // Generate both tab-delimited and CSV strings.
    string tabbedText = //...
    string csvText = //...
    
    // Create the container object that will hold both versions of the data.
    var dataObject = new System.Windows.DataObject();
    
    // Add tab-delimited text to the container object as is.
    dataObject.SetText(tabbedText);
    
    // Convert the CSV text to a UTF-8 byte stream before adding it to the container object.
    var bytes = System.Text.Encoding.UTF8.GetBytes(csvText);
    var stream = new System.IO.MemoryStream(bytes);
    dataObject.SetData(System.Windows.DataFormats.CommaSeparatedValue, stream);
    
    // Copy the container object to the clipboard.
    System.Windows.Clipboard.SetDataObject(dataObject, true);
    
    0 讨论(0)
  • 2020-12-24 12:44

    I have had success pasting into Excel using \t (see BFree's answer) as column separators and \n as row separators.

    0 讨论(0)
  • 2020-12-24 12:49

    Use tabs instead of commas. ie:

    Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);
    

    Just tested this myself, and it worked for me.

    0 讨论(0)
提交回复
热议问题