nyaou.com

(VB.NET)Excel印刷時にプリンタの給紙トレイを変更する

2014-07-03 20:37:01

プログラムで自動生成~自動印刷をしたい Excel ファイルがあって、ついでに印刷時に給紙トレイも変更したいな~と思ってたのですが、Excel2007 から追加された xlsx 形式で意外と簡単にこれができるんですね。

xlsx 形式は「2007 Office system 互換機能パック」をインストールすることで、2007 以前のバージョンでも使えるようです。

給紙トレイの変更

給紙トレイの変更方法ですが、ざっと以下の手順で行います。
いずれも Excel2007 がインストールされている環境でないと行えないようです。( Windows7 + Excel2003 の環境では ZIP にした後に解凍できませんでした。)

プログラム内でファイルの解凍や圧縮をする場合は Visual Studio 2010 以前なら J# のライブラリを使い、Visual Studio 2012 以降なら .NET に標準でついてるファイル圧縮クラスを使えばいけそうです。(私は 2007 を使用して J# で行いました)

Excel ファイル印刷時のプリンタ設定

PrinterSettings1.bin の設定を反映させるために、Excel ファイルを開く際または印刷時に、以下の設定が必要となります。

パターン1:プログラム内で Excel ファイルの生成~印刷を行う

PrintOut() メソッドで印刷時に、引数の ActivePrinter に給紙トレイを変更したいプリンタ名を指定しなければなりません。

パターン2:プログラム内で Excel ファイルの生成して開き、ユーザが Excel ファイルを手動印刷

印刷前に ActivePrinter プロパティに給紙トレイを変更したいプリンタ名を指定する必要があります。
この場合、「プリンタ名 on ポート名」と指定するのだが、Ne から始まるポート名の場合はレジストリに登録されているプリンタ情報を取得する必要があるため、コードが複雑になりそう。

        Dim keyName As String = "Software\Microsoft\Windows NT\CurrentVersion\Devices"
        Dim regName As String = "プリンタ名"
        Dim regKey As RegistryKey = Nothing
        Dim values As String()
        Dim portName As String = Nothing

        Try
            regKey = Registry.CurrentUser.OpenSubKey(keyName)
            values = CStr(regKey.GetValue(regName)).Split(","c)
            If values.Count >= 2 Then
                portName = values(1)
            End If
        Catch ex As Exception
            Console.WriteLine(ex.Message)
        End Try
        Console.WriteLine(portName)

パターン3:プログラム内でExcelファイルの生成をしてプログラム終了後、ユーザがExcelファイルを手動で開き、印刷

この場合、ユーザが「通常使うプリンタ」を印刷したいプリンタに手動で設定する必要があります。
または、プログラム実行時に予め通常使うプリンタを設定する。

補足

DEVMODE については、Winows API を使用してプリンタの詳細設定画面からユーザの設定した内容を取得して保存、読み込みなんてこともできます。
これはこれで便利だけど、使い道がなかなか思いつかない。

ついでに、今回は給紙トレイの変更ですが、他の詳細設定の内容も同様の方法で変更できます。
ただ、プリンタ固有の設定に関してはできないよう?
(マル秘スタンプとかは設定できませんでした。プリンタの初期値が優先されちゃいました。)

以上です。

なんか微妙に使いにくいし、そもそもひな型のExcelファイル用意しといてあとは対象プリンタ指定しとけばいいだけな気もしますが、とりあえず面白い方法だと思ったので紹介。

参考サイト

このエントリーをはてなブックマークに追加

当サイトは管理人「まだこ」による様々なジャンルのレビューサイトです。

ご連絡は、TwitterFacebook でお願いします。