(VB.NET)Excel印刷時にプリンタの給紙トレイを変更する
2014-07-03 20:37:01
プログラムで自動生成~自動印刷をしたい Excel ファイルがあって、ついでに印刷時に給紙トレイも変更したいな~と思ってたのですが、Excel2007 から追加された xlsx 形式で意外と簡単にこれができるんですね。
xlsx 形式は「2007 Office system 互換機能パック」をインストールすることで、2007 以前のバージョンでも使えるようです。
給紙トレイの変更
給紙トレイの変更方法ですが、ざっと以下の手順で行います。
いずれも Excel2007 がインストールされている環境でないと行えないようです。( Windows7 + Excel2003 の環境では ZIP にした後に解凍できませんでした。)
- 1.Excel を開いて、適当に文字を入力し、プリンタ設定で給紙トレイの設定を行う。
- 2.1.の Excel を xlsx 形式で保存する。
- 3.2.で保存したファイルの拡張子を xlsx → zip に変更する。
- 4.3.のファイルを解凍する。
- 5.解凍したファイルの中にある xl/PrinterSettings/PrinterSettings1.bin を取り出す。これがプリンタの詳細設定が保存されたバイナリファイルです。Windows の DEVMODE 構造体に保持される内容のため、DEVMODE と呼ばれることも?
- 6.あとは、プログラムなりで生成した Excel ファイルの拡張子を zip にして保存&解凍、5.で取り出した PrinterSettings1.bin を置き換えて圧縮(ディレクトリ構成はそのままで)、圧縮したファイルの拡張子を xlsx にするだけです。
プログラム内でファイルの解凍や圧縮をする場合は 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ファイル用意しといてあとは対象プリンタ指定しとけばいいだけな気もしますが、とりあえず面白い方法だと思ったので紹介。