質問

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

  • 私のアプリはいくつかの表形式データを生成します
  • ユーザーが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に貼り付けることに成功しました。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top