【Laravel】ダウンロードせずに直接Excelデスクトップを立ち上げる
こんばんは、Jです。
Laravelを利用したプロジェクトで、ExcelファイルをPCにダウンロードする前にプレビューする方法について調査しました。
ブラウザ側で条件を絞って動的に帳票を作成する際などは、プレビューできると便利ですよね!
今回は、その調査結果の1つを備忘録として記載していきます。
目的
サーバーに保管されているExcelファイルを、PCにダウンロードする前にExcelデスクトップアプリを立ち上げてプレビューする。
結論
リクエスト時のURIの先頭に「Office URI スキーマ」を設定すれば実現できる。
良い例:ms-excel:ofe|u|http://localhost/output.xlsx
悪い例:http://localhost/output.xlsx
Office URI スキーマとは
Microsoft Officeアプリケーションが特定のプロトコルスキーマを使用して文書やファイルを直接開くための特殊なURIスキーマです。
これにより、ウェブブラウザや他のアプリケーションから直接Officeアプリケーションを呼び出してファイルを開くことができます。
つまり、URIの先頭に規定の文字列を添えるだけで、ブラウザから直接Excelデスクトップアプリを立ち上げることができるルールのようなものです。
参考:https://learn.microsoft.com/ja-jp/office/client-developer/office-uri-schemes
開発環境
OS:Windows11 Pro
言語:PHP8.2(Laravel)
ブラウザ:GoogleChrome
全体像のイメージ
次の動きを実現したいと思います。
「ブラウザで「Excel出力」リンクをクリック→ローカルPCのデスクトップアプリが立ち上がる→サーバー側に保存されているExcelファイルが表示される」
その際、ざっくりと以下の順で処理が行われます。
- クライアントがブラウザで「Excel出力」リンクをクリックする
- ブラウザがサーバーにリクエストする
- サーバーでリンクに対するルーティング処理が行われる
- サーバーからブラウザにExcelファイルを返す
- ブラウザがレスポンスを受け取る
- ブラウザがExcelデスクトップアプリを立ち上げる
- ExcelデスクトップでレスポンスのExcelファイルをプレビューする
▼イメージ図
1. ~5. は、よく見るファイル取得までの流れですが、
前述した「Office URI スキーマ」を使うことで6. 以降が実現できてしまうんですね。
なるほど~。
では、次に実際のサンプルコードを見てみましょう。
サンプルコード
諸々省略してしまい恐縮ですが、必要最低限な箇所に絞って見ていきましょう。
ディレクトリ構成
project_root
├routes
│ └web.php
├app
│ └Http
│ └Controllers
│ └ExcelController.php
├resources
│ └views
│ └page.html
└public
└output.xlsx
特に変わりのないLaravelプロジェクトですね。
便宜上、レスポンス予定のExcelファイルはpublic配下に配置しています。
web.php
Route::get('page', function () {
return response()->file(resource_path('views/page.html'));
});
Route::get('output.xlsx', [App\Http\Controllers\ExcelController::class, 'output']);
こちらも特に変わりのないルート定義ですね。
ExcelController.php
public function output() {
$filePath = public_path('output.xlsx');
if(File::exists($filePath)) {
return response()->download($filePath);
}else{
return response()->json(['message' => 'File not found.'], 404);
}
}
Excelファイルを返しているだけの処理で、特に変わりないですよね。
page.html
<a href="ms-excel:ofe|u|http://localhost/output.xlsx">Excel出力</a>
「Excel出力」リンクのみ記載しています。
URIの先頭に”ms-excel:ofe|u|”を記載していますね!←ここが一番重要です!
これこそが「Office URI スキーマ」であり、クリック後のレスポンスをExcelデスクトップで立ち上げてくれるトリガーになっています!
クリックしてみると、初回は画像のようにブラウザからExcelを開くか聞かれます。
「Excelを開く」を選択することで、Excelデスクトップが立ち上がります!!
おわりに
いかがでしたか。
次に機会があれば、サーバー側で動的に作成したExcelファイルをプレビューする方法を記載できればと思います。
読んでいただきありがとうございました。