Java から VBScript を使って Excel を印刷する

公開日: : 最終更新日:2014/01/26 Java ,

背景

Java のデスクトップアプリを作成していたときの要件に「Excel で作成された帳票を印刷する」というものがあった。そのときの試行錯誤をメモしておく。

Java からファイルを印刷する

デスクトップアプリであれば、次の API を利用すれば印刷できる。

コードはこんな感じ。

File excel = new File(EXCEL_PATH);
java.awt.Desktop.print(excel);

これだとちょっと問題が。。。

上記のメソッドで印刷してみたが、ひとつ問題があった。

関数などで自動計算していると、印刷終了後に、閉じるダイアログが表示されてしまう。要件の帳票印刷は、複数枚印刷するので閉じるダイアログが表示されると連続して印刷してくれない。ダイアログの応答を待ってしまうのだ。お客さんに「ダイアログは自分で閉じてね」なんて言えるわけもなく。。。

で、これは Excel のバージョンを変更すれば解決できそうだったのだが、お客さんの都合上変更できなかった。なので、別の方法で印刷することに。

Excel を印刷する VBScript を作った

調べてみると、コマンドプロンプトから印刷するには VBScript を使うことが多いようだ。スクリプトであれば閉じるダイアログの表示も抑制できるだろう。

ということで作成したスクリプトは次の通り。Gist にも登録済み。

Option Explicit
 
Dim obj
Dim objWkBk
 
Set obj = CreateObject("Excel.Application")
Set objWkBk = obj.Workbooks.Open(WScript.Arguments(0))
obj.ActiveWindow.SelectedSheets.PrintOut()
objWkBk.Save
objWkBk.Close
Set objWkBk = Nothing
obj.Quit
Set obj = Nothing

9行目の objWkBk.Save は、閉じるダイアログを表示しないためのもの。保存されていない状態で Excel を閉じようとしているから「本当に閉じていいの?」と聞かれてしまう。なので、保存してしまえばダイアログは表示されない。

このスクリプトの実行方法

このスクリプトが以下に保存されているとして、

  • $PROJECT_ROOT/script/XlsPrint.vbs

コマンドプロンプトから次のように実行すると Excel が印刷できる。

cd $PROJECT_ROOT
cmd /c ./scripts/XlsPrint.vbs EXCEL_FILE_PATH

Java からこのコマンドを実行する方法は ProcessBuilder を使えばいい。次のページがとても参考になった。

Googleアドセンス用(PC)

  • このエントリーをはてなブックマークに追加
  • follow us in feedly

関連記事

no image

プロセスの起動を確認するプログラム

プロセスが起動しているかを確認するプログラムを Java で書いてみました。Excel のプロセス確

記事を読む

no image

Stream#map()とStream#collect()を使ってListを生成する

Java8 から導入された Stream API も少しずつ慣れてきて、「そういえばこういうパターン

記事を読む

medium_2055608272

指定した年月の日付を Calendar オブジェクトの一覧で取得する

小ワザです。 業務で、指定した年月の日付を Calendar オブジェクトの一覧で取得する必要があり

記事を読む

icatch-zip_524574337_mini-thumbnail

Java でファイルが1つだけ圧縮された zip を解凍するサンプル

ファイルが1つだけ圧縮された zip を解凍するサンプルです。 単一ファイルが圧縮された zip

記事を読む

icatch-10139609144_5bc33706f9_z-resized

保存ダイアログを表示させてファイルをダウンロードさせる方法

例えば、ブラウザに表示している画像は右クリックを使ってダウンロードできますが、左クリックから保存ダイ

記事を読む

icatch_4610898091-resized

Java8 の Optional とガード節

メソッドの冒頭で条件チェックを行い、条件を満たしていない場合はさっさと return してしまう「ガ

記事を読む

no image

ファイルに関するユーティリティ

ファイルに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。 作成

記事を読む

icatch_2185253176-resized

Java8 の Optional 型を返す Generics を使ったメソッドを定義する

Java8 の Optional とガード節 に続いて Java8 の Optional ネタ。今回

記事を読む

icatch-thumbnail

レスポンスにサムネイル画像を返す API のサンプル

今回は直接 ImageMagick は関係ありませんが、また画像ネタです。この辺りのことを仕事で扱っ

記事を読む

no image

Exec Maven Plugin で maven コマンドでアプリを起動する

packaging タグに "jar" を指定した Maven プロジェクトをコマンドラインから起動

記事を読む

Googleアドセンス用(PC)

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です


7 − 一 =

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Googleアドセンス用(PC)

icatch-jersey_multi_pathparams
Jerseyの@PathParamはスラッシュの間に複数指定できる

http://hoge-api/user/{id}.{format}

icatch-vagrant_box_customize
VagrantのBoxファイルをカスタマイズして独自のBoxファイルを作成する

配布されている Vagrant の Box ファイルを使って検証環境を

icatch-2015-006-1
バリデーションチェックにJava8のOptionalを使ってスマートに書く(自分比)

Web アプリのバリデーションチェックにアノテーションを使うことが増え

icatch-2015-005-1
ユニットテストの偏りを防ぐ命名規則の付け方

ユニットテスト名に以下の命名規則を付けるようにして二ヶ月ぐらい経った。

icatch-2015-004-1
Vagrantで起動したCentOS上のOctopressをホストOSから確認する設定

タイトルの通りだが、Vagrant を使って起動した CentOS に

→もっと見る

PAGE TOP ↑