見出し画像

テンプレートを使ったexcelファイル出力方法(C#)-4.DLLの使い方(最終篇)

前に3回に分けて「テンプレートを使ったexcelファイル出力」機能の設計、製造について解説しました。

テンプレートを使ったexcelファイル出力方法(C#)-1.設計
テンプレートを使ったexcelファイル出力方法(C#)-2.実装篇
テンプレートを使ったexcelファイル出力方法(C#)-3.実装篇(続き)

今回は、この機能を呼び出すアプリを作成する方法について解説します。

プログラムのビルド - DLL作成

先ずは開発したプロジェクトをビルドしましょう。

画像1

ビルドが完了すると、↑図のように、 Release\jdr-core-csharp.dllを作成したという旨のメッセージが表示されます。

これが今回開発したライブラリになります。「テンプレートを使ってexcelファイルを作成」したいアプリに該当jdr-core-csharp.dllを組み込ませると簡単に呼び出せます。

Windows Formアプリ(呼出し側)の作成

下記のように「Windows forms APP(.NET Framework)」型のプロジェクトを新規作成します。

画像2

.NET Frameworkのバージョンは「4.X」はお互いに互換性があると思いますが、DLLのバージョンが4.5だったので、このでは4.5以上を選んだらいいと思います。

画像3

そしてプロジェクトが作成されたら、↓図のように「参照(References)」をクリックします。

画像4

表示される「参照マネージャ(Reference Manager)」画面の「Browse...」ボタンを押します。

画像5

表示されたシステムファイル選択画面で、作成したDLLファイル(例:jdr-core-csharp.dll)を指定し、「Add」ボタンを押します。

画像6

次に表示される画面で「OK」ボタンを押します。

画像7

すると指定したDLLが参照対象になります。「テンプレートを使ったexcelファイルの作成」機能が使えるようになりました。

画像8

ボタンを1つ追加し、表示文字を「テンプレートを使ったexcel出力」とします。このボタンをクリックするとexcelファイルを作成するソースを書きます。

画像9

テンプレートの作成

下記のようにテンプレートを作成します。

画像10

データを書き込みたいセルの定義は下記の2種類があります。

■パターン1:normal項目定義 - ${グループ名.キー名}

 例:${header.date}
   グループ名: header、キー名:date

■パターン2:list項目定義 - ${グループ名[].キー名}

 例:${LIST[].custName}
   グループ名:LIST、 キー名:custName

グループ名の後ろに「[]」を付けることで、list項目として定義します。
今回のポイントは、グループ名、キー名の定義方法になんの制限もないことです。テンプレートで定義しているグループ名、キー名にソース側で値を設定するだけです。なので、テンプレートの作成方法が自由です。

上記テンプレートでは、↓図のようなグループとキー名定義を行っています。

画像11

ソースでは、上記グループ・キー名に値を設定するだけで、結果excelの作成が可能です。

又、テンプレートはマルチシートをサポートします。

今回はテンプレートファイルに2つのシートを作成しました。「Sheet2」の内容は下記の通りです。

画像12

2つのシート内の項目定義は同じもので、見た目だけが違うことが分かるでしょう。

「Sheet1」はリスト項目の下に統計項目を指定し、「Sheet2」は統計項目の下にリスト項目を指定しています。

同じデータを2つのシートに書き込むことで、見た目の違う2種類の帳票が作成されるわけです。

テンプレートを使って、結果excelファイルを作成する

テンプレートが出来たので、早速データを書き込むコードを実装してみましょう。

下記のボタンのクリックイベントにコードを実装していきます。

画像13

テスト用アプリなので、本当に適当に作成しています。上記ボタンんをダブルクリックし、自動作成された「クリックイベント」にコードを実装します(↓図のような感じになります)。

画像14

ソースコード説明

□ソース抜粋1  ==========

            string path = @"D:\tmp\TEMP";
           string tmpFile = path + Path.DirectorySeparatorChar + "template001.xlsx";  //テンプレートファイル
           string newFile = path + Path.DirectorySeparatorChar + "rst-0001.xlsx";     //結果excelファイル

ここでは、テンプレートファイルと結果excelファイルのパスとファイル名を指定しています。テストプログラムなので適当に直書きしていますが、実際のアプリではファイルパスをユーザに選択させたり、設定ファイルで定義したり、もっと実用性のあるコードになるでしょう。

□ソース抜粋2 ==========

CTemplatedExcelData ted = new CTemplatedExcelData();

テンプレートに書き込むデータを格納するクラスです。全てのデータを当該変数に設定していきます。

□ソース抜粋3  ==========

           CTemplatedExcelDataValue val = null;

           DateTime dtNow = DateTime.Now;
           val = new CTemplatedExcelDataValue(dtNow);
           ted.AddNormalData("header", "date", val);

グループ名:header、キー名:date (${header.date})で定義されているセルの値を設定しています。

□ソース抜粋4  ==========

           string strVal = "excelデータ書き込みテストC#";
           val = new CTemplatedExcelDataValue(strVal);
           ted.AddNormalData("header", "title", val);

           strVal = "page:1 / total:1";
           val = new CTemplatedExcelDataValue(strVal);
           ted.AddNormalData("header", "No", val);

           double dbVal = 398075;
           val = new CTemplatedExcelDataValue(dbVal);
           ted.AddNormalData("footer", "thisAmount", val);

           dbVal = 999888777.08;
           val = new CTemplatedExcelDataValue(dbVal);
           ted.AddNormalData("footer", "zantaka", val);

           dbVal = 998999.007;
           val = new CTemplatedExcelDataValue(dbVal);
           ted.AddNormalData("footer", "ttlAmount", val);

${header.title}, ${header.No}, ${footer.thisAmount}。。。のようなnormal項目に値を設定しています。

□ソース抜粋5  ==========

list項目のデータの設定方法は下記の通りです。

           IDictionary<string, CTemplatedExcelDataValue> listRow = new Dictionary<string, CTemplatedExcelDataValue>();

           val = new CTemplatedExcelDataValue("CL");
           listRow.Add("custName", val);

           val = new CTemplatedExcelDataValue("商品A");
           listRow.Add("itmName", val);

           val = new CTemplatedExcelDataValue("赤");
           listRow.Add("color", val);
           val = new CTemplatedExcelDataValue(78.9);
           listRow.Add("m1", val);
           val = new CTemplatedExcelDataValue(90.2);
           listRow.Add("m2", val);
           val = new CTemplatedExcelDataValue(91.5);
           listRow.Add("m3", val);
           val = new CTemplatedExcelDataValue(93.5);
           listRow.Add("m4", val);
           val = new CTemplatedExcelDataValue(90.7);
           listRow.Add("m5", val);
           val = new CTemplatedExcelDataValue(16.5);
           listRow.Add("price", val);
           val = new CTemplatedExcelDataValue(19);
           listRow.Add("yunfei", val);
           val = new CTemplatedExcelDataValue("リスト項目1");
           listRow.Add("note", val);

           ted.AddListData("LIST", listRow);

先ず明細行型の変数listRowを作成し、それぞれのキーの値をlistRowに追加した後、「ted.AddListData("LIST", listRow);」で、グループ名が「LIST」であるlist項目(${LIST[].xxx})に値を設定しています。

□ソース抜粋6  ==========

            CTemplatedExcelUtil teu = new CTemplatedExcelUtil();
           teu.CreateExcel(tmpFile, newFile, ted);

最後に、jdr-core-csharp.dll内で作成しているクラス「CTemplatedExcelUtil」のCreateExcel()メソッドを呼び出し、結果excelファイルを作成しています。

□全体ソース  ==========

・Form1.cs

using jdr_core.templatedExcel;
using System;
using System.Collections.Generic;
using System.IO;
using System.Windows.Forms;

namespace TestApp
{
   public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }

       private void button1_Click(object sender, EventArgs e)
       {
           string path = @"D:\tmp\TEMP";
           string tmpFile = path + Path.DirectorySeparatorChar + "template001.xlsx";  //テンプレートファイル
           string newFile = path + Path.DirectorySeparatorChar + "rst-0001.xlsx";     //結果excelファイル

           CTemplatedExcelData ted = new CTemplatedExcelData();

           CTemplatedExcelDataValue val = null;

           DateTime dtNow = DateTime.Now;
           val = new CTemplatedExcelDataValue(dtNow);
           ted.AddNormalData("header", "date", val);

           string strVal = "excelデータ書き込みテストC#";
           val = new CTemplatedExcelDataValue(strVal);
           ted.AddNormalData("header", "title", val);

           strVal = "page:1 / total:1";
           val = new CTemplatedExcelDataValue(strVal);
           ted.AddNormalData("header", "No", val);

           double dbVal = 398075;
           val = new CTemplatedExcelDataValue(dbVal);
           ted.AddNormalData("footer", "thisAmount", val);

           dbVal = 999888777.08;
           val = new CTemplatedExcelDataValue(dbVal);
           ted.AddNormalData("footer", "zantaka", val);

           dbVal = 998999.007;
           val = new CTemplatedExcelDataValue(dbVal);
           ted.AddNormalData("footer", "ttlAmount", val);

           IDictionary<string, CTemplatedExcelDataValue> listRow = new Dictionary<string, CTemplatedExcelDataValue>();

           val = new CTemplatedExcelDataValue("CL");
           listRow.Add("custName", val);

           val = new CTemplatedExcelDataValue("商品A");
           listRow.Add("itmName", val);

           val = new CTemplatedExcelDataValue("赤");
           listRow.Add("color", val);
           val = new CTemplatedExcelDataValue(78.9);
           listRow.Add("m1", val);
           val = new CTemplatedExcelDataValue(90.2);
           listRow.Add("m2", val);
           val = new CTemplatedExcelDataValue(91.5);
           listRow.Add("m3", val);
           val = new CTemplatedExcelDataValue(93.5);
           listRow.Add("m4", val);
           val = new CTemplatedExcelDataValue(90.7);
           listRow.Add("m5", val);
           val = new CTemplatedExcelDataValue(16.5);
           listRow.Add("price", val);
           val = new CTemplatedExcelDataValue(19);
           listRow.Add("yunfei", val);
           val = new CTemplatedExcelDataValue("リスト項目1");
           listRow.Add("note", val);

           ted.AddListData("LIST", listRow);

           listRow = new Dictionary<string, CTemplatedExcelDataValue>();
           listRow.Add("custName", new CTemplatedExcelDataValue("CL"));
           listRow.Add("itmName", new CTemplatedExcelDataValue(""));
           listRow.Add("color", new CTemplatedExcelDataValue("ブルー"));
           listRow.Add("m1", new CTemplatedExcelDataValue(""));
           listRow.Add("m2", new CTemplatedExcelDataValue(" "));
           listRow.Add("m3", new CTemplatedExcelDataValue(" "));
           listRow.Add("m4", new CTemplatedExcelDataValue(" "));
           listRow.Add("m5", new CTemplatedExcelDataValue(" "));
           listRow.Add("price", new CTemplatedExcelDataValue(" "));
           listRow.Add("yunfei", new CTemplatedExcelDataValue(" "));
           listRow.Add("note", new CTemplatedExcelDataValue("リスト項目2"));
           ted.AddListData("LIST", listRow);

           listRow = new Dictionary<string, CTemplatedExcelDataValue>();
           listRow.Add("custName", new CTemplatedExcelDataValue("CK"));
           listRow.Add("itmName", new CTemplatedExcelDataValue("商品B"));
           listRow.Add("color", new CTemplatedExcelDataValue("ブルー"));
           listRow.Add("m1", new CTemplatedExcelDataValue(79.9));
           listRow.Add("m2", new CTemplatedExcelDataValue(92.2));
           listRow.Add("m3", new CTemplatedExcelDataValue(95.5));
           listRow.Add("m4", new CTemplatedExcelDataValue(99.5));
           listRow.Add("m5", new CTemplatedExcelDataValue(92.7));
           listRow.Add("price", new CTemplatedExcelDataValue(18.5));
           listRow.Add("yunfei", new CTemplatedExcelDataValue(13));
           listRow.Add("note", new CTemplatedExcelDataValue("リスト項目3"));
           ted.AddListData("LIST", listRow);

           listRow = new Dictionary<string, CTemplatedExcelDataValue>();
           listRow.Add("custName", new CTemplatedExcelDataValue("CK"));
           listRow.Add("itmName", new CTemplatedExcelDataValue("商品C"));
           listRow.Add("color", new CTemplatedExcelDataValue("ブルー"));
           listRow.Add("m1", new CTemplatedExcelDataValue(79.9));
           listRow.Add("m2", new CTemplatedExcelDataValue(92.2));
           listRow.Add("m3", new CTemplatedExcelDataValue(95.5));
           listRow.Add("m4", new CTemplatedExcelDataValue(99.5));
           listRow.Add("m5", new CTemplatedExcelDataValue(92.7));
           listRow.Add("price", new CTemplatedExcelDataValue(18.5));
           listRow.Add("yunfei", new CTemplatedExcelDataValue(13));
           listRow.Add("note", new CTemplatedExcelDataValue("リスト項目4"));
           ted.AddListData("LIST", listRow);

           CTemplatedExcelUtil teu = new CTemplatedExcelUtil();
           teu.CreateExcel(tmpFile, newFile, ted);

           MessageBox.Show("ok");
       }

   }//end class
}//end namespace

上記のソースはあくまでもテストなので、適当に書いていますが、実際のアプリでは、excelに出力する値はデータベース(DB)とかデータファイルとか、から読み込んだりするでしょう。

データの取得方法は仕様によりますが、とりあえずデータをCTemplatedExcelData型のインスタンスに溜め込むことで、CTemplatedExcelUtil#CreateExcel()に渡すことができます。

↓図のように、ただの2ステップで結果excelファイルを作成することができます。

画像20

実行結果

テスト用のアプリは凄くダサいものですが、実行すると、こんな感じになります。

画像15

すると、下記のようにrst-000.xlsxという結果excelファイルが作成されます。

画像16

■結果excelファイル確認

テンプレートが2シートなので、結果も↓図のように2シートになります。

画像17

※試しにリスト項目の位置を変えてみた

下記のようなテンプレートを作成してみました。

画像18

すると、下記のような結果excelが出力されます。

画像19

まとめ

今まで幾つかの記事で、「テンプレートを使ってexcelファイルにデータを書き込む」機能を持つプログラムを開発するための、概要設計、詳細設計、プログラム設計、実装(製造)方法について解説しました。

実際にexcelファイルを出力するニーズがある時、この記事で紹介した方法が参考になれると嬉しいです。

では、バイバイ! Have a nice day!


この記事が気に入ったらサポートをしてみませんか?