ClosedXMLを使って、エクセルからC#のEnumを出力してみる

皆さんはエクセルを仕事でどうしようしているでしょうか? やはり資料作成用のツールとしてデータをまとめたり、使用していることが多いと思います。 実はエンジニアが使う際も、エクセルからソースファイルを出力するツールとしても活用することが出来るのです。 そこで今回は、エクセルからソースファイルを出力する方法を紹介したいと思います。
「カワリニ」編集部

ソースファイルはテキストファイル

始めにソースファイルはテキストファイルであるという説明をします。

Windowsを使っている方であれば、テキストファイルと言えば「.txt」の拡張子が付いたファイルを思い浮かべると思います。

プログラム言語では、C++「.cpp」「.h」、C#「.cs」、Java「.java」など、エディターでファイルを作成した時に色々な拡張子が付いた状態で出力されているため、そのプログラムで使用するファイルだと認識されるようになっています。

しかし拡張子は特別な何かではなく、あくまでファイルがどんな属性があるかを区別する物でしかありません。

実際、先ほど挙げたような拡張子のファイル名をテキストエディタで開いてみても正常に開けますし、逆にテキストエディタで作成したファイルの拡張子を先ほどの「.cs」にした場合、記述が正しければC#のプロジェクトで使用出来るファイルになります。

ClosedXMLでは、エクセルのセルに設定されている内容を文字列として取得することが出来るため、その文字列をソースファイルのフォーマットに合わせて使用していくことが可能です。

ClosedXMLの導入方法などは、以前書いたコラムがあるため参照してみてください。
https://guildproject.com/column/845/

 

データの増減を自動化できる

エクセルからソースファイルを出力する大きい利点として、必要なデータが増減した際も出力しなおすだけで良い。という点があります。
この出力する機能の事を「コンバータ」と言ったりします。

エクセルで用意したデータをプログラムで使う際に、データ毎に名前が付いていないと困る場合があります。
その際に列挙型を用意し、配列にした各データにアクセスし取得する場合が多いのです。しかしこのやり方だと、データが増えた際に列挙型に手動で追加しなければなりません。

そこでデータを用意しているエクセルから、対応する列挙型を出力できるようにコンバータを用意する。というやり方にすることで、データが増減した際はコンバータを使う事で、増減に対応したソースファイルが出力されることになります。

データを用意する人とプログラムをする人が別で、データの総数が決まっていない。そんな場合に用意しておくと便利になる事があります。

 

フォーマットに合わせる

まず把握しておく必要があることは、出力したいソースファイルのフォーマットについてです。

基本的にはエディターでファイルを新規作成した際に、デフォルトで記述されている内容が分かっていればOKです。
例えば他のソースファイルに記述されている機能を使用したい場合、C++は「#include」、C#では「using 」、Javaでは「import」を書く事でファイルを読み込み、使用することが出来ます。
プログラムによって記述方法は全くバラバラです。

C#で「#include」と書いてもエラーになってしまうので、出力したいプログラムのフォーマットは作成前に把握しましょう。

今回に関してはC#のEnumを出力するため、そこまで複雑な構文を使用することはありませんが、対応したくなった際には注意してみてください。

 

Enumを出力してみる

それでは本題のEnumの出力について説明していきます。

例として、下記のようなエクセルのデータを使用してみます。

やることは非常にシンプルで、
・string型の出力用バッファを用意する
・フォーマットを文字列としてバッファに入れる
・使用したいデータがあるセルにアクセスし、バッファに入れていく

これだけになります。

下記は今回使用したサンプルコードになります。

using System.Text;
using System.IO;
using ClosedXML.Excel;

namespace ClosedXMLText
{
    private const string EXCEL_PATH = @"G:\usr\project\ClosedXMLText\Data\PenData.xlsx";
    private const string EXPORT_PATH = @"G:\usr\project\ClosedXMLText\ClosedXMLText\";
    private const string NameColumn = "A";
    private const string IDColumn = "B";

    static void Main()
    {
        IXLWorkbook workBook = new XLWorkbook(EXCEL_PATH);
        IXLWorksheet workSheet = workBook.Worksheet(1);

        string export_buff = "";
        export_buff += "/* これはコンバータから出力されたEnumです */" + "\r\n";
        export_buff += "\r\n";
        export_buff += "namespace ClosedXMLText" + "\r\n";
        export_buff += "{" + "\r\n";
        export_buff += "public enum PEN_DATA" + "\r\n";
        export_buff += "{" + "\r\n";

        string checkID = "";
        int row = 2;
        while ((checkID = workSheet.Cell(row, IDColumn).Value.ToString()) != "")
        {
            if (checkID == "") { break; }
            string nameString = workSheet.Cell(row, NameColumn).Value.ToString();
            export_buff += "\t" + checkID + "," + "\t" + "// " + nameString + "\r\n";

            row++;
        }

        export_buff += "}" + "\r\n";
        export_buff += "}" + "\r\n";

        string sourceFileName = "PenDataEnum.cs";
        StreamWriter writer = new StreamWriter(EXPORT_PATH + sourceFileName, false, Encoding.Unicode);
        writer.Write(export_buff);
        writer.Close();
    }
}
}

最初に載せたデータと、このコードを使用すると、下記のようなEnumを出力することが出来ます。
こういった自動で出力されるソースファイルには、コメントでその旨を出力してあげると親切です。

 

変えていく部分

今回は説明のしやすさや、分かりやすさを優先してソースファイルを分けずに記述しました。
本来であれば必要に応じてファイル分けをしたり、出力されているexeファイルをbatから呼び出すことで、引数としてパスを外部から入れてあげる事でより汎用的に作ることが出来ます。
bat化するのはオススメで、他のツールにボタンとして組み込む事で、batを使用している感覚が無い状態で他の人に展開することが出来ます。

今回のようにソースファイルの出力を自動化のメリットとして、「ミスが少なるなる点」があります。
しかしデメリットしては、「出力後にプロジェクトをビルドする必要」があります。

そのため、データの増減後にはエンジニアに協力してもらう必要がありますので、その点については注意してください。
エンジニアがいなくてもデータの増減を問題ない形にするには、また別のやり方をする必要がありますので状況に応じて判断しましょう。

今回のサンプルを参考に、色々なデータを自動出力にすることで、面倒な作業は自動化してみてはいかがでしょうか。

 

 

 

 

ギルドプロジェクトでは、現場で使用しているツールに代替するツールの提案やSaaSの導入、決裁者への意思決定の手助けなどの業務効率化を代行する「カワリニ」というサービス展開しております。
問い合わせは何回でも無料で対応させていただいております。
社内SEを雇うと月額のコストが多くかかってくるが、リモートの形で安価に外注したかった等ありましたら、お気軽にご相談ください。

カワリニに相談する