【Laravel】ダウンロードせずに直接Excelデスクトップを立ち上げる

#Laravel
writtdden by J

こんばんは、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ファイルが表示される」

その際、ざっくりと以下の順で処理が行われます。

  1. クライアントがブラウザで「Excel出力」リンクをクリックする
  2. ブラウザがサーバーにリクエストする
  3. サーバーでリンクに対するルーティング処理が行われる
  4. サーバーからブラウザにExcelファイルを返す
  5. ブラウザがレスポンスを受け取る
  6. ブラウザがExcelデスクトップアプリを立ち上げる
  7. 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ファイルをプレビューする方法を記載できればと思います。

読んでいただきありがとうございました。

Favorite