C#で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に貼り付けると、ガーバージテキストの1つのセルとして表示されます:"–§ž&#253 ;; pC&#166 ; yVk²ˆû"
更新1:SetText()を使用した回避策
BFreeの答えが示すように、 TextDataFormat を含む SetText は回避策として機能します
System.Windows.Forms.Clipboard.SetText(
"1\t2\t3\t4\n5\t6\t7\t8",
System.Windows.Forms.TextDataFormat.Text
);
これを試してみましたが、ExcelとWordに正しく貼り付けられるようになりました。いずれの場合も、プレーンテキストではなくセルを含むテーブルとして貼り付けられます。
なぜCommaSeparatedValueが機能していないのか不思議に思っています。
解決
.NET Frameworkは、 DataFormats.CommaSeparatedValue
をUnicodeテキストとしてクリップボードに配置します。しかし、 http://www.syncfusion.com/faq/windowsforms/faq_c98cで言及されているように.aspx#q899q 、ExcelはCSVデータがUTF-8メモリストリームであることを期待します(.NETまたはExcelの非互換性が原因であるかどうかを判断するのは困難です)。
自分のアプリケーションで考え出した解決策は、2つのバージョンの表形式データをクリップボードに同時にタブ区切りテキストとCSVメモリストリームとして配置することです。これにより、宛先アプリケーションは、優先形式でデータを取得できます。メモ帳とExcelはタブ区切りテキストを好みますが、テスト用に[形式を選択して貼り付け...]コマンドを使用してExcelにCSVデータを強制的に取得させることができます。
サンプルコードを次に示します(WPF名前空間のWinFormsに相当するものがここで使用されていることに注意してください):
// 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);
他のヒント
コンマの代わりにタブを使用します。例:
Clipboard.SetText("1\t2\t3\t4\t3\t2\t3\t4", TextDataFormat.Text);
これを自分でテストしただけで、うまくいきました。
列区切り記号として\ t(BFreeの答えを参照)および行区切り記号として\ nを使用してExcelに貼り付けることに成功しました。