Comment coller des données CSV dans le Presse-papiers Windows avec C#




clipboard paste (3)

Ce que j'essaie d'accomplir

  • Mon application génère des données tabulaires
  • Je souhaite que l'utilisateur puisse lancer Excel et cliquer sur "coller" pour placer les données sous forme de cellules dans Excel
  • Windows accepte un format appelé "CommaSeparatedValue" utilisé avec ses API, cela semble donc possible
  • Mettre du texte brut dans le presse-papiers fonctionne, mais essayer d'utiliser ce format ne
  • REMARQUE: Je peux récupérer correctement les données CSV à partir du presse-papiers. Mon problème concerne le collage de données CSV dans le Presse-papiers.

Ce que j'ai essayé ne fonctionne pas

Clipboard.SetText ()

System.Windows.Forms.Clipboard.SetText(  
  "1,2,3,4\n5,6,7,8", 
  System.Windows.Forms.TextDataFormat.CommaSeparatedValue
  );

Clipboard.SetData ()

System.Windows.Forms.Clipboard.SetData(
  System.Windows.Forms.DataFormats.CommaSeparatedValue,
  "1,2,3,4\n5,6,7,8", 
  );

Dans les deux cas, quelque chose est placé dans le presse-papiers, mais lorsqu'il est collé dans Excel, il apparaît sous la forme d'une cellule de texte garbarge: "-§žý; pC|yVk²û"

Mise à jour 1: solution de contournement à l'aide de SetText ()

Comme la réponse de BFree montre que SetText avec TextDataFormat sert de solution de contournement

System.Windows.Forms.Clipboard.SetText(  
  "1\t2\t3\t4\n5\t6\t7\t8", 
  System.Windows.Forms.TextDataFormat.Text
  );

J'ai essayé ceci et confirme que coller maintenant dans Excel et Word fonctionne correctement. Dans chaque cas, il colle sous forme de tableau avec des cellules au lieu de texte en clair.

Toujours curieux de savoir pourquoi CommaSeparatedValue ne fonctionne pas .


Le .NET Framework place DataFormats.CommaSeparatedValue dans le Presse-papiers en tant que texte Unicode. Mais comme mentionné à l' http://www.syncfusion.com/faq/windowsforms/faq_c98c.aspx#q899q , Excel s'attend à ce que les données CSV soient un flux de mémoire UTF-8 (il est difficile de dire si .NET ou Excel est en faute pour l'incompatibilité).

La solution que je propose dans ma propre application consiste à placer deux versions des données tabulaires dans le presse-papiers simultanément sous forme de texte délimité par des tabulations et de flux de mémoire CSV. Cela permet à l'application de destination d'acquérir les données dans son format préféré. Le Bloc-notes et Excel préfèrent le texte délimité par des tabulations, mais vous pouvez forcer Excel à récupérer les données CSV via la commande Collage spécial ... à des fins de test.

Voici un exemple de code (notez que les équivalents WinForms des espaces de noms WPF sont utilisés ici):

// 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);

J'ai réussi à coller dans Excel en utilisant \ t (voir la réponse de BFree) comme séparateurs de colonnes et \ n comme séparateurs de lignes.


Utilisez des tabulations au lieu de virgules. c'est à dire:

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

Je l'ai juste testé moi-même et ça a fonctionné pour moi.





paste