はじめに
アプリケーションのデータを保存する形式には、いくつかの選択肢があります。単純なテキストファイルからバイナリファイル、PDFなど、データの保存形式は、よく悩むところです。一方、Microsoft Excel(以下、Excel)は広範囲のユーザーPCにインストールされており、Excelブック形式のデータはほとんどのPCで見ることができます。
ComponentOne StudioのC1XLBookコンポーネントは、アプリケーションにExcelファイルの読み書き機能を追加するためのコンポーネントライブラリです。このコンポーネントを使うと、アプリケーションのデータをExcelを使わずに直接ブック形式のファイルに保存したり、Excelで作成したブックをアプリケーションに読み込んだりすることができます。
また、テキストファイルに保存したデータをワークシートに保存しなおす処理も作成可能です。ワークシート形式で保存すれば、AccessやSQL Serverなどのデータベースに容易に変換することができます。
そこで今回はC1XLBookコンポーネントを使い、既存のテキストファイルをExcelのワークシートに変換するアプリケーションを作成してみました。
対象読者
Visual Basic 2010/2012/2013、またはVisual C# 2010/2012/2013を使ってプログラムを作ったことがある人。
必要な環境
Visual Basic 2010/2012/2013、Visual C# 2010/2012/2013、Visual Studio 2010/2012/2013でプログラムが作れる環境。なお、最新のサポート環境については、グレープシティのWebページを併せて参照してください。
なお、本プログラムは次の環境で開発・動作確認を行っています。
- OS:Windows 7
- 開発Tool:Visual Studio 2010、.NET Framework 4
プログラム実行時の注意事項
本稿の実行ファイル(バイナリファイル)を動かすには、zipファイルに同梱してある以下のファイルが必要になります。.NET Framework 4でのみご使用いただけます。
ファイル名 | 説明 |
---|---|
C1.C1Excel.4.dll | 本体アセンブリ |
これらのファイルを、実行プログラムと同じフォルダに格納します。サンプルアプリケーションを動作させるには、サンプルに同梱してあるフォームに組み込んだコントロールのdllファイルも必要になります
コンポーネントのインストール
トライアル版は、グレープシティのWebページから申し込みできます。
トライアル申込フォームが表示されますので、必要情報を入力して申し込むとトライアル版のダウンロード手順を記載したE-Mailが送られてきます。その手順にそってダウンロードを行ってください。また、ダウンロードファイルは圧縮ファイルになっていますので、解凍してインストーラを起動します。
制限事項などの詳細については、インストーラに同梱されているリリースノートを参照ください。
コンポーネントと参照の追加
ComponentOne Studioをインストールしたら、プロジェクトにコンポーネントを追加します。ツールボックスに専用のタブを作成し、使用するコンポーネントを追加します。追加するコンポーネントは、アセンブリ名が「C1.C1Excel.4」の「C1XLBook」コンポーネントです。
これらのコンポーネントを追加すると、プロジェクトに以下のランタイムライブラリへの参照が追加されます。
ファイル | 内容 |
---|---|
C1.C1Excel.4.dlll | 本体アセンブリ |
C1XLBookコンポーネントの概要
C1XLBookコンポーネントは、アプリケーションにExcelファイルの読み書き機能を追加するためのコンポーネントライブラリです。アプリケーション側では1つのコマンドになるので、Excelを別途インストールする必要はありません。
また、Excel 97以降のXLSファイルをアプリケーションにロードすることもできます。さらに、Office 2007 OpenXml形式をサポートしており、より小さく圧縮したXLSX形式のファイルとして保存することもできます。
C1XLBookコンポーネントのメインはC1XLBookオブジェクトで、 1枚以上のシートを含むExcelワークブックを表します。
シート、スタイル、ハイパーリンク、画像、ヘッダー/フッター、改ページ、その他Excelシートが持つ多くの機能を操作することができます。
C1XLBookコンポーネントの特徴
C1XLBookコンポーネントは以下の特徴を持っています。
1つのコマンドによるワークブックの保存/ロード
C1XLBookコンポーネントは使いやすく、グリッドコントロールの場合と同様に、1つのコマンドを使ってワークブックのロードや保存を行ったり、シートを操作したりできます。
個別セルのデータの読み取りと書き込み
C1XLBookコンポーネントをロードまたは作成した後、簡単なグリッドの場合と同様に個別シートのデータにアクセスできます。例えば、次のようになります。
XLSheet sheet = c1XLBook1.Sheets[0]; sheet[0, 0].Value = DateTime.Now;
各セルのデータの書式設定
各セルに関連付けられたデータの書式設定は、セル内に格納されたデータと同様にアクセスが簡単です。例えば、次のようになります。
XLStyle style = new XLStyle(c1XLBook1); style.Format = "dd-MM-yyyy"; style.Font = new Font("Courier New", 14); XLSheet sheet = c1XLBook1.Sheets[0]; sheet[0, 0].Value = DateTime.Now; sheet[0, 0].Style = style;
C1XLBookコンポーネントを使ったXLSファイルへのエクスポート
C1XLBookコンポーネントを使用して XLSファイルをエクスポートできます。例えば、C1Reportコントロールでは、レポートをXLSバージョンで作成することにより、誰でもExcelを使ってレポートの閲覧と編集を行うことができるようになります。
Excelを使わない .xls と .xlsx ファイルの読み取り/書き込み
C1XLBookコンポーネントは、.xls(Excel 97以降)と.xlsx(OpenXml形式)ファイルの読み取り/書き込みを行います。後者のxlsxは再使用されて、より小さいファイルサイズに簡単に交換または圧縮できます。アプリケーションを実行するコンピュータに、Excelがインストールされている必要はありません。
画像の作成とセル内への配置
画像をセルに追加するだけでなく、セルサイズ、セル内の画像の位置、および画像を拡大縮小するか、クリッピングするか、セルに合わせて引き伸ばすかどうかを指定できます。
ストリームでのファイルの保存とロード
LoadとSaveメソッドの新しいオーバーロードにより、ワークブックはメモリストリームの直接読み取り/書き込みが行えるようになったため、一時ファイルの使用が不要です。
シートのヘッダーとフッターへの画像の追加
XLPrintSettingsクラスのプロパティを使用して、画像をシートのヘッダーまたはフッターの左、中央、または右部分に追加します。
C1XLBookコンポーネントのオブジェクト構造
C1XLBookコンポーネントはExcelではないので、Excelと違ったオブジェクト構造を持っており、このオブジェクト構造を利用してブック/ワークシート/セルを操作します。
トップレベルはC1XLBookクラスで、Bookを表します。
System.Object System.MarshalByRefObject System.ComponentModel.Component C1.C1Excel.C1XLBook
以降、Excelオブジェクトに対応したクラスは以下のようになっています(コレクションオブジェクトは末尾に"s"が付きます)。
オブジェクト | クラス |
---|---|
ワークシート | XLSheet |
セル | XLCell |
列 | XLColumn |
行 | XLRow |
セル範囲 | XLRange |
図形・画像 | XLShape |
セルのスタイル | XLStyle |
埋め込み画像 | XLPictureShape |
印刷設定 | XLPrintSettings (設定のみで印刷機能はなし) |
列(複数) | XLColumnCollection |
行(複数) | XLRowCollection |
ワークシート(複数) | XLSheetCollection |
各オブジェクトへのアクセスは、上位のクラスのプロパティなどから行えます。いくつかのオブジェクト操作は、以降のアプリケーション作成手順の中で紹介します。
アプリケーションの作成
では、アプリケーションを作成していきます。
作成するアプリケーションは、新しいブックを作成してテキストファイルを読み込み、1行ずつ取り出してセルに代入するアプリケーションです。
GUIの作成
使用するアプリケーションはTextBox、ButtonコントロールとC1XLBookコンポーネントです。C1XLBookコンポーネントは機能のみの提供でGUIを持ちません。そのため、作成の中心はコードになります。
ファイルをテキストボックスで表示する処理
フォームのデザインができたら、2つのボタンの処理を作成します。
このアプリケーションでは、アプリケーションと同じフォルダにある「sample.txt」ファイルを読み込み、新しいブックを作成して1行ずつセルに転送します。直接ファイルを開いてストリームからデータを読み出しますから、そのままではユーザーにファイルの内容が分からない状態で処理が進んでしまいます。
そのため、開いたファイルの内容を確認してから変換できるように、まずはファイルの中身をTextBoxコントロールで表示するようにします。この処理は、「ファイルを開く」ボタンのClickイベントハンドラで行います。
ファイルをStreamReaderクラスを使用してストリームに開き、ReadToEndメソッドでファイルの中身をすべて取出し、TextBoxコントロールのTextプロパティに設定します。
Imports System.IO Imports C1.C1Excel Public Class Form1 Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click Dim sr As StreamReader = New StreamReader("sample.txt", System.Text.Encoding.Default) TextBox1.Text = sr.ReadToEnd() sr.Close() End Sub
using System.IO; using C1.C1Excel; namespace doc2xls_Winform_cs { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { StreamReader sr = new StreamReader("sample.txt", System.Text.Encoding.Default); textBox1.Text = sr.ReadToEnd(); sr.Close(); }
ファイルの変換処理
アプリケーション本来の処理は、「変換」ボタンのClickイベントハンドラで行います。
(1)最初に新しいブックを作成します。XLSheet型の変数を用意し、ここにC1XLBookコンポーネントのSheetオブジェクトを代入します。
Dim sheet As XLSheet = C1XLBook1.Sheets(0)
XLSheet sheet = c1XLBook1.Sheets[0];
たったこの1行でワークシートが用意され、データをセルに転送できるようになります。
(2)Doループを使用して、ストリームから1行ずつテキストを取り出します。これはStreamReaderクラスのReadLineメソッドを使用します。DoループはStreamReaderクラスのPeekメソッドの戻り値が0になるまで繰り返すことで、ファイルの末尾まで順番に1行ずつ取り出していきます。
Dim sr As StreamReader = New StreamReader("sample.txt", System.Text.Encoding.Default) Do While sr.Peek() >= 0 data = sr.ReadLine()
StreamReader sr = new StreamReader("sample.txt", System.Text.Encoding.Default); do { data = sr.ReadLine();
(3)1行取り出したら、ワークシートのセルに代入します。セルへのアクセスは作成したSheetオブジェクトの名前のあとに()でセルの行列番号を指定するだけです。例えば、先頭のセル(ExcelでいうセルA1)は、行列番号は0,0になります。ここでは1行ずつセルに代入していきますので、列番号は0のまま行番号だけ変えながら代入していきます。そして、すべての代入が終了したらストリームを閉じます。
sheet(i, 0).Value = data i += 1 Loop sr.Close()
sheet[i, 0].Value = data; i += 1; }while( sr.Peek() >= 0); sr.Close();
(4)データの入力が終わったら、いくつかのセルのスタイルを変更します。
セルのスタイルを操作する場合は、XLStyleクラスのインスタンスを作成し、変更したいメンバプロパティを設定します。そして、そのXLStyleオブジェクトを、スタイルを設定したいセルや列のStyleプロパティに設定します。
ここでは列0(ExcelではA列)全体のセルスタイルのフォントサイズ、文字色、文字列の折り返しを変更するため、「cellstyle」という名前のXLStyleオブジェクトを作成しています。列のスタイルにアクセスするには、Columnsプロパティの引数に列番号を指定し、Styleプロパティに作成したXLStyleオブジェクトを代入します。
Dim cellstyle As New XLStyle(C1XLBook1) cellstyle.Font = New Font(Font.Name, 12) cellstyle.ForeColor = Color.Blue cellstyle.WordWrap = True sheet.Columns(0).Style = cellstyle
XLStyle cellstyle = new XLStyle(c1XLBook1); cellstyle.Font = new Font(Font.Name, 12); cellstyle.ForeColor = Color.Blue; cellstyle.WordWrap = true; sheet.Columns[0].Style = cellstyle;
(5)列幅を変更する場合は、Columnsプロパティの引数に列番号を指定し、Widthプロパティの値を変更します。単位はtwipsです。
sheet.Columns(0).Width = 6000
sheet.Columns[0].Width = 6000;
(6)最後に作成したブックを保存します。これは、C1XLBookクラスのSaveメソッドを使用します。引数に保存するブック名を拡張子付きで指定します。パス名を付けることもできます。パス名を省略するとアプリケーションと同じフォルダに保存されます。
C1XLBook1.Save("sample_book.xls") MessageBox.Show("データをワークシートに保存しました")
c1XLBook1.Save("sample_book.xls"); MessageBox.Show("データをワークシートに保存しました");
(7)以上で出来上がりです。アプリケーションを実行して動作を確認します。なお、アプリケーションの動作テストの際は、記事添付のサンプルコード(3種類のいずれか)に含まれているテキストファイル「sample.txt」をアプリケーションと同じフォルダに置いてください。
Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click Dim data As String = "" Dim i As Integer = 0 Dim sr As StreamReader = New StreamReader("sample.txt", System.Text.Encoding.Default) Do While sr.Peek() >= 0 data = sr.ReadLine() sheet(i, 0).Value = data i += 1 Loop sr.Close() Dim cellstyle As New XLStyle(C1XLBook1) cellstyle.Font = New Font(Font.Name, 12) cellstyle.ForeColor = Color.Blue cellstyle.WordWrap = True sheet.Columns(0).Style = cellstyle sheet.Columns(0).Width = 6000 C1XLBook1.Save("sample_book.xls") MessageBox.Show("データをワークシートに保存しました") End Sub
private void button2_Click(object sender, EventArgs e) { String data = ""; int i = 0 ; StreamReader sr = new StreamReader("sample.txt", System.Text.Encoding.Default); do { data = sr.ReadLine(); sheet[i, 0].Value = data; i += 1; }while( sr.Peek() >= 0); sr.Close(); XLStyle cellstyle = new XLStyle(c1XLBook1); cellstyle.Font = new Font(Font.Name, 12); cellstyle.ForeColor = Color.Blue; cellstyle.WordWrap = true; sheet.Columns[0].Style = cellstyle; sheet.Columns[0].Width = 6000; c1XLBook1.Save("sample_book.xls"); MessageBox.Show("データをワークシートに保存しました"); }
まとめ
今回は、C1XLBookコンポーネントの使い方の一つとして、テキストファイルをワークシートに変換する機能を持ったアプリケーションを作成してみました。アプリケーションデータをワークシートに保存する機能も同様のやり方で作成できますから、ファイル保存処理でお悩みの方は、このコンポーネントの導入を検討してみてはいかがでしょうか。