Question

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". placer les données sous forme de cellules dans Excel
  • Windows accepte un format appelé "CommaSeparatedValue". qui est utilisé avec ses API donc cela semble possible
  • Mettre du texte brut dans le presse-papiers, mais essayer d'utiliser ce format ne fonctionne pas
  • REMARQUE: je peux récupérer correctement les données CSV du presse-papiers. Mon problème est de coller des 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 ()

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 je confirme que le collage dans Excel et Word fonctionne correctement. Dans chaque cas, il est collé sous forme de tableau avec des cellules au lieu d'un texte en clair.

Toujours curieux de savoir pourquoi CommaSeparatedValue ne ne fonctionne pas.

Était-ce utile?

La solution

Le .NET Framework place DataFormats.CommaSeparatedValue dans le presse-papiers en tant que texte Unicode. Mais comme mentionné à la 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 responsable de l'incompatibilité).

La solution que j'ai trouvée 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 sous forme 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 obliger 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);

Autres conseils

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

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

Je viens de tester cela moi-même et cela a fonctionné pour moi.

J'ai réussi à coller dans Excel avec \ t (voir la réponse de BFree) comme séparateur de colonne et \ n comme séparateur de ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top