Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

テキストファイルをExcelのワークシートに変換するアプリケーションの作成

ComponentOne Studioを活用したWindowsフォームアプリケーションの作成

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/12/25 16:25

 「ComponentOne Studio」に含まれるC1XLBookコンポーネントを使って、既存のテキストファイルをExcelのワークシートに変換するアプリケーションを作成してみます。

はじめに

 アプリケーションのデータを保存する形式には、いくつかの選択肢があります。単純なテキストファイルからバイナリファイル、PDFなど、データの保存形式は、よく悩むところです。一方、Microsoft Excel(以下、Excel)は広範囲のユーザーPCにインストールされており、Excelブック形式のデータはほとんどのPCで見ることができます。

 ComponentOne StudioのC1XLBookコンポーネントは、アプリケーションにExcelファイルの読み書き機能を追加するためのコンポーネントライブラリです。このコンポーネントを使うと、アプリケーションのデータをExcelを使わずに直接ブック形式のファイルに保存したり、Excelで作成したブックをアプリケーションに読み込んだりすることができます。

 また、テキストファイルに保存したデータをワークシートに保存しなおす処理も作成可能です。ワークシート形式で保存すれば、AccessやSQL Serverなどのデータベースに容易に変換することができます。

 そこで今回はC1XLBookコンポーネントを使い、既存のテキストファイルをExcelのワークシートに変換するアプリケーションを作成してみました。

テキストファイルを開き、Excelのブックを作成して1行ずつセルに保存する
テキストファイルを開き、Excelのブックを作成して1行ずつセルに保存する

対象読者

 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」の「C1XLBook 」コンポーネントを選択する
アセンブリ名が「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プロパティに設定します。

ファイルを読み込みTextBoxコントロールで表示する
ファイルを読み込みTextBoxコントロールで表示する
Visual Basic
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
C#
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オブジェクトを代入します。

Visual Basic
Dim sheet As XLSheet = C1XLBook1.Sheets(0)
C#
XLSheet sheet = c1XLBook1.Sheets[0];

 たったこの1行でワークシートが用意され、データをセルに転送できるようになります。

 (2)Doループを使用して、ストリームから1行ずつテキストを取り出します。これはStreamReaderクラスのReadLineメソッドを使用します。DoループはStreamReaderクラスのPeekメソッドの戻り値が0になるまで繰り返すことで、ファイルの末尾まで順番に1行ずつ取り出していきます。

Visual Basic
Dim sr As StreamReader = New StreamReader("sample.txt", System.Text.Encoding.Default)
     Do While sr.Peek() >= 0
         data = sr.ReadLine()
C#
StreamReader sr = new StreamReader("sample.txt", System.Text.Encoding.Default);
     do 
     {
         data = sr.ReadLine();

 (3)1行取り出したら、ワークシートのセルに代入します。セルへのアクセスは作成したSheetオブジェクトの名前のあとに()でセルの行列番号を指定するだけです。例えば、先頭のセル(ExcelでいうセルA1)は、行列番号は0,0になります。ここでは1行ずつセルに代入していきますので、列番号は0のまま行番号だけ変えながら代入していきます。そして、すべての代入が終了したらストリームを閉じます。

Visual Basic
sheet(i, 0).Value = data
         i += 1
     Loop
     sr.Close()
C#
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オブジェクトを代入します。

Visual Basic
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
C#
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です。

Visual Basic
sheet.Columns(0).Width = 6000
C#
sheet.Columns[0].Width = 6000;

 (6)最後に作成したブックを保存します。これは、C1XLBookクラスのSaveメソッドを使用します。引数に保存するブック名を拡張子付きで指定します。パス名を付けることもできます。パス名を省略するとアプリケーションと同じフォルダに保存されます。

Visual Basic
C1XLBook1.Save("sample_book.xls")
     MessageBox.Show("データをワークシートに保存しました")
C#
c1XLBook1.Save("sample_book.xls");
     MessageBox.Show("データをワークシートに保存しました");

 (7)以上で出来上がりです。アプリケーションを実行して動作を確認します。なお、アプリケーションの動作テストの際は、記事添付のサンプルコード(3種類のいずれか)に含まれているテキストファイル「sample.txt」をアプリケーションと同じフォルダに置いてください。

サンプルテキストファイルが1行ずつセルに格納されていることを確認する
サンプルテキストファイルが1行ずつセルに格納されていることを確認する
Visual Basic
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
C#
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コンポーネントの使い方の一つとして、テキストファイルをワークシートに変換する機能を持ったアプリケーションを作成してみました。アプリケーションデータをワークシートに保存する機能も同様のやり方で作成できますから、ファイル保存処理でお悩みの方は、このコンポーネントの導入を検討してみてはいかがでしょうか。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 瀬戸 遥(セト ハルカ)

    8ビットコンピュータの時代からBASICを使い、C言語を独習で学びWindows 3.1のフリーソフトを作成、NiftyServeのフォーラムなどで配布。Excel VBAとVisual Basic関連の解説書を中心に現在まで40冊以上の書籍を出版。近著に、「ExcelユーザーのためのAccess再...

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5