Буфер обмена.SetText ()
System.Windows.Forms.Clipboard.SetText(
"1,2,3,4\n5,6,7,8",
System.Windows.Forms.TextDataFormat.CommaSeparatedValue
);
Буфер обмена.SetData ()
System.Windows.Forms.Clipboard.SetData(
System.Windows.Forms.DataFormats.CommaSeparatedValue,
"1,2,3,4\n5,6,7,8",
);
В обоих случаях что-то помещается в буфер обмена, но при вставке в Excel отображается как одна ячейка с лишним текстом: «–§žý; pC¦yVk²ˆû»
Как показывает ответ BFree, SetText с TextDataFormat служит обходным путем
System.Windows.Forms.Clipboard.SetText(
"1\t2\t3\t4\n5\t6\t7\t8",
System.Windows.Forms.TextDataFormat.Text
);
Я пробовал это и подтверждаю, что теперь вставка в Excel и Word работает правильно. В каждом случае он вставляется в виде таблицы с ячейками вместо открытого текста.
Все еще любопытно, почему CommaSeparatedValue работает нет.





Используйте табуляторы вместо запятых. то есть:
Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);
Просто протестировал это сам, и у меня это сработало.
Приятно знать, что Excel более снисходительно относится к вкладкам в этом отношении.
Будьте осторожны, потому что Excel будет пытаться интерпретировать значения, начинающиеся с таких операторов, как *, +, -, как формулы. Я не уверен, удастся ли CSV решить эту проблему.
Мне удалось вставить в Excel, используя \ t (см. Ответ BFree) в качестве разделителей столбцов и \ n в качестве разделителей строк.
.NET Framework помещает DataFormats.CommaSeparatedValue в буфер обмена как текст Unicode. Но, как упоминалось в http://www.syncfusion.com/faq/windowsforms/faq_c98c.aspx#q899q, Excel ожидает, что данные CSV будут потоком памяти UTF-8 (трудно сказать, виноват ли .NET или Excel в несовместимости).
Решение, которое я придумал в моем собственном приложении, - разместить две версии табличных данных в буфере обмена одновременно как текст с разделителями табуляции и как поток памяти CSV. Это позволяет целевому приложению получать данные в предпочтительном формате. Блокнот и Excel предпочитают текст, разделенный табуляцией, но вы можете заставить Excel получить данные CSV с помощью команды Специальная вставка ... в целях тестирования.
Вот пример кода (обратите внимание, что здесь используются эквиваленты WinForms из пространств имен WPF):
// 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);
Есть мысли о том, как это могут сделать те из нас, кто не пользуется .net? Возможно ли это, если вы готовы с головой окунуться в правила appdomain / marshalling / com-object? Может быть, я просто буду придерживаться /t в соответствии с другими ответами.
Я попробовал метод CSV, но тоже не смог заставить его работать - похоже, что вкладки - это лучший вариант.