要件定義の不安をなくす。要件定義の不安をなくす。ユニファのバックエンド分割に学ぶイノベーションメタバース開発に必要な技術の基本知識をおさらい。Boost」など、さまざまなカンファレンスを企画・運営しています。BOOKS(コードジン・ブックス)は、CodeZineの連載からカットアップした、開発現場の課題解決に役立つ書籍シリーズです。PDF複数のPDFを連結して、1つのPDFにまとめるPDFに電子署名を付与するさいごにDioDocsの魅力【2】ランタイムフリークラウド含め、リソースをオンデマンドに利用したいとなった場合、有償プロダクトの場合、ランタイムライセンスが気になることでしょう。Functionsで無限にスケールしたいといったケースは当然ながら、エンタープライズ領域の業務システムであっても業務ボリュームには波があります。年に1カ月もあるかないかの繁忙期に合わせてランタイムライセンスを購入しなくてはならないケースは避けたいところです。DioDocsは、SaaSでの利用や開発環境への組み込みを除き、基本的には開発ライセンスのみでランタイムには課金されません。クラウド時代の有償コンポーネントとしては必須条件でしょう。VBAやMicrosoft.Office.Interop.Excel、VSTOといった公式のライブラリのオブジェクトモデルに準拠しています。このため非常に理解しやすく、いずれかの経験があればさらに利用しやすいと感じるでしょう。実際にコードを見比べてみましょう。World!」と値を設定して、ファイルを保存しています。("Result.xlsm")続いてDioDocsのコードです。こちらはC#の例ですが、もちろんVB.NETでも利用可能です。Excelファイルとして保存workbook.Save("Result.xlsx");VBAとC#の文法の差異はありますが、ほとんど同等のコードで記述できているのが見て取れます。言語の差異を除くと、次の差しかありません。DioDocsは有償ツールのためライセンスの有効化が必要VBAはすでにExcelのWorkbookが開かれているがDioDocs(やClosedXMLなど)はWorkbookを作成するところから開始するVBAはファイルにマクロを含むため、ファイルフォーマットを「xlsm」にする必要がある他も見てみましょう。Microsoft.Office.Interop.Excelでは、次の通り記述してファイルを作ること「は」できます。"Result.xlsx"));workbook.Close();application.Quit();しかし、このようなコードを書いているとCOMオブジェクトがリークし、ApplicationをQuitしても実際にはExcelのゾンビプロセスが次々生み出される結果になります。実際には次のように、オブジェクトを1つずつ丁寧に開放していく必要があります。Marshal.ReleaseComObject(application);}ちょっと見ただけで読む気を失うコードだと思いますが、よく見ていただきたいのは次の点にあります。worksheet.Range["C3"].Valueのような呼び出しをすると、RangeでCOMオブジェクトが利用されているが開放されないためリークする。アクセスしたプロパティはすべて個別に開放する必要がある。tryの途中で例外が発生したことを考慮し、Marshal.ReleaseComObjectを呼び出して開放前にnullチェックをする必要がある。しないとNullReferenceExceptionが発生する。リソース開放前にガベージコレクタを呼び出さないとリークすることがある。保存パスは絶対パスで指定する必要がある。SaveAsのところで同名のファイルが存在した場合、上書き確認ダイアログが開かれます。サーバーサイドプロセスではそもそもユーザーインターフェース自体表示されていませんから、実際には表示もされず選択もできず、そこで処理がストップします。上記のコードは、try-finallyやリソースの開放といった煩雑さを含んでいます。実際にExcelファイルを操作するとなると、多数のセルにアクセスします。そのため大量のRangeやCellオブジェクトにアクセスするコードが必要となり、ブロックのネストは深くなる一方です。可読性は落ちるばかりで、DioDocsのように簡潔に記述し、機能の実装のみに集中することはとてもできません。同じC#から利用できるMicrosoft公式のVSTOはリークを気にすることなく利用でき、非常に快適に実装できるのですが、実行速度は速いとは言えません。そもそも先にも記述したように、あくまでOfficeのプラグインとして動作するため、サーバーサイドでの処理には不適切です。その他のライブラリのコードはGitHubに公開しています(以下のリンク)。良かったら参考にご覧ください。DioDocsが細部にわたって気を配って設計されていることが見て取れるかと思います。XMLをラップしているためファイル操作に安心感が得られ、かつ使いやすいNPOI:ややAPIに癖があり、個別の習熟が求められるEPPlus:おおむねExcelライクに操作できるが、DioDocsほどではない開発元は日本が本社の企業なので直接サポートが受けられる有償のプロダクトを利用する場合、当然サポートにも大きく期待したいところでしょう。いうのも注意すべき点であると私は考えています。海外のプロダクトを利用する場合、購入・サポートが開発会社の日本支社によるものなのか、それとも輸入代理店を経由するものなのかによって、やはりある程度の差が発生するように感じます。十分なコミュニケーションが取れれば、代理店でも必要なサポートが得られることが多いのです。1次窓口から最終的に必要な情報へ到達するまでのスピードなどに差があると感じることも確かにあります。有償プロダクトはサポートへの期待が大きい以上、プロダクトに差異がないのであれば開発元のサポートが受けられるDioDocsはその分優位にあると考えています。軽快な動作速度さて、ここまで読まれた方はDioDocsに興味を持たれたものと思います。私はグレープシティ社の別製品の情報を調べるために訪れた公式サイトでリリースを知り、これまでExcel操作がらみで苦慮してきた経験から、一気に興味を掻き立てられ試用させていただきました。2度目の驚きを得ました。言うのは、動作が非常に軽快だからです。実際にベンチマークを取得したので見ていただこうと思います。新しく100×100の範囲のセルに文字を設定したExcelファイルを作成してみました。DioDocsの実際のコードは以下のようなものです。}}workbook.Save(Stream.Null);すべてのベンチマークコードはこちらにあるので、興味のある方はご覧ください。テスト環境は以下の通りです。v0.11.3そして実際に計測した結果が以下の通りです。平均レスポンスタイムなので、グラフが短い方が速いことを表します。この結果からおおむね次のように解釈できます。DioDocsが非常に高速で動作している。Frameworkに対し、すでに有意なレベルで高速である。XMLがそれほど速くなく、結果ClosedXMLも同様の傾向にある。Frameworkで動作していませんが、ここでは詳細は解析していません。BenchmarkDotNetとの相性問題のような気もします。Microsoft.Office.Interop.Excelは、Excelの起動時間を含めて91秒程度でした。ミリ秒ではなく秒です。Excelプロセスの起動が入るため、極端に遅くなります。起動したままにすることで高速化は図れますが、Microsoft.Office.Interop.Excelはサーバーサイドでは扱わず、クライアントプロセスで利用することを想定すると、Excelの起動時間を完全に無視するのは、あまり現実的とは言えないでしょう。こちらのデータは実用とは少し離れている利用方法に思えます。そこでテンプレートとなるExcelファイルを事前に用意しておき、値を埋め帳票として実際に利用できるものを用意してみました。次の例をご覧ください。帳票のサンプル赤字の部分がExcelライブラリによって値を入れられた部分で、それ以外はテンプレートとして作成したExcelに元々含まれているものです。この操作の実行結果が以下の通りです。環境は先ほどと同様になります。帳票のサンプルに対する各ライブラリの平均レスポンスタイムやはりDioDocsが速い結果となりました。今回の評価とは直接関係ない点ですが、NPOIについては、やや動作が想定通りではない点がありました。他のライブラリで作成したExcelは「金額」列がテンプレートのExcelに埋め込まれた式で計算された状態で表示されました。NPOIは0円と表示されており、フォーカスをあててEnterキーを押下することで計算結果が表示されました。私の実装に問題があるのかもしれませんが、注意が必要でしょう。ここまでで私が衝撃を受けたDioDocsの魅力について理解していただけたのではないかと思います。PDFの利用方法を、実際の利用シーンを想定して解説してみたいと思います。金融ソリューション開発部所属。アーキテクト・プログラマおよび中間管理職。業務ではWPFおよびASP.NETを用いた業務システム開発が中心。SI案件において、テスト・保守容易性を担保した、アーキテクチャ構築を得意としている。3.12」の最初のベータ版がリリース新着記事一覧を見るイベント今後の予定を見るCodeZineは、株式会社翔泳社が運営するソフトウェア開発者向けのWebメディアです。「デベロッパーの成長と課題解決に貢献するメディア」をコンセプトに、現場で役立つ最新情報を日々お届けします。イラストの無断転載を禁じます。記載されているロゴ、システム名、製品名は各社及び商標権者の登録商標あるいは商標です。