SHOEISHA iD

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

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

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

.NET向けExcel操作APIライブラリ「DioDocs for Excel」を使って帳票アプリを作ろう

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

 無料の試用ライセンスで実施できる、グレープシティ社の.NET向けExcel操作APIライブラリ「DioDocs for Excel」。以前の記事では帳票アプリを作る場面での、Dockerを用いた開発の進め方と注意点をお伝えしました。今回は、Dockerと.NET開発の基本がわかったところで、「DioDocs for Excel」を使って帳票アプリを作っていきましょう。

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

以前の記事

DioDocs for Excelを使って帳票アプリを作る

 帳票処理は、すべて自分で作るのは難しいので、何かしらのライブラリを使うことがほとんどです。業務アプリケーションを開発するときに便利なのが、グレープシティ社の「DioDocs for Excel」というExcelファイルを読み書きができるAPIライブラリです。

 このライブラリは、単純なExcelファイルの書き出しだけでなく、Excelファイルとしてあらかじめ罫線や色づけなどをしたテンプレートを作っておいて、そこにプログラムから値を埋め込むこともできるため、きれいなレイアウトの帳票でも、工数をかけずに作れます。またPDFへの出力にも対応しているため、印刷を目的とした用途にも使えます。Excel帳票作成の詳細は「Excel帳票を作成する」ページをご覧ください。

 帳票出力には、さまざまなライブラリがありますが、グレープシティ社のライブラリが好まれる理由は、その歴史にあります。同社のライブラリは、Windows上のアプリ(.NETの登場前)からずっとあり、アップデートを重ね、.NET環境になっても、ほぼ同じ使い勝手で開発できます。そのため長らく使われてきた業務アプリでは、過去の開発資産や開発経験を活かすために、このライブラリが採用されるケースが多いです。

DioDocs for Excelをインストールする

 DioDocs for Excelは、NuGetパッケージとして提供されているので、NuGetパッケージマネージャを使ってインストールします。VS Codeに、NuGet Package Mangerをインストールしていない場合は、[拡張]からインストールしておいてください(図1)。

図1 NuGet拡張のインストール
図1 NuGet拡張のインストール

 NuGet Package Managerをインストールしたら、次のようにして、DioDocs for Excelをインストールします。

【手順】DioDocs for Excelをインストールする

[1][Add Package]を選択する

 [F1]キーを押してコマンドエクスプローラを開き、NuGet Package Managerの[Add Package]を選択します(図2)。

図2 Add Packageを選択する
図2 Add Packageを選択する
[2]パッケージ名を入力する

 インストールするパッケージ名を入力します。「DioDocs For Excel」は、「GrapeCity.DioDocs.Excel.ja」です。そのように入力して[Enter]キーを押して、バージョンを選択すると、インストールされます(図3)。

 インストールしたライブラリは、ワークフォルダ以下にインストールされるため、Dockerコンテナをイメージ化して、別のコンピュータに移行する場合も、まとめてもっていけます。

図3 DioDocs for Excelをインストールする
図3 DioDocs for Excelをインストールする

DioDocs for Excelの製品ライセンス

 このようにしてインストールしたDioDocs for Excelは、30日間のみ利用できる体験版です。30日を経過すると利用できなくなるほか、30日未満でも、「Excelファイルを書き出したときに体験版である旨のワークシートが書き出される」「PDFファイルを書き出したときに体験版である文言が含まれる」などの制限があります。

 DioDocs for Excelの購入、および、購入後のライセンスのインストールについては、グレープシティ社のページを参照してください。

帳票サンプル

 これでDioDocs for Excelが使えるようになりました。実際に、ちょっとした帳票を作ってみましょう。Pgogram.csファイルを、リスト2のように修正します。

[リスト2]Program.csファイル
using GrapeCity.Documents.Excel;

// ワークブックの初期化
Workbook workbook = new Workbook();
        
// アクティブなワークシートの取得
IWorksheet worksheet = workbook.ActiveSheet;

// 書き込むダミーのデータ
object[,] data = new object[,]{
    {"氏名", "電話番号", "メールアドレス", "郵便番号", "都道府県", "住所"},
    {"大川仁美", "055425366", "hitomi38579@itihvkjd.hlkpt.lm", "406-0854", "山梨県", "笛吹市境川町寺尾3-18-15"},
    {"菅井礼子", "0744610199", "reikosugai@siadwn.fwr", "639-2245", "奈良県", "御所市今住3-8-16"},
    {"福地浩之", "0596008348", "hiroyuki0893@cnous.xb.gwe", "511-0065", "三重県", "桑名市大央町3-12-3"},
    {"芦田重樹", "0583477675", "iashida@hpebuwjuf.gy", "501-0411", "岐阜県", "本巣市上高屋4-2-18"},
    {"高岡宏寿", "0520974210", "itakaoka@lukbsilq.ae", "441-8021", "愛知県", "豊橋市白河町3-17"}    
};        
// データを設定する
worksheet.Range["A1:F6"].Value = data;

