Как вставить данные CSV в буфер обмена Windows с помощью С#
Что я пытаюсь выполнить
- Мое приложение генерирует некоторые табличные данные
- Я хочу, чтобы пользователь мог запустить Excel и нажать "вставить", чтобы поместить данные в ячейки в Excel
- Windows принимает формат "CommaSeparatedValue", который используется с ним API, так что это кажется возможным
- Помещение сырого текста в буфер обмена работает, но попытка использовать этот формат не
- ПРИМЕЧАНИЕ. Я могу правильно получить CSV-данные из буфера обмена, моя проблема заключается в вставке CSV-данных в буфер обмена.
То, что я пробовал, не работает
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",
);
В обоих случаях что-то помещается в буфер обмена, но при вставке в Excel он отображается как одна ячейка текста garbarge: "-§žý; pC|yVk²û"
Обновление 1: обходной путь с использованием SetText()
Как показывает ответ BFree, SetText с TextDataFormat служит в качестве обходного пути
System.Windows.Forms.Clipboard.SetText(
"1\t2\t3\t4\n5\t6\t7\t8",
System.Windows.Forms.TextDataFormat.Text
);
Я пробовал это и подтвердил, что теперь вставка в Excel и Word работает правильно. В каждом случае он вставляется как таблица с ячейками вместо открытого текста.
Все еще интересно, почему CommaSeparatedValue не работает.
Ответы
Ответ 1
.NET Framework помещает DataFormats.CommaSeparatedValue
в буфер обмена как текст в Юникоде. Но, как упоминалось в http://www.syncfusion.com/faq/windowsforms/faq_c98c.aspx#q899q, Excel ожидает, что данные CSV будут потоком памяти UTF-8 (трудно сказать,.NET или Excel виноват в несовместимости).
В моем приложении я решил разместить две версии табличных данных в буфер обмена одновременно как текст с разделителями-табуляциями и как поток памяти CSV. Это позволяет целевому приложению получать данные в предпочтительном формате. Блокнот и Excel предпочитают текст с разделителями табуляции, но вы можете заставить Excel захватить данные CSV с помощью команды Paste Special... для тестирования.
Вот пример кода (обратите внимание, что здесь используются 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);
Ответ 2
Используйте вкладки вместо запятых. то есть:
Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);
Просто испытал это сам, и это сработало для меня.
Ответ 3
У меня было успешное вложение в Excel с использованием \t (см. ответ BFree) в качестве разделителей столбцов и \n в качестве разделителей строк.