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

Google Guava の Function を使った文字列加工の FluentIterable サンプル

お客様の都合上 Java7 で開発している案件があるのだが、Java8 の Function とか

記事を読む

no image

google-gson でシリアライズ・デシリアライズしたサンプル

これまで Java で JSON を扱うときは JSONIC を使っていたが、google-gson

記事を読む

no image

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

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

記事を読む

no image

ファイルの拡張子が JPG であるかを問い合わせるスニペット

特に目新しいこともないが、同じようなことをする機会があるかもしれないのでメモ。Gist にも登録済み

記事を読む

no image

Spark を使って JSON を返すシンプルな API を書いてみた

必要に迫られてモックの API を作成することになった。 大した工数を割けないので使ったことのある

記事を読む

no image

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

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

記事を読む

no image

ディレクトリに関するユーティリティ

ディレクトリに関するスニペットをいくつか書いた。いつかコピペする日が来ると思うのでメモしておく。

記事を読む

no image

画像ファイルのサイズ(縦横じゃなくて容量)を取得するスニペット

File#length で取得できるとは知らなかった。Gist にも登録済み。 /** * 画

記事を読む

icatch-upload_1229138273_mini-thumbnail

InputStream に格納されているストリームデータのサイズを取得する

Jersey を使った Web アプリを作成中なんですが、 enctype="multipart/f

記事を読む

GradleLogoReg

Gradle で Java アプリのプロジェクトを作成して Eclipse にインポートするまでの手順

Mac に SDKMAN! を使って Gradle をインストールしたので、実際にプロジェクトを作成

記事を読む

Googleアドセンス用(PC)

Message

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


+ 4 = 五

次の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 ↑