// xlsxとして保存
workbook.Save("example.xlsx", SaveFileFormat.Xlsx);

 ※このデータは、「疑似個人情報データ生成サービス」を用いて生成しました。

 これはdata配列のデータを書き込んだexample.xlsxを作る例です。DioDocs for Excelを使って、Excelファイルを作る処理の流れは、次の通りです。

(1)インポート

 1行目にあるように、まずは、ライブラリをインポートします。

using GrapeCity.Documents.Excel;
(2)初期化と書き出し先ワークシートの取得

 Workbookオブジェクトを初期化します。すると、既定のWorkSheetオブジェクト(1枚目のワークシート)が作られるので、これを取得します。

// ワークブックの初期化
Workbook workbook = new Workbook();
        
// アクティブなワークシートの取得
IWorksheet worksheet = workbook.ActiveSheet;
(3)データの書き込み

 データは、(2)で取得したワークシートに対して書き込みます。あらかじめデータを用意しておいて、それをセルに書き込む操作をします。下記の例にあるように、「"A1:F6"」のようなExcelの列表記を使えます(行・列の数値で指定することもできます)。

object[,] data = new object[,]{
…略…
};        
// データを設定する
worksheet.Range["A1:F6"].Value = data;
(4)保存する

 最後に、Saveメソッドを呼び出して、ファイルとして保存します。第2引数の「SaveFileFormat.Xlsx」はファイル形式の指定で、xlsx形式という意味です。

// xlsxとして保存
workbook.Save("example.xlsx", SaveFileFormat.Xlsx);
(5)実行して確認する

 このプログラムの入力を終えたら、保存して実行します。実行するには、ターミナルから、次のように入力します。

dotnet run

 実行すると、「example.xlsx」が作られます。これはワークフォルダに作っているので、Windowsホストのエクスプローラからも、このファイルを参照できます。ダブルクリックしてExcelなどで開けば、図4に示す内容のExcelファイルができたことを確認できます。

図4 作られたExcelファイル
図4 作られたExcelファイル

フォントとロケールの罠

 このようにExcelファイルの作成は、すぐにできます。この簡単さがゆえに、DioDocs for Excelの便利さを感じるのですが、実は、ちょっと問題があります。

PDFに書き出す

 DioDocs for Excelは、PDFとして書き出すこともできます。これはとても簡単で、Saveメソッドのオプションを変えるだけです。次のように「SaveFileFormat.Pdf」を指定すれば、PDFとして出力されます。

// PDFとして保存
workbook.Save("example.pdf", SaveFileFormat.Pdf);

 しかし生成されたPDFを開くとわかりますが、実際には、日本語がまったく表示されません(図5)。これは、日本語フォントがコンテナにインストールされていないのが理由です。

図5 日本語が表示されない
図5 日本語が表示されない

フォントをインストールする

 こうした「フォントがない」という状況は、実行環境としてWindowsしか想定しておらず、LinuxやDockerコンテナを想定していない開発では、よく起きます。

 この問題を解決するには、コンテナのなかにフォントをインストールします。ただしもちろん、ライセンスの関係から、Windowsにインストールされているフォントをそのまま使うことはできません。

 そこでライセンス上、問題がないオープンソースのフォントなどを用います。ここでは、アドビ社がオープンソースとして提供している「源ノ角ゴシック(source-han-sans)」や「源ノ明朝(source-han-serif)」を使うことにします。

 いくつかのファイル形式がありますが、ここでは「OTF形式」を使います。GitHubのディレクトリのOTF/Japaneseフォルダに、文字の太さ(フォントのウェイト)が違うファイルがあるので、好みのものを選びます。ここではふつうの太さの「SourceHanSans-Regular.otf」と「SourceHanSerif-Regular.otf」をダウンロードします。

 こうしてダウンロードしたOTF形式ファイルを、プロジェクトフォルダに適当なディレクトリに配置します。ここではfontsディレクトリに配置しました(図6)。

図6 fontsディレクトリを作ってフォントを置いた
図6 fontsディレクトリを作ってフォントを置いた

DioDocs for Excelでフォントを指定する

 これでフォントの準備ができました。次にプログラムを修正して、このフォントを使って描画します。リスト1に対して、次の2点を修正します。

(1)フォントディレクトリの設定

 DioDocs for Excelでは、WorkbookクラスのFontsFolderPathプロパティに、フォントの場所を設定します。図13のようにfontsディレクトリに設定したのであれば、次の文を追加します。

Workbook.FontsFolderPath = "fonts";
(2)標準スタイルのフォントを変更する

 フォントを指定しない場合、標準スタイルのフォントが使われます。そこで標準スタイルのフォントを変更します。

workbook.Styles["標準"].Font.Name = "使いたいフォント名";

 問題は「使いたいフォント名が何か」という点ですが、Adobe Fontsの場合は、SourceHanSansReadMe.pdfおよびSourceHanSerifReadMe.pdfに書かれていて、ファイル名と同じく「SourceHanSans-Regular」および「SourceHanSerif-Regular」です。ですから、源ノ角ゴシック(source-han-sans)なら、

