ExcelファイルをPdfに変換する。
前提条件
Visual Studioでプロジェクトを生成し、参照を追加
Nugetで以下のパッケージを追加します。 * Microsoft.Office.Interop.Excel
using
オープンするオブジェクトはすべて「ComObject」になるらしく、いちいち開放してあげないとプロセスが残ってしまう。
using Microsoft.Office.Interop.Excel; // Excel関連 using System.Runtime.InteropServices; // ComObjectを開放するため
ExcelファイルのOpen
private Application _application = new Application(); private Workbook _workbook; _application.Visible = false; // Excel Window 非表示 _workbook = (Workbook)_application.Workbooks.Open(filepath);
ExcelをPdf出力する
そなえつけの「ExportAsFixedFormat」関数でExcelのPdf出力は簡単に出来た。
_workbook.Worksheets.Select(); // 全シート選択状態 _workbook.ExportAsFixedFormat( XlFixedFormatType.xlTypePDF, //XPSとPDFのどれか pdfFilePath, //PDFファイルの出力パス XlFixedFormatQuality.xlQualityStandard); //品質:StandardとMinimumのみ
ComObjectの開放
面倒だったのが、SheetもCellもつくたびComObjectの参照カウントが増えるため、任意に解除する必要があった。
public void SetWorkSheet(int sheetNo) { Marshal.ReleaseComObject(_worksheet); _worksheet = _workbook.Worksheets.Item[sheetNo]; } public string GetCellText(int rowNo, int colNo) { string ret; var cell = _worksheet.Cells[rowNo, colNo]; ret = cell.Text; Marshal.ReleaseComObject(cell); return ret; } public void Close() { if (_worksheet != null) { Marshal.ReleaseComObject(_worksheet); _worksheet = null; } if (_workbook != null) { _workbook.Close(false); // 変更分を保存せず終了する。 Marshal.ReleaseComObject(_workbook); _workbook = null; } if (_application != null) { _application.Quit(); Marshal.ReleaseComObject(_application); _application = null; } }
作ったソースの中から、一部メモとして残す。
最終的に
ComObject開放がうまくいかなかったり、プロセスが残ったりしたので、Excelの操作系はClosedXMLを利用することにした。