DioDocs for Excel
それではもう少し具体的な領域に踏み込んで見ていきたいと思います。まずはDioDocs for Excelです。
DioDocs for Excelの魅力についてはすでに十分理解していただけているはずなので、ここでは実際に利用例を見ていただきたいと思います。実用的な複雑さを持ったレイアウトのPDF帳票が、いとも簡単に作れることに驚かれることと思います。
ここでは、テンプレートとなるExcelをもとに値を適用し、PDF帳票を生成する例を見ていただきたいと思います。
テンプレートとなるExcelをもとに値を適用し、PDF帳票を生成する
今回は請求書を題材として取り扱います。先に見ていただいた帳票です。設計・実装するにあたり、次の手順で実施します。
- 帳票に出力するデータのオブジェクトを設計する
- テンプレートとなるExcelファイルを設計する
- テンプレートに値を設定し、PDFとして保存する
帳票に出力するデータのオブジェクトを設計する
請求書には大きく3種類の情報を表示します。
- 請求情報
- 請求先顧客
- 請求明細
具体的には以下のクラス図の通りです。
![クラス図](http://cz-cdn.shoeisha.jp/static/images/article/11249/11249_002.png)
- 請求情報(Invoice)には請求番号・請求日・支払期日が存在し、1つの請求先顧客と複数の請求明細を持ちます。
- 請求先顧客(Customer)には郵便番号・住所・名称・担当者を持ちます。
- 請求明細(InvoiceDetail)には名称・単価・数量・単位を持ちます。
これらの情報を請求書に出力します。
テンプレートとなるExcelファイルを設計する
請求書を出力する、元となるテンプレートファイルをExcelで作成します。設計した帳票のテンプレートは以下の通りです。
![テンプレートファイル](http://cz-cdn.shoeisha.jp/static/images/article/11249/11249_003_s.png)
このテンプレートにはいくつかの工夫が(という程のものではありませんが)なされています。
- 請求日・支払期限に日付フォーマットを設定している
- ご請求額・単価・金額・小計・消費税・合計のセルの書式設定に通貨を設定している
- 金額列は、単価が入力されていた場合に単価×数量を求める計算式を設定している
- 小計には金額の縦計を求める計算式を設定している
- 消費税には小計から消費税を求める計算式を設定している
- 合計には小計と消費税の合計を求める計算式を設定している
これらをExcelのテンプレート側に設定することで、プログラムコードからの設定を最低限に抑えることを可能としています。こう見るとExcelはまさにリアクティブプログラミングですね。
テンプレートに値を設定し、PDFとして保存する
では実際にPDFを出力するコードをご覧いただきましょう。コードの全体はこちらに公開しています。
まずはライセンスを有効化します。製品版またはトライアル版のキーを指定してください。このコードを記述しない場合は制限付きのライセンスなし版として動作します。
Workbook.SetLicenseKey("YOUR_KEY");
続いて請求書へ出力する請求データを作成します。
var invoice = new Invoice { No = 1234567890, BillingDate = DateTime.Today, PaymentDeadline = DateTime.Today.Add(TimeSpan.FromDays(30)), Customer = new Customer { ZipCode = "108-0023", Address = "東京都港区芝浦3-4-1 グランパークタワー", Name = "ニュイ工房", Staff = "中村 充志" }, InvoiceDetails = new List<InvoiceDetail> { new InvoiceDetail{ Name = "Item1", UnitPrice = 1000, Count = 1, Unit = "本"}, new InvoiceDetail{ Name = "Item2", UnitPrice = 2000, Count = 2, Unit = "冊"}, new InvoiceDetail{ Name = "Item3", UnitPrice = 3000, Count = 3, Unit = "枚"}, new InvoiceDetail{ Name = "Item4", UnitPrice = 4000, Count = 4, Unit = "㌢"}, new InvoiceDetail{ Name = "Item5", UnitPrice = 5000, Count = 5, Unit = "㌕"}, new InvoiceDetail{ Name = "Item6", UnitPrice = 6000, Count = 6, Unit = "年"}, new InvoiceDetail{ Name = "Item7", UnitPrice = 7000, Count = 7, Unit = "個"}, new InvoiceDetail{ Name = "Item8", UnitPrice = 8000, Count = 8, Unit = "個"}, new InvoiceDetail{ Name = "Item9", UnitPrice = 9000, Count = 9, Unit = "個"}, new InvoiceDetail{ Name = "Item10", UnitPrice = 10000, Count = 10, Unit = "個"}, } };
BillingDateやPaymentDeadlineにはDateTime型をフォーマットした文字列ではなく、DateTime型が設定され、UnitPriceにもint型がそのまま設定されていることをご覧ください。
続いてExcelを開き、作成したinvoiceの情報を適用していきます。
var workbook = new Workbook(); workbook.Open("Invoice.xlsx"); var worksheet = workbook.ActiveSheet; worksheet.Range["N3"].Value = invoice.No; worksheet.Range["N4"].Value = invoice.BillingDate; worksheet.Range["O13"].Value = invoice.PaymentDeadline; worksheet.Range["B3"].Value = invoice.Customer.ZipCode; worksheet.Range["A4"].Value = invoice.Customer.Address; worksheet.Range["A5"].Value = invoice.Customer.Name; worksheet.Range["C6"].Value = invoice.Customer.Staff; for (var i = 0; i < invoice.InvoiceDetails.Count; i++) { worksheet.Range[15 + i, 1].Value = invoice.InvoiceDetails[i].Name; worksheet.Range[15 + i, 9].Value = invoice.InvoiceDetails[i].UnitPrice; worksheet.Range[15 + i, 12].Value = invoice.InvoiceDetails[i].Count; worksheet.Range[15 + i, 14].Value = invoice.InvoiceDetails[i].Unit; }
一点注意があります。Excelの場合、通常配列のインデックスは1始まりで利用しますが、DioDocsでは0始まりで扱います。この点がExcelオブジェクトに完全に準拠していない点になります。しかしプログラムの都合上、配列などの添え字が0始まりであることを考慮すると、その選択肢もアリなのかもしれません。
そして最後に、値の設定されたExcelをPDFへ保存します。
workbook.Save("Result.pdf", SaveFileFormat.Pdf);
たったこれだけ! 簡単すぎる。でき上がった帳票は、次の通りです。
![でき上がった帳票](http://cz-cdn.shoeisha.jp/static/images/article/11249/11249_004_s.png)
Amazing! 素晴らしい! こんなに簡単な帳票の実装は、過去に記憶がありません。
ちゃんと日付は「yyyy年mm月dd日」で、金額はカンマ区切りでフォーマットされているのが見て取れるでしょう。そして金額関係の式が正しく計算されていることも分かります。
もちろん複雑な帳票であれば、Excelベースではない方が良いケースも多くありますが、単純な単票や、ややページングするだけの帳票であれば、もうすべてこれだけで良いのではないか? そんな風に思えてきます。簡単なのもありますが、何より誰もが使い慣れたExcelをそのまま利用できて、学習コストが低く抑えられる点も見逃せません。