勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

JavaScriptでtableタグをエクセルファイル(xlsx)としてダウンロードさせる方法

  JavaScript

table内のデータを何らかのファイルでダウンロードさせたい。通常PHPでCSVファイル化する方法を取るが、ASPを利用したサイトのためPHPは使えないという制限があった。「FileSaver.js」と「SheetJS」を使用するとJavaScriptにてエクセルファイル形式でダウンロード可能。以下に実装方法をメモ。

 

サンプル

https://taitan916.info/sample/table_to_xlsx/

 

FileSaver.js

公式サイト

https://github.com/eligrey/FileSaver.js

CDN

以下で呼び出す。

<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js"></script></head>

異なるバージョンを使用したい場合は以下から探す。

https://cdnjs.com/libraries/FileSaver.js/2.0.0

 

SheetJS

公式サイト

https://docs.sheetjs.com/

リファレンス

https://docs.sheetjs.com/docs/

CDN

以下で呼び出す。

<script src="https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js"></script>

異なるバージョンを使用したい場合は以下のReleases部分から探す。

https://cdn.sheetjs.com/

 

実装方法

ソースコード

<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>HTMLのtableタグをxlsxファイルに変換</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script lang="javascript" src="https://cdn.sheetjs.com/xlsx-0.20.1/package/dist/xlsx.full.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.0/FileSaver.min.js"></script></head>
<body>
    <div class="container">
        <div class="card mt-3 mb-3">
            <div class="card-header">都道府県一覧</div>
            <div class="card-body">
                <button type="button" class="btn btn-primary mb-3" id="xlsx_dlbtn">エクセルファイルDL</button>
                <table class="table table-bordered table-condensed table-to-export" data-sheet-name="都道府県一覧">
                    <tr>
                        <th>都道府県コード</th>
                        <th>都道府県 県なし</th>
                        <th>都道府県 県あり</th>
                        <th>都道府県 ひらがな</th>
                        <th>都道府県 ローマ字</th>
                    </tr>
                    <tr>
                        <th>1</th>
                        <td>北海道</td>
                        <td>北海道</td>
                        <td>ほっかいどう</td>
                        <td>hokkaido</td>
                    </tr>
                    <tr>
                        <th>2</th>
                        <td>青森</td>
                        <td>青森県</td>
                        <td>あおもり</td>
                        <td>aomori</td>
                    </tr>

                    <!-- 省略 -->

                    <tr>
                        <th>47</th>
                        <td>沖縄</td>
                        <td>沖縄県</td>
                        <td>おきなわ</td>
                        <td>okinawa</td>
                    </tr>
                </table>
            </div>
        </div>
    </div>
    <script>
    $(`#xlsx_dlbtn`).on('click', function () {

        const file_name = `test.xlsx`;

        const wopts = {
            bookType: 'xlsx',
            bookSST: false,
            type: 'binary'
        };

        const workbook = {SheetNames: [], Sheets: {}};

        $.each($(`.table-to-export`), function( index, val ){
            let sheet_name = val.getAttribute('data-sheet-name');
            if( !sheet_name ){
                sheet_name = 'Sheet' + index;
            }
            workbook.SheetNames.push(sheet_name);
            workbook.Sheets[sheet_name] = XLSX.utils.table_to_sheet(val, wopts);
        });

        const wbout = XLSX.write(workbook, wopts);

        function s2ab(s) {
            const buf = new ArrayBuffer(s.length);
            const view = new Uint8Array(buf);
            for( let i = 0; i != s.length; ++i ){
                view[i] = s.charCodeAt(i) & 0xFF;
            }
            return buf;
        }

        saveAs(new Blob([s2ab(wbout)], {type: 'application/octet-stream'}), file_name);
    });
    </script>
</body>
</html>

ファイル名

file_name部分でエクセルファイル名を指定する。

シート名

tableタグのdata-sheet-name部分でシート名を指定する。尚、tableタグを複数記述した場合、同一エクセルファイル内で複数シートが生成される。

CSVファイル化したい場合

エクセルではなくCSVファイル化したい場合はfile_nameの拡張子をcsvにするのとwoptsのbookTypeをcsvで指定すること。

 

便利ツール

エクセル→tableタグへの変換ツール

https://html-css-javascript.com/excel-table-html/

 

所感

今回の対応方法はtable内に全データが表示されている必要があり、ページャー付きのデータ一覧ページとかだと使えないが引き出しの一つとして覚えておきたい。

それにしてもJavaScriptでエクセルファイル化できるというのは驚いた。

 

参考サイト

https://qiita.com/tomgoodsun/items/0107e5d778b803935fc0

 - JavaScript

  関連記事

JavaScriptのライブラリ「crypto-js」を使用して暗号化・復号化・ハッシュ化する方法

JavaScriptにてCookie等にデータを保存する際に暗号化したものを保存 ...

JavaScriptでlocalStorageを簡単に操作できる「store.js」ライブラリの利用方法

以前Dexie.jsを利用してIndexedDBを取り扱う方法をメモしたが、今回 ...

JavaScriptで画像読み込み完了のタイミングを検知する「imagesLoaded」ライブラリの利用方法

大き目のサイズの画像をページに設置すると読み込み完了まで時間がかかる。その画像が ...

ローソク足のグラフをJavaScriptで描写する方法(highstock)

株価か仮想通貨などの値動き(チャート)を図表とするローソク足のグラフを何らかの方 ...

Push.jsを用いてプッシュ通知を実装&Web Audio APIで通知音も鳴らす方法

プッシュ通知(デスクトップ通知)を実装してみたい。また、通知の際は分かりやすいよ ...