C#でExcelにクリップボード経由で渡すデータを作る

C#でデータベース操作や計算をした結果をExcelで利用したい場合、例えばC#からExcelのブック(ワークシート)に直接書き込む方法があります。ただし、COMオブジェクトへの参照の管理など手間がかかるので、簡単なデータならクリップボード経由で渡したいですね。ということで、試してみたメモです。

目次

  1. 早速試してみた
    1. 雛型
    2. クリップボードへデータを渡す
  2. 文字列を作ってExcelにペーストしてみた(その1)
  3. 文字列を作ってExcelにペーストしてみた(その2)
  4. まとめ

早速試してみた

雛型

クリップボードにデータを渡すだけのアプリですので、外観はどうでも良いです。下記のように、TextBlockとButtonだけのアプリにしました。

<Window x:Class="excel_clipboard_trial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:excel_clipboard_trial"
        mc:Ignorable="d"
        Title="MainWindow" Height="200" Width="200">
    <Grid>
        <TextBlock Name="textblock" Margin="10,10,10,100" />
        <Button Name="button" Margin="10,100,10,10" Click="button_Click" />
    </Grid>
</Window>

クリップボードへデータを渡す

クリップボードへデータを入れるには、 Clipboardクラス のSetData()メソッドを使います。書式をメモっておきます。

Clipboard.SetData(fromat, data);

引数

内容

format

string

クリップボードに格納するデータの書式。DataFormatsクラスのフィールドで指定する。

data

object

クリップボードに格納するデータのオブジェクト。

戻り値は、無しです。

文字列を作ってExcelにペーストしてみた(その1)

Excelにペーストする際、タブがセルの区切りに、改行がシート行の区切りになります。ということで、下記の様なコードで試してみました。

using System.Windows;

namespace excel_clipboard_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            // コピー用の元データを作成する
            string fieldA1 = "数字";
            double fieldB1 = 3.14;
            string fieldA2 = "数式";
            string fieldB2 = "=1+1";
            string fieldA3 = "改行";
            string fieldB3 = "いろはに\r\nほへと";

            string copy = fieldA1 + "\t" + fieldB1.ToString() + "\r\n" + fieldA2 + "\t" + fieldB2 + "\r\n" + fieldA3 + "\t" + fieldB3 + "\r\n"; // クリップボードに送る文字列を作成する
            Clipboard.SetData(DataFormats.Text, (object)copy); // クリップボードにデータを入れる

            // TextBlockに表示する(おまけ)
            string replaced = System.Text.RegularExpressions.Regex.Replace(copy, "\t", "\\t");
            textblock.Text = replaced;

        }
    }
}

このアプリを実行して、ボタンをクリックすると下図の様になります。TextBlockでは見やすいように、タブをtという文字列に変換してます。

実行1

そして、Excelのワークシートにペーストすると下図の様になります。

結果1

B2セルを見ると、数式は数式としてペーストされてますね。

ただし、「いろはに」と「ほへと」が別々のセルにペーストされてしまっています。Excelのセルはセル内で改行できますから、1つのセルにペーストして欲しいですよね。

文字列を作ってExcelにペーストしてみた(その2)

文字列を、セル毎にダブルクォーテーションでくくるようにしてみました。

using System.Windows;

namespace excel_clipboard_trial
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void button_Click(object sender, RoutedEventArgs e)
        {
            // コピー用の元データを作成する
            string fieldA1 = "数字";
            double fieldB1 = 3.14;
            string fieldA2 = "数式";
            string fieldB2 = "=1+1";
            string fieldA3 = "改行";
            string fieldB3 = "いろはに\r\nほへと";

            string copy = "\""+ fieldA1 + "\"\t\"" + fieldB1.ToString() + "\"\r\n\"" + fieldA2 + "\"\t\"" + fieldB2 + "\"\r\n\"" + fieldA3 + "\"\t\"" + fieldB3 + "\"\r\n"; // クリップボードに送る文字列を作成する
            Clipboard.SetData(DataFormats.Text, (object)copy); // クリップボードにデータを入れる

            // TextBlockに表示する(おまけ)
            string replaced = System.Text.RegularExpressions.Regex.Replace(copy, "\t", "\\t");
            textblock.Text = replaced;

        }
    }
}

実行すると下図の様になります。「”いろはにrnほへと”」というように、ダブルクォーテーションでくくられてますね。

実行2

これをExcelにペーストすると下図の様になります。

結果2

「いろはに(改行)ほへと」が1つのセルに収まりました。

まとめ

クリップボード経由でExcelに文字列を貼り付ける場合は

  • セル毎にタブで区切る。

  • セル毎にダブルクォーテーションで括る。

環境は下記の通りです。

Visual Studio 2015 Express for Windows Desktop Excel 2013

公開日

広告