DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

クリップボードにCSV形式のデータをコピーする、クリップボードからCSV形式のデータを取得する

ここでは、クリップボードにCSV形式のデータをコピーする方法と、クリップボードからCSV形式のデータを取得する方法を紹介します。Microsoft Excelなどの表計算ソフトは、通常CSV形式に対応していますので、これらのソフトとデータをコピー&ペーストできるようにしたい時に役に立ちます。

クリップボードにCSV形式のデータをコピーする

CSV形式のデータをクリップボードにコピーする時、通常は、次のような感じになるでしょう。

VB.NET
コードを隠すコードを選択
'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)
C#
コードを隠すコードを選択
//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メソッドに渡します。

VB.NET
コードを隠すコードを選択
'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)
C#
コードを隠すコードを選択
//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);

TSV形式でコピーする

Text形式でコピーする場合は、タブ区切り(TSV)にすれば、Excelで貼り付けることができます。Text形式でコピーする方法について詳しくは、「クリップボードに文字列をコピーする」をご覧下さい。

VB.NET
コードを隠すコードを選択
'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)
C#
コードを隠すコードを選択
//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形式とTSV形式の両方でコピーする

CSV形式とText形式の両方のデータをクリップボードに入れるならば、次のようになります。ちなみにこのデータをExcelに貼りつけると、Text形式のデータが使われるようです。

VB.NET
コードを隠すコードを選択
'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)
C#
コードを隠すコードを選択
//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);

クリップボードからCSV形式のデータを取得する

ExcelでコピーしたCSV形式のデータをクリップボードから取得するには、コピーする方法と同じように、MemoryStreamオブジェクトとして取得します。

ただし、この記事の一番初めのコードのように、CSV文字列をそのままDataObject.SetDataメソッドに渡してコピーした場合は、MemoryStreamでは取得できず、文字列として取得します。

以下のサンプルでは、MemoryStreamで取得できる時はMemoryStreamで、文字列で取得できる時は文字列で取得しています。

VB.NET
コードを隠すコードを選択
'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
C#
コードを隠すコードを選択
//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データを取得する方法は、「クリップボードに文字列をコピーする」をご覧下さい。

  • 履歴:
  • 2016/5/22 「クリップボードからCSV形式のデータを取得する」のサンプルを、String型としてコピーされている場合を考慮して書き直すなど。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • コードの先頭に記述されている「Imports ??? がソースファイルの一番上に書かれているものとする」(C#では、「using ???; がソースファイルの一番上に書かれているものとする」)の意味が分からないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。