ここでは、クリップボードにCSV形式のデータをコピーする方法と、クリップボードからCSV形式のデータを取得する方法を紹介します。Microsoft Excelなどの表計算ソフトは、通常CSV形式に対応していますので、これらのソフトとデータをコピー&ペーストできるようにしたい時に役に立ちます。
CSV形式のデータをクリップボードにコピーする時、通常は、次のような感じになるでしょう。
'Imports System.Windows.Forms 'コピーするCSV形式の文字列 Dim csv As String = "あ,い,う" & vbCrLf & "え,お,か" 'DataObjectを作成し、CSV形式のデータをセットする Dim data As New DataObject() data.SetData(DataFormats.CommaSeparatedValue, csv) 'クリップボードにコピーする Clipboard.SetDataObject(data)
//using System.Windows.Forms; //コピーするCSV形式の文字列 string csv = "あ,い,う\r\nえ,お,か"; //DataObjectを作成し、CSV形式のデータをセットする DataObject data = new DataObject(); data.SetData(DataFormats.CommaSeparatedValue, csv); //クリップボードにコピーする Clipboard.SetDataObject(data);
しかしこのようにコピーしたCSVデータは、正しくExcelに貼り付けることができません。上記のようにするとデータの文字コードはUTF8となりますが、Excelで利用できるようにするには、ANSI(日本語では、通常Shift JIS)にする必要があります。そのためには、ANSIにエンコードしたデータをMemoryStreamオブジェクトにして、DataObject.SetDataメソッドに渡します。
'Imports System.Windows.Forms 'コピーするCSV形式の文字列 Dim csv As String = "あ,い,う" & vbCrLf & "え,お,か" 'ANSI形式にエンコードする Dim bs As Byte() = System.Text.Encoding.Default.GetBytes(csv) 'MemoryStreamに変換する Dim ms As New System.IO.MemoryStream(bs) 'DataObjectを作成し、MemoryStreamのデータをセットする Dim data As New DataObject() data.SetData(DataFormats.CommaSeparatedValue, ms) 'クリップボードにコピーする Clipboard.SetDataObject(data)
//using System.Windows.Forms; //コピーするCSV形式の文字列 string csv = "あ,い,う\r\nえ,お,か"; //ANSI形式にエンコードする byte[] bs = System.Text.Encoding.Default.GetBytes(csv); //MemoryStreamに変換する System.IO.MemoryStream ms = new System.IO.MemoryStream(bs); //DataObjectを作成し、MemoryStreamのデータをセットする DataObject data = new DataObject(); data.SetData(DataFormats.CommaSeparatedValue, ms); //クリップボードにコピーする Clipboard.SetDataObject(data);
Text形式でコピーする場合は、タブ区切り(TSV)にすれば、Excelで貼り付けることができます。Text形式でコピーする方法について詳しくは、「クリップボードに文字列をコピーする」をご覧下さい。
'Imports System.Windows.Forms 'コピーするTSV形式の文字列 Dim tsv As String = "あ" & vbTab & "い" & vbTab & "う" & vbCrLf & _ "え" & vbTab & "お" & vbTab & "か" 'Text形式でコピーする Clipboard.SetText(tsv) '.NET Framework 1.1以前 'Clipboard.SetDataObject(tsv)
//using System.Windows.Forms; //コピーするTSV形式の文字列 string tsv = "あ\tい\tう\r\nえ\tお\tか"; //Text形式でコピーする Clipboard.SetText(tsv); //.NET Framework 1.1以前 //Clipboard.SetDataObject(tsv);
CSV形式とText形式の両方のデータをクリップボードに入れるならば、次のようになります。ちなみにこのデータをExcelに貼りつけると、Text形式のデータが使われるようです。
'Imports System.Windows.Forms 'コピーするCSV形式の文字列 Dim csv As String = "あ,い,う" & vbCrLf & "え,お,か" 'コピーするTSV形式の文字列 Dim tsv As String = "あ" & vbTab & "い" & vbTab & "う" & vbCrLf & _ "え" & vbTab & "お" & vbTab & "か" 'CSV形式の文字列をMemoryStreamに変換する Dim bs As Byte() = System.Text.Encoding.Default.GetBytes(csv) Dim ms As New System.IO.MemoryStream(bs) Dim data As New DataObject() 'CSV形式のデータをセットする data.SetData(DataFormats.CommaSeparatedValue, ms) 'Text形式でTSV形式の文字列をセットする data.SetData(DataFormats.Text, tsv) 'クリップボードにコピーする Clipboard.SetDataObject(data)
//using System.Windows.Forms; //コピーするCSV形式の文字列 string csv = "あ,い,う\r\nえ,お,か"; //コピーするTSV形式の文字列 string tsv = "あ\tい\tう\r\nえ\tお\tか"; //CSV形式の文字列をMemoryStreamに変換する byte[] bs = System.Text.Encoding.Default.GetBytes(csv); System.IO.MemoryStream ms = new System.IO.MemoryStream(bs); DataObject data = new DataObject(); //CSV形式のデータをセットする data.SetData(DataFormats.CommaSeparatedValue, ms); //Text形式でTSV形式の文字列をセットする data.SetData(DataFormats.Text, tsv); //クリップボードにコピーする Clipboard.SetDataObject(data);
ExcelでコピーしたCSV形式のデータをクリップボードから取得するには、コピーする方法と同じように、MemoryStreamオブジェクトとして取得します。
ただし、この記事の一番初めのコードのように、CSV文字列をそのままDataObject.SetDataメソッドに渡してコピーした場合は、MemoryStreamでは取得できず、文字列として取得します。
以下のサンプルでは、MemoryStreamで取得できる時はMemoryStreamで、文字列で取得できる時は文字列で取得しています。
'Imports System.Windows.Forms 'クリップボードのデータを取得する Dim data As IDataObject = Clipboard.GetDataObject() 'データがある時 If data IsNot Nothing Then 'CSV形式のデータを取得する Dim csvObj As Object = data.GetData(DataFormats.CommaSeparatedValue) If TypeOf csvObj Is System.IO.MemoryStream Then 'MemoryStreamとして取得する Dim ms As System.IO.MemoryStream = _ DirectCast(csvObj, System.IO.MemoryStream) 'エンコードして、文字列に変換する Dim str As String = _ System.Text.Encoding.Default.GetString(ms.ToArray()) Console.WriteLine(str) ElseIf TypeOf csvObj Is String Then '文字列として取得する Dim str As String = DirectCast(csvObj, String) Console.WriteLine(str) End If End If
//using System.Windows.Forms; //クリップボードのデータを取得する IDataObject data = Clipboard.GetDataObject(); //データがある時 if (data != null) { //CSV形式のデータを取得する object csvObj = data.GetData(DataFormats.CommaSeparatedValue); if (csvObj is System.IO.MemoryStream) { //MemoryStreamとして取得する System.IO.MemoryStream ms = (System.IO.MemoryStream)csvObj; //エンコードして、文字列に変換する string str = System.Text.Encoding.Default.GetString(ms.ToArray()); Console.WriteLine(str); } else if (csvObj is string) { //文字列として取得する string str = (string)csvObj; Console.WriteLine(str); } }
また、Excelで表をコピーしたときは、Text形式としてタブ区切り(TSV)の文字列が格納されますので、これを取得する方法も考えられます。クリップボードのTextデータを取得する方法は、「クリップボードに文字列をコピーする」をご覧下さい。