ExcelファイルをPDFファイルに変換することはできるのでしょうか? Excelファイルを操作することができるライブラリとしてClosedXMLがあります。ExcelがインストールされていないパソコンでもExcelファイルを生成することができるのがClosedXMLの魅力です。

ClosedXMLではExcelファイルをPDFファイルに変換できない

ところがClosedXMLにはExcelファイルをPDFファイルに変換する機能はないそうです。そこで別の方法を考えます。調べてみると [C#]ExcelファイルからPDFファイル出力 などの記事がありました。これを参考にExcelファイルをPDFファイルに変換するアプリケーションを作成します。

ExcelファイルをPDFファイルに変換するクラスを自作する

まず、参照に「Microsoft Excel 16.0 Object Library]」を追加します。

Visual Studio の [プロジェクト] メニューの [参照の追加] で [参照 マネージャー] を表示して、[COM] – [Microsoft Excel 16.0 Object Library] にチェックして [OK] を押下します。

準備は以上です。それでははじめましょう。最初にコンストラクタにExcelファイルのパスと出力したいPDFファイルのパスを渡すとExcelファイルをPDFファイルに変換してくれるクラス ExcelFileToPdfクラスを作成します。

自作クラス ExcelFileToPdf

ExcelFileToPdfクラスのコンストラクタを示します。引数をフィールド変数に格納しているだけです。

SaveAsPDFメソッド

SaveAsPDFメソッドを示します。フィールド変数に格納したExcelFilePathとPdfFilePathからExcelファイルを読み取ってPDFファイルに変換します。このときExcelが起動しますが、ウィンドウは非表示にします。ユーザーからみれば突然Excelが起動するとなにが起きたのか分からず慌てて閉じてしまうかもしれません。これでは処理を続けることができないので裏でやってもらいます。

SaveAsPDFメソッドのなかでやることは以下の3つです。

Excelアプリケーションの生成
Bookを開く
Book内の全シートをPDF形式で保存する

ExportAsFixedFormatメソッドはブックを PDF または XPS 形式に変換して発行します。例外が発生する場合があるので例外処理をしています。

Marshal.ReleaseComObjectで後始末

それから処理が終わったら終了処理をおこなっています。_applicationと_workbookはCOM オブジェクトなので
Close()やQuit()するだけではダメです。Marshal.ReleaseComObjectメソッドを使用して適時に解放しなければなりません。

ExcelFileToPdfクラスを使ってExcelファイルをPDFファイルに変換する

ExcelFileToPdfクラスが完成したらあとはこれをつかってExcelファイルをPDFファイルに変換するだけです。

ボタンをクリックすると変換元のExcelファイルを開くためのダイアログと返還後のPDFファイルを保存する場所を指定するためのダイアログが現れます。ふたつのダイアログでファイルのパスを指定したらExcelFileToPdfのコンストラクタにこれらが渡されます。しばらく待つと処理の結果が表示されます。

ExcelFileToPdf.SaveAsPDFメソッドがfalseを返す場合として、Excelファイルが存在しない、Excelファイルの中身が空などの理由が考えられます。