社内業務システムなどでは、データをExcelへ出力する機能が高確率で要求される。
この業務システムを例えばPHPでつくるような場合は、できるだけデスクトップアプリの動きに近づける工夫が必要である。
今回、PHPのExcel出力処理にこれまで触れたことのなかったVBScriptを補助的に使用し、操作感をデスクトップアプリに近づけることができたのでメモ。
修正前
これまで「Excel出力」機能は、サーバ上に生成したExcelファイルを「ダウンロードさせる」と割り切って以下のような簡単な処理で対応していた。(そこまでヘビーに使われる機能でもなかったため)
$filePath = '/output/test.xls'; // ファイルパス $fileName = 'test.xls'; // ファイル名 header('Content-Type: '); header('Content-Length: '.filesize($filePath)); header('Content-Disposition: attachment; filename="'.$fileName.'"'); echo file_get_contents($filePath); exit;
が、今回Excel出力を頻繁に使用するものを作る機会に遭遇したことと、もともと「ダウンロード」じゃ不満を感じていたのでVBScriptで実装してみた。結果、デスクトップアプリlikeな動きを実現できたので今後も多用しそう。
(実際は下記に加え、ファイルリネーム、存在チェック、ファイル削除などが必要だけど要点のみ記載)
scriptタグ内に下記を記述
Function getFiletoCliant() '端末名取得 Set objNetWork = CreateObject("WScript.Network") getComputerName = objNetWork.ComputerName Set objNetWork = Nothing 'サーバ上のファイルをクライアントへコピー path0="\\srvname\d\output\templete.xls" path1="\\" & getComputerName & "\C$\Users\test\output\" Set fso = CreateObject("Scripting.FileSystemObject") Call fso.CopyFile(path0,path1,True) 'ファイルオープン・最前面表示 Set ExlApp = CreateObject("Excel.Application") ExlApp.Visible = True ExlApp.Workbooks.Open (path1 & "\templete.xls") ExlApp.WindowState=-4143 'CreateObject("WScript.Shell").AppActivate ExlApp.Caption CreateObject("WScript.Shell").SendKeys "%({TAB})" Set ExlApp = nothing End Function
ファイルオープン後、Excelを最前面に表示させることがどうしてもできなかったため、苦し紛れにSendKeysによるAlt+Tab切り替えを行っている。