workbook.Styles["標準"].Font.Name = "SourceHanSans-Regular";

 源ノ明朝(source-han-serif)なら、

workbook.Styles["標準"].Font.Name = "SourceHanSerif-Regular";

 このようにします(太さがRegularではない場合は、それに合わせてください)。

標準のフォントは列幅の計算に使われる

 DioDocs for Excelでは、セルごとにフォントを設定できますが、その場合でも、標準スタイルのフォントは必ず設定するようにしてください。標準スタイルのフォントは、列幅の計算に使われるからです。標準スタイルのフォントが存在しない場合、PDFに出力したときに、列幅が正しく表示されないことがあります。

 LinuxにてPDF出力時に列幅の計算に使用するフォントが実行環境にない場合、列幅が正しく出力されない – GrapeCity ナレッジベース (zendesk.com)

フォント名を知る

 フォントのファイルから、フォント名を知りたいなら、内部構造を確認しなければなりません。それには、適当なOpenTypeフォントを扱えるツールを使うとよいでしょう。例えば、FontForgeというフォントエディタソフトを使ってOTF形式ファイルを開き、フォント情報を確認すると、そのフォント名がわかります(図7)。

図7 フォント名を確認したところ
図7 フォント名を確認したところ

カルチャの問題

 これでフォントの問題は解決するのですが、もう1つ、DioDocs for Excelを使ううえでは、カルチャを日本語にしないと、列幅が狭くなるという問題があります。

 Azure上でPDF出力すると列幅が狭くなりページ余白が大きくなる – GrapeCity ナレッジベース (zendesk.com)

 この問題は、カルチャを日本に設定することで解決できます。

workbook.Culture = CultureInfo.GetCultureInfo("ja-JP");

タイムゾーンの問題

 カルチャと並んでもう1つ、Dockerコンテナ環境では、「タイムゾーン」の問題が生じることがあります。「時間が9時間ズレている」という現象が発生したときは、プログラムのなかで明示的に、タイムゾーンの変換をしましょう。

// 現在日時を取得
DateTime now = DateTime.Now;
// Asia/Tokyoタイムゾーンに変換
TimeZoneInfo jst = TimeZoneInfo.FindSystemTimeZoneById("Asia/Tokyo");
DateTime now_jst = TimeZoneInfo.ConvertTime(now, jst);

Console.WriteLine(now_jst.ToString("yyyy/MM/dd HH:mm:ss"));   

まとめ

 以上の修正をした最終的なプログラムを、リスト2に示します。dotnet runで実行して生成したPDFファイルを見ると、今度は、正しくPDFが表示されていることがわかります(図8)。

[リスト2]フォントとロケールの問題を修正したもの
using GrapeCity.Documents.Excel;
using System.Globalization;

// ワークブックの初期化
Workbook workbook = new Workbook();

// フォントの設定
Workbook.FontsFolderPath = "fonts";
workbook.Styles["標準"].Font.Name = "SourceHanSans-Regular";

// カルチャの設定
workbook.Culture = CultureInfo.GetCultureInfo("ja-JP");

// アクティブなワークシートの取得
IWorksheet worksheet = workbook.ActiveSheet;

// 書き込むダミーのデータ
object[,] data = new object[,]{
    {"氏名", "電話番号", "メールアドレス", "郵便番号", "都道府県", "住所"},
    {"大川仁美", "055425366", "hitomi38579@itihvkjd.hlkpt.lm", "406-0854", "山梨県", "笛吹市境川町寺尾3-18-15"},
    {"菅井礼子", "0744610199", "reikosugai@siadwn.fwr", "639-2245", "奈良県", "御所市今住3-8-16"},
    {"福地浩之", "0596008348", "hiroyuki0893@cnous.xb.gwe", "511-0065", "三重県", "桑名市大央町3-12-3"},
    {"芦田重樹", "0583477675", "iashida@hpebuwjuf.gy", "501-0411", "岐阜県", "本巣市上高屋4-2-18"},
    {"高岡宏寿", "0520974210", "itakaoka@lukbsilq.ae", "441-8021", "愛知県", "豊橋市白河町3-17"}    
};        
// データを設定する
worksheet.Range["A1:F6"].Value = data;

// PDFとして保存
workbook.Save("example.pdf", SaveFileFormat.Pdf);
図8 正しい日本語が表示された
図8 正しい日本語が表示された

 ここまで説明してきたように、コンテナのなかは、フォントがインストールされているとは限りませんし、カルチャとして日本が設定されているとも限りません。ですから、普段、あまり気にしていないような、既定の環境を前提とした作り方では、うまくいかないことがあるので注意してください。ここで紹介した以外にもグレープシティ社のナレッジベースにDocker関連のTipsなどの情報があります。併せてこちらも参照してみてください。

 今回は、簡単なコンソールアプリを作りながら、DioDocs for Excelの基本的な使い方を説明しました。次回は、今回説明した内容を使って、ASP.NETでありがちな帳票Webアプリケーションを、どのように構築すればよいのかを説明します。

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

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

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

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

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/15522 2022/02/18 12:00

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング