このまえのJavaからExcelを画面に出さずに、マクロを引数つきで呼び出す。の応用で、サーブレットから、Excelを呼び出してみましょう。
■仕様
Excelを画面に出さずに、マクロを、コマンドラインから引数つきで呼び出すで示した、Excelマクロ(指定された内容を指定されたファイルに書き出す関数testmsg)がはいった、Excelファイル、book1.xlsが
¥¥tmp¥¥book1.xls
(¥は、本当は半角。以下同じ)
にあったとして
それを起動するVBスクリプト(さっきのところにプログラムは書いてあります)test.vbsが
¥¥tmp¥¥test.vbs
としてあったとき、サーブレットを引数
fname=書き出しファイル名&msg=書き出したい内容
で送ると、
¥¥tmp¥¥書き出しファイル名
に、書き出したい内容を書いて、保存します。
なお、C:¥WINDOWS¥SYSTEM32にcmd.exeがあるとします。
■ソース
このようなサーブレットを作ればいいみたい(クラス名はexecVBSとしました)
import java.io.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class execVBS extends HttpServlet { /* * メソッド:service * 内容 :サーブレットが入ってくるところ * */ public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //==============================// // 引数の取得 // //==============================// request.setCharacterEncoding("utf-8"); String fname = request.getParameter("fname"); String msg = request.getParameter("msg"); //==============================// // プログラム実行 // //==============================// String sendData = "ret ok!"; Runtime r = Runtime.getRuntime(); try { String[] cmdList = new String[6]; cmdList[0]="C:¥¥WINDOWS¥¥SYSTEM32¥¥cmd.exe"; cmdList[1]="/c"; cmdList[2]="¥¥tmp¥¥test.vbs"; cmdList[3]="/file:¥¥tmp¥¥book1.xls"; cmdList[4]="/outfname:¥¥tmp¥¥" + fname; cmdList[5]="/msg:" + msg; r.exec(cmdList); } catch(Exception e) { sendData = e.toString(); } //==============================// // 出力する // //==============================// // ContentTypeを設定 response.setContentType("text/plain; charset=utf-8"); response.addHeader("Cache-Control", "no-cache"); response.addHeader("Pragma", "no-cache"); // 出力用PrintWriterを取得 PrintWriter out = response.getWriter(); out.println(sendData); } } |
で、呼び出しは、たとえば、ローカル127.0.0.1:8080においたとすれば、
http://127.0.0.1:8080/vbs/servlet/execVBS?fname=kekka.txt&msg=abcdefg
とすると、tmpフォルダのkekka.txtに、abcdefgという内容で、ファイルを書き出します。
cmd.exeの指定ですが、"C:¥¥WINDOWS¥¥SYSTEM32¥¥cmd.exe"と、フルパスで指定しないとダメでした。