ハロの外部記憶インターフェイス

そろそろ覚える努力が必要かも…

ExcelファイルをPdfに変換する。

前提条件

  • 実行するサーバーのExcelアプリを実行するため、サーバーにExcelのインストールが必要
  • バージョンは2007以降である必要
  • .NETのアセンブリを利用するため、Windowsサーバー限定となる。

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を利用することにした。