34

私が達成しようとしていること

  • 私のアプリはいくつかの表形式のデータを生成します
  • ユーザーが Excel を起動し、[貼り付け] をクリックしてデータを Excel のセルとして配置できるようにしたい
  • Windows は、その API で使用される「CommaSeparatedValue」と呼ばれる形式を受け入れるため、これは可能であると思われます
  • 生のテキストをクリップボードに入れることはできますが、この形式を使用しようとすると機能しません
  • 注: クリップボードから CSV データを正しく取得できます。問題は、CSV データをクリップボードに貼り付けることです。

私が試したことはうまくいきません

クリップボード.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²ˆû" という 1 つのセルのガーバージ テキストとして表示されます。

更新 1: SetText() を使用した回避策

BFree's answer が示しているように、 TextDataFormatを使用したSetTextは回避策として機能します

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

これを試してみたところ、Excel と Word への貼り付けが正しく機能することが確認されました。いずれの場合も、プレーンテキストではなくセルを含むテーブルとして貼り付けられます。

なぜ CommaSeparatedValue が機能しないのか、まだ興味があります。

4

4 に答える 4

42

.NET FrameworkDataFormats.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);
于 2008-12-15T18:09:17.150 に答える
7

カンマの代わりにタブを使用してください。すなわち:

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

これを自分でテストしたところ、うまくいきました。

于 2008-12-01T03:35:33.940 に答える
4

\t (BFree の回答を参照) を列区切り記号として、\n を行区切り記号として使用して、Excel への貼り付けに成功しました。

于 2008-12-01T03:56:13.213 に答える