vb.netでExcelのセルにバーコードを出力するには…

タグの編集
投稿者 tkrh  (社会人) 投稿日時 2018/10/3 17:22:21
業務用アプリケーションをvb.netで作成しているものです。
以下のことができるのか否か、また、どのようにすれば実現できるのかご教示ください。

■やりたいこと
 データベースから取得したデータをExcelに出力する。
 特定の文字列をバーコードフォントでExcelのセル出力したい。
 ただし、バーコードフォントは、ソリューションプロジェクト内の「font」フォルダ内に格納し、
 Excel出力プログラムはそれを使うこと。
 ※フォントファイルをパソコンにインストールすることは考慮しません。

■開発環境
 開発ツール: VisualStudio Community 2017
 ライブラリ : EPPlus 4.1.1

宜しくお願いします。
投稿者 (削除されました)  () 投稿日時 2018/10/4 12:00:19
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/10/4 12:18:39
> 特定の文字列をバーコードフォントでExcelのセル出力したい。

Excel 文書に、「OS にインストールされていないフォント」が指定されていた場合、
そのフォントは別のフォントで代替されてしまい、正しくレンダリングされません。
これは Excel ファイルが、フォントの埋め込みをサポートしていないためです。
https://excel.tips.net/T001969_Embedding_Fonts_in_Excel.html

ゆえに、バーコードフォントを採用するのであれば、
文書を開く予定の PC すべてに、そのフォントを
事前にインストールしておかねばならない、ということです。

これはバーコードフォントに限った話ではありません。
フォントの代わりに、バーコード生成用の ActiveX コントロールを用いる場合も同様で、
各PC にそのコントロールがレジストされていなければならないことになります。

環境依存性を減らすためには、バーコードを画像化して埋め込むことをお奨めします。

ただしこの時、バーコードフォントからバーコード画像を生成することはお奨めしません。
TextRenderer.DrawText や Grapchis.DrawString 経由だと、必ずしも
十分な品質が得られない可能性があるというのがその理由です。
また、そもそもバーコードフォント側がそのような使い方を想定しておらず、
ライセンス的に許諾されてないケースもあります。


バーコード画像を動的に生成する方法としては、無償/有償を含めて、
VBA ソースや VB.NET ソース、あるいはコンパイル済みの DLL などが
各種ありますので、そうしたものを探してきて利用するのが良いでしょう。
https://www.vector.co.jp/soft/win95/writing/se333820.html
https://www.codeproject.com/Articles/1033002/Code-Barcodes-in-VB-NET-and-Csharp
http://www.atmarkit.co.jp/ait/articles/1803/14/news020.html


> ただし、バーコードフォントは、ソリューションプロジェクト内の「font」フォルダ内に格納し、
> Excel出力プログラムはそれを使うこと。
> ※フォントファイルをパソコンにインストールすることは考慮しません。

インストールすることを考慮しない、というのは、
「インストールしたくない」という意味でしょうか。それとも
「インストールしても構わないが、事前にインストールされてはいない」
といった意味でしょうか。

インストールして良いなら話が早いのですが、インストールせずに使う場合、
プライベートフォントとしての利用になります。

自アプリだけで使う場合は、PrivateFontCollection を使えば済むのですが、
他アプリ(今回は Excel)で利用する場合にはプライベートフォントは使えません。
(Excel ファイルを開く側の PC に、フォントファイルをインストールするのなら OK ですが)

Dim ttfPath As String = System.IO.Path.Combine(My.Application.Info.DirectoryPath, "fon""CODE39.ttf")
Dim pfc As New System.Drawing.Text.PrivateFontCollection()
pfc.AddFontFile(ttfPath)
Me.Label1.AutoSize = True
Me.Label1.Font = New System.Drawing.Font(pfc.Families(0), 48.0F)
Me.Label1.Text = "*VISUAL BASIC*"
投稿者 tkrh  (社会人) 投稿日時 2018/10/4 13:32:30
的確で丁寧にご教示いただきまして、ありがとうございます。

「フォントファイルのインストール」の件は、「インストールしたくない」の意味で
記載しました。
試しにPrivateFontCollectionを用いてサンプルを作成・実行したところ、
フォントファイルをインストールしないとExcelのセルにバーコードが表示されない
ことが確認できました。

Excelのセルにバーコードを出力するためには、「フォントファイルインストール」、
または、「バーコードを画像化」で悩みますが、手軽な「フォントファイルインストール」で
進めたいと考えます。

∵「バーコードを画像化」だと、バーコードの出力位置の調整をアプリケーション側で
 実装しなければならない。
 一度に数百ある納品書の番号をバーコード化し、出力位置を都度計算するとなると
 いささか手間に感じたため。

大変勉強になりました。
ありがとうございました。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2018/10/4 15:22:53
> バーコードの出力位置の調整をアプリケーション側で
> 実装しなければならない。

自分は画像で実装することが多いのですが、EPPlus だと
位置合わせは .SetPosition(行, 0, 列, 0) だけで済むので、
Excel VBA よりは指定しやすいですよ。


「インストールしたくない」という前提を破っても良いのなら、
バーコードフォントを使うのが一番おすすめです。
Excel ファイルのサイズも削減できますしね。

# 二次元バーコードだと、フォントというわけにもいかないですけど。