ExcelファイルからPDFファイルやXPSファイルを作成する

Hey Scripting Guy! BLOG(海外サイト) は今週はExcel特集をしているようです。

その中で、ExcelファイルをPDFとして保存する記事がありました。

ネタ元「Save a Microsoft Excel Workbook as a PDF File by Using PowerShell

この記事のスクリプトをちょっと加工して、次のような関数を作成したので紹介します。

function Convert-Xls([string]$path, [switch]$xps)
{
    $xlFixedFormat = "Microsoft.Office.Interop.Excel.xlFixedFormatType" -as [type]

    # Excelオブジェクトの作成
    $objExcel = New-Object -ComObject Excel.Application
    $objExcel.Visible = $False

    $workbook = $objExcel.workbooks.Open($path, 3)
    $workbook.Saved = $True

    # ファイル名からフルパスを取得して拡張子を外す
    $fullpath = [System.IO.Path]::GetFullPath($path)
    $filepath = [System.IO.Path]::GetFileNameWithoutExtension($fullpath)

    if ( $xps )
    {
        # XPSとして保存する
        $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypeXPS, $filepath + ".xps")
    }
    else
    {
        # PDFとして保存する
        $workbook.ExportAsFixedFormat($xlFixedFormat::xlTypePDF, $filepath + ".pdf")
    }

    # Excelの終了
    $objExcel.Workbooks.Close()
    [void]$objExcel.Quit
}

この関数を使用すると、任意のExcelファイルからPDFやXPSファイルを作成することができます。

書式は
Convert-Xls PDFやXPSの作成元となるExcelファイルのパス [-XPS]

たとえば C:\Work\Test.xls からPDFを作成するには

Convert-Xls C:\Work\Test.xls

もしもXPSファイルを作成したい場合はスイッチパラメータ -XPS を使用して下記のように記述します。

Convert-Xls C:\Work\Test.xls -XPS

この関数を使用すれば、わざわざExcelを起動してPDFやXPSに保存し直す必要がなくなります。
ぜひお試しください。

Excelブックを操作する

ご無沙汰しております。
2010/7/7でPowerShell from Japan!! は2周年を迎えることができました。
最近エントリーが少なく、楽しみにされている方には本当に申し訳ありません。
今後ともご愛顧のほどよろしくお願いいたします。

さて、今回はPowerShellでExcelを操作する方法です。
まだ取り上げたことがなかったので記しておきます。

まずはExcelブックを作成する方法ですが、これにはNew-Objectコマンドレットを使用します。
また、作成したExcelを画面上に表示させる(起動する)には、作成したオブジェクトのVisibleプロパティをTrueにします。

下記がそのコード例です。

#Excelオブジェクトの作成
$xls = New-Object -ComObject Excel.Application
#Excelを画面に表示する
$xls.Visible = $True

次に既存のExcelファイルを開く方法です。
作成したExcelオブジェクトのWorkBooks.Open(ファイル名) を使用します。
また、1つ目のスプレッドシートに接続するにはWorksheets.Item(シート番号)を使用します。

下記がそのコード例です。

#既存のExcelファイルを開く
$books = $xls.Workbooks.Open("C:\Work\Test.xls")
#シートへ接続
$sheet = $book.Worksheets.Item(1)

今度はセル操作です。
先ほど接続したシートのオブジェクト($sheet)を使用して Cells.Item(行,列) プロパティに対して値をセットします。

下記がそのコード例です。

#セル(1,2)への書き込み
$sheet.Cells.Item(1,2) = "TEST"

最後に作成したExcelを保存して終了します。
上書き保存はExcelオブジェクトのSaveメソッドを使用します。新規保存はSaveAs(ファイル名)メソッドを使用します。
あとは、ブックのクローズ、Excelのクローズをし、最後にガベージコレクタを動作させます。

下記がそのコード例です。

#上書き保存する
$xls.ActiveWorkbook.Save()
#ブックのクローズ
$books.Close()
#Excelのクローズ
$xls.Quit()
#ガベージコレクタを動作させる
[GC]::Collect()