SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

クラウド時代にマッチする、ドキュメント生成・更新APIライブラリ「DioDocs(ディオドック)」(AD)

.NET向けExcel・PDF操作ライブラリ「DioDocs」の衝撃! その魅力に迫る

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

DioDocs for Excel

 それではもう少し具体的な領域に踏み込んで見ていきたいと思います。まずはDioDocs for Excelです。

 DioDocs for Excelの魅力についてはすでに十分理解していただけているはずなので、ここでは実際に利用例を見ていただきたいと思います。実用的な複雑さを持ったレイアウトのPDF帳票が、いとも簡単に作れることに驚かれることと思います。

 ここでは、テンプレートとなるExcelをもとに値を適用し、PDF帳票を生成する例を見ていただきたいと思います。

テンプレートとなるExcelをもとに値を適用し、PDF帳票を生成する

 今回は請求書を題材として取り扱います。先に見ていただいた帳票です。設計・実装するにあたり、次の手順で実施します。

  1. 帳票に出力するデータのオブジェクトを設計する
  2. テンプレートとなるExcelファイルを設計する
  3. テンプレートに値を設定し、PDFとして保存する

帳票に出力するデータのオブジェクトを設計する

 請求書には大きく3種類の情報を表示します。

  • 請求情報
  • 請求先顧客
  • 請求明細

 具体的には以下のクラス図の通りです。

クラス図
クラス図
  • 請求情報(Invoice)には請求番号・請求日・支払期日が存在し、1つの請求先顧客と複数の請求明細を持ちます。
  • 請求先顧客(Customer)には郵便番号・住所・名称・担当者を持ちます。
  • 請求明細(InvoiceDetail)には名称・単価・数量・単位を持ちます。

 これらの情報を請求書に出力します。

テンプレートとなるExcelファイルを設計する

 請求書を出力する、元となるテンプレートファイルをExcelで作成します。設計した帳票のテンプレートは以下の通りです。

テンプレートファイル
テンプレートファイル

 このテンプレートにはいくつかの工夫が(という程のものではありませんが)なされています。

  1. 請求日・支払期限に日付フォーマットを設定している
  2. ご請求額・単価・金額・小計・消費税・合計のセルの書式設定に通貨を設定している
  3. 金額列は、単価が入力されていた場合に単価×数量を求める計算式を設定している
  4. 小計には金額の縦計を求める計算式を設定している
  5. 消費税には小計から消費税を求める計算式を設定している
  6. 合計には小計と消費税の合計を求める計算式を設定している

 これらを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);

 たったこれだけ! 簡単すぎる。でき上がった帳票は、次の通りです。

でき上がった帳票
でき上がった帳票

 Amazing! 素晴らしい! こんなに簡単な帳票の実装は、過去に記憶がありません。

 ちゃんと日付は「yyyy年mm月dd日」で、金額はカンマ区切りでフォーマットされているのが見て取れるでしょう。そして金額関係の式が正しく計算されていることも分かります。

 もちろん複雑な帳票であれば、Excelベースではない方が良いケースも多くありますが、単純な単票や、ややページングするだけの帳票であれば、もうすべてこれだけで良いのではないか? そんな風に思えてきます。簡単なのもありますが、何より誰もが使い慣れたExcelをそのまま利用できて、学習コストが低く抑えられる点も見逃せません。

次のページ
DioDocs for PDF

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
クラウド時代にマッチする、ドキュメント生成・更新APIライブラリ「DioDocs(ディオドック)」連載記事一覧

もっと読む

この記事の著者

中村 充志(リコージャパン株式会社)(ナカムラ アツシ)

 Microsoft MVP for Visual Studio and Development Technologies リコージャパン株式会社 金融事業部 金融ソリューション開発部所属。 エンタープライズ領域での業務システム開発におけるアプリケーション アーキテクト・プログラマおよび中間管理職。 業務ではWPFおよびASP.NETを用いた業務システム開発が中心。 SI案件において、テスト・保守容易性を担保した、アーキテクチャ構築を得意としている。 GitHub:https://github.com/nuitsjp Twitter:@nuits_jp 著書 『Essential Xamarin ネイティブからクロスプラットフォームまで モバイル.NETの世界』(共著) 『Extensive Xamarin ─ひろがるXamarinの世界─』(共著)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

【AD】本記事の内容は記事掲載開始時点のものです 企画・制作 株式会社翔泳社

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/11249 2019/02/28 16:52

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング