![見出し画像](https://assets.st-note.com/production/uploads/images/27550293/rectangle_large_type_2_4d2f5f3713f8e76d421ef6640d2fb2be.png?width=1200)
テンプレートを使ったexcelファイル出力方法(C#)-4.DLLの使い方(最終篇)
前に3回に分けて「テンプレートを使ったexcelファイル出力」機能の設計、製造について解説しました。
テンプレートを使ったexcelファイル出力方法(C#)-1.設計
テンプレートを使ったexcelファイル出力方法(C#)-2.実装篇
テンプレートを使ったexcelファイル出力方法(C#)-3.実装篇(続き)
今回は、この機能を呼び出すアプリを作成する方法について解説します。
プログラムのビルド - DLL作成
先ずは開発したプロジェクトをビルドしましょう。
ビルドが完了すると、↑図のように、 Release\jdr-core-csharp.dllを作成したという旨のメッセージが表示されます。
これが今回開発したライブラリになります。「テンプレートを使ってexcelファイルを作成」したいアプリに該当jdr-core-csharp.dllを組み込ませると簡単に呼び出せます。
Windows Formアプリ(呼出し側)の作成
下記のように「Windows forms APP(.NET Framework)」型のプロジェクトを新規作成します。
.NET Frameworkのバージョンは「4.X」はお互いに互換性があると思いますが、DLLのバージョンが4.5だったので、このでは4.5以上を選んだらいいと思います。
そしてプロジェクトが作成されたら、↓図のように「参照(References)」をクリックします。
表示される「参照マネージャ(Reference Manager)」画面の「Browse...」ボタンを押します。
表示されたシステムファイル選択画面で、作成したDLLファイル(例:jdr-core-csharp.dll)を指定し、「Add」ボタンを押します。
次に表示される画面で「OK」ボタンを押します。
すると指定したDLLが参照対象になります。「テンプレートを使ったexcelファイルの作成」機能が使えるようになりました。
ボタンを1つ追加し、表示文字を「テンプレートを使ったexcel出力」とします。このボタンをクリックするとexcelファイルを作成するソースを書きます。
テンプレートの作成
下記のようにテンプレートを作成します。
データを書き込みたいセルの定義は下記の2種類があります。
■パターン1:normal項目定義 - ${グループ名.キー名}
例:${header.date}
グループ名: header、キー名:date
■パターン2:list項目定義 - ${グループ名[].キー名}
例:${LIST[].custName}
グループ名:LIST、 キー名:custName
グループ名の後ろに「[]」を付けることで、list項目として定義します。
今回のポイントは、グループ名、キー名の定義方法になんの制限もないことです。テンプレートで定義しているグループ名、キー名にソース側で値を設定するだけです。なので、テンプレートの作成方法が自由です。
上記テンプレートでは、↓図のようなグループとキー名定義を行っています。
ソースでは、上記グループ・キー名に値を設定するだけで、結果excelの作成が可能です。
又、テンプレートはマルチシートをサポートします。
今回はテンプレートファイルに2つのシートを作成しました。「Sheet2」の内容は下記の通りです。
2つのシート内の項目定義は同じもので、見た目だけが違うことが分かるでしょう。
「Sheet1」はリスト項目の下に統計項目を指定し、「Sheet2」は統計項目の下にリスト項目を指定しています。
同じデータを2つのシートに書き込むことで、見た目の違う2種類の帳票が作成されるわけです。
テンプレートを使って、結果excelファイルを作成する
テンプレートが出来たので、早速データを書き込むコードを実装してみましょう。
下記のボタンのクリックイベントにコードを実装していきます。
テスト用アプリなので、本当に適当に作成しています。上記ボタンんをダブルクリックし、自動作成された「クリックイベント」にコードを実装します(↓図のような感じになります)。
ソースコード説明
□ソース抜粋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ファイルを作成することができます。
実行結果
テスト用のアプリは凄くダサいものですが、実行すると、こんな感じになります。
すると、下記のようにrst-000.xlsxという結果excelファイルが作成されます。
■結果excelファイル確認
テンプレートが2シートなので、結果も↓図のように2シートになります。
※試しにリスト項目の位置を変えてみた
下記のようなテンプレートを作成してみました。
すると、下記のような結果excelが出力されます。
まとめ
今まで幾つかの記事で、「テンプレートを使ってexcelファイルにデータを書き込む」機能を持つプログラムを開発するための、概要設計、詳細設計、プログラム設計、実装(製造)方法について解説しました。
実際にexcelファイルを出力するニーズがある時、この記事で紹介した方法が参考になれると嬉しいです。
では、バイバイ! Have a nice day!