nanisore oishisou

Webエンジニアあるまさんのゆるふわ奮闘記。

LaravelでViewからExcelを作りPDFでエクスポートする方法 【四苦八苦編】

こんにちは。ベル子です。
壮大な2話完結シリーズとなっており、今回は四苦八苦した結果をまとめます。
次回は手順を完結にまとめたものをお届けする予定です。


★マイ ミッション
ExcelファイルをPDFに変換して出力せよ。

結論から言うと、ExcelからPDFにする方法として、
Excelファイルを直接PDFに変換して出力するナイスな方法は見当たりませんでした。
うえーん;;誰か教えてー。

しかし、諦めるわけにはいきません!
Excelファイルを作成し、それをPDFにする方法として
maatwebsiteのLaravel Excelというパッケージを使う方法なら見つかりました。

Excelファイルの中身をインポートしてViewに渡してあれば、
そのデータを使ってExcelファイルを作ってPDFに書き出せるのです。
配列に直接データを渡す方法もありましたが、
ViewからExcelにすれば整形する手間も省けるからラッキー♪ナイス!これだーーー!!
と思ったわけです。

他にも、
barryvdh/laravel-dompdfを使う方法もあるようです。
こちらもhtmlやViewからPDFを作成できるとのこと。


どちらも確かにPDFにはできるのですが、

日本語が表示されていない

という大問題に直面しました。


どちらもdompdfというPDFコンバータを使うのですが、日本語フォントをインストールしてやらなければいけないようです。
こちらのサイトを参考にインストールしてみようとするものの、書いてあることの半分くらいしか理解できていないため、エラーが出てインストールできない。。。。

匠に相談してみると「vendor/phenx/php-font-lib/classes/Font.phpってファイルをコピーして、vendor/dompdf/dompdf/lib/php-font-lib/classes/に入れたらいいんじゃないの?」ということだったので、そのようにしてみると無事にフォントはインストールできました。
すごい、SASUGAです。

フォントはインストールできたはずなのに、全然、日本語が表示されません。
泣きたくなりました。

この人のブログのように文字コードのmetaタグも

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

にしてみました。

この人の意見も参考にしてapp/storage/fontsというところにフォントも置いてみました。
パーミッションもwritableにしました。
だけど表示されません。

もう、おうちに帰りたいな....そんなことばかりを考えていたときです。
ある神的発想が舞い降りてきました。
そうだ、dompdfではなく別のコンバータを使おう!

Laravel Excelはdompdfとtcpdfとmpdfの3つのコンバータに対応していて、vendor/maatwebsite/excel/src/config/export.phpというファイルの以下の部分でドライバーが指定できます。


    'pdf'                         => array(

        /*
        |-------------------------------------------------------------------------- 
        | PDF Drivers
        |-------------------------------------------------------------------------- 
        | Supported: DomPDF, tcPDF, mPDF
        */
        'driver'  => 'DomPDF',

この人の手順に従ってフォントをインストールしたら、今度はすんなりとインストールできました。

やった、これなら行ける!
そう思ってダウンロードボタンをクリックしました。
ドキドキ。この胸の高鳴り♪

プギャーッ!!

?とか□とかばっかりーー。
どうやらフォントの問題ではなかったようです。

やはり、どう考えても文字コードの問題でしょう。
私だって、そうは思ってたんです。
でも、いろいろ悩みすぎて出来なすぎて田舎に帰りたくなってきたので(私の田舎は東京ですが)、やっぱり匠に相談してみることにしました。

「どっかの文字コードがおかしいんじゃない?」

すごい、私と同意見です。
これで完全にやる気のなくなった私に、また神的発想が舞い降りてきました。

もしかして読み込んでいるViewに文字コードのmetaタグが入ってないとダメなのかな?

そこでViewに文字コードのmetaタグを無理やり入れてみたところ、見事に日本語が表示されました。(ロードしていたのはパーシャルなViewだったんです。)

「っていうか、専用のViewを作ったほうがいいんじゃないの?」
というごもっともなアドバイスもいただき、そのようにしてみたのですが、
なんか.....レイアウトが崩れてるし、CSSを読み込んだらエラーが出る....。

Laravel Excelのドキュメントを読んでみます。

Most of the HTML tags are supported. 
Most of the general styles are supported.

Most of ということは対応していないタグもあるということでしょうし
Most of the general ということは一般的じゃないスタイルは対応してないよってことでしょう。


ふむー、せっかくPDFにしているのに綺麗じゃないというのは業務に使うには厳しいというか、
その辺のViewをきっちり作りこむ必要性がありそうです。

というのが、今回の結論です。

次回、「果たしてベル子は簡潔に手順を説明できるのか?!」
お楽しみにね。