table要素をCSV形式でダウンロードする機能を実現する
table要素をCSV形式でダウンロードする機能を実現するために作成しました。
大抵のテーブルにそのまま使用できるといいな…。
仕様・制約
- 指定のtableをCSVで取得する
- UTF-8BOMありで出力する
- Excel対策のため
- カンマ(,)、ダブルクォーテーション(")、改行(\r?\n)をエスケープ文字で括る
- エスケープ文字は、二重にする
display:none;
の要素を取得する- 取得しない場合、
textContent
ではなくinnerText
を使用する
- 取得しない場合、
<br>
改行は消滅するtextContent
の制約で<br>
が消滅する<br>
直後に\n
改行を入れると改行を取得できる(表示上は改行1回分となる)
ソース
tableのCSVダウンロード<table class="sample-table">...</table>
<a href="javascript:void(0)" onclick="onCSVDownload(this, document.querySelector('.sample-table'), 'table.csv');">CSVダウンロード</a>
<script>
// テーブルデータのCSVダウンロード
function onCSVDownload(a, table, filename) {
var escaped = /,|\r?\n|\r|"/;
var e = /"/g;
// データ作成
var bom = new Uint8Array([0xEF, 0xBB, 0xBF]); // UTF-8BOMあり
var csv = [], row = [], field, r, c;
for (r=0; r<table.rows.length; r++) {
row.length = 0;
for (c=0; c<table.rows[r].cells.length; c++) {
field = table.rows[r].cells[c].textContent;
row.push(escaped.test(field)? '"'+field.replace(e, '""')+'"': field);
// 区切り、改行、エスケープ文字を含む場合、エスケープ文字文字で囲む(エスケープ文字は二重にする)
}
csv.push(row.join(','));
}
//var blob = new Blob([/*bom, */csv.join('\n')], {'type': 'text/csv'}); // BOMなし
var blob = new Blob([bom, csv.join('\n')], {'type': 'text/csv'});
// 保存
if (window.navigator.msSaveBlob) {
// IE用(保存 or 開く保存)
window.navigator.msSaveBlob(blob, filename);
//window.navigator.msSaveOrOpenBlob(blob, filename);
} else {
a.download = filename;
a.href = window.URL.createObjectURL(blob);
}
}
</script>
サンプル
連番 | 氏名 | 氏名(カタカナ) | 性別 | 電話番号 | 生年月日 |
---|---|---|---|---|---|
1 | 深沢宗一 | フカザワソウイチ | 男 | 028-739-0004 | 1995/08/25 |
2 | 浅川明夫 | アサカワアキオ | 男 | 083-168-5597 | 1979/03/18 |
3 | 梅田司 | ウメダツカサ | 男 | 0779-29-4583 | 1984/03/30 |
4 | 鵜飼輝夫 | ウカイテルオ | 男 | 0246-88-7796 | 1980/04/13 |
5 | 山川幸子 | ヤマカワサチコ | 女 | 086-139-2781 | 1976/08/01 |
6 | 大滝日出夫 | オオタキヒデオ | 男 | 0845-64-7867 | 1989/05/09 |
7 | 安永博久 | ヤスナガヒロヒサ | 男 | 06-9707-2143 | 1963/11/06 |
8 | 山本千尋 | ヤマモトチヒロ | 女 | 086-464-6551 | 1976/02/16 |
9 | 出口祐司 | デクチユウジ | 男 | 088-18-2137 | 1963/05/28 |
10 | 島津昌一郎 | シマヅショウイチロウ | 男 | 06-2275-4512 | 1991/02/04 |
xxx | A,I | あ い | 男 | 06"2275"4512 | 1991/02/04 |
※4列目の性別データがdisplay:none;
で非表示