C#でExcelにクリップボード経由で渡すデータを作る
C#でデータベース操作や計算をした結果をExcelで利用したい場合、例えばC#からExcelのブック(ワークシート)に直接書き込む方法があります。ただし、COMオブジェクトへの参照の管理など手間がかかるので、簡単なデータならクリップボード経由で渡したいですね。ということで、試してみたメモです。
目次
早速試してみた
雛型
クリップボードにデータを渡すだけのアプリですので、外観はどうでも良いです。下記のように、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という文字列に変換してます。
そして、Excelのワークシートにペーストすると下図の様になります。
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ほへと”」というように、ダブルクォーテーションでくくられてますね。
これをExcelにペーストすると下図の様になります。
「いろはに(改行)ほへと」が1つのセルに収まりました。
まとめ
クリップボード経由でExcelに文字列を貼り付ける場合は
セル毎にタブで区切る。
セル毎にダブルクォーテーションで括る。
環境は下記の通りです。
Visual Studio 2015 Express for Windows Desktop Excel 2013
公開日
広告