jQueryとHTMLを使ったCSVへの書き出し
質問
私は外部のプラグインやAPIを使用せずに、私はcsvにエクスポートする必要がある表形式のデータを持っています。私は
window.open
メソッドで MIME タイプを渡しましたが、以下のような問題に直面しました。
jQueryを使用してMicrosoft ExcelまたはOpenOfficeがシステムにインストールされているかどうかを判断する方法
このコードは、システムに何がインストールされているか、つまり、OpenOfficeかMicrosoft Excelかに依存しないものでなければなりません。私は、CSVが両方のエディターで表示されることを期待できるフォーマットであると信じています。
コード
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<script type="text/JavaScript">
$(document).ready(function(){
$("#btnExport").click(function(e) {
var msg = GetMimeTypes();
//OpenOffice
window.open('data:application/vnd.oasis.opendocument.spreadsheet,' + $('#dvData').html());
//MS-Excel
window.open('data:application/vnd.ms-excel,' + $('#dvData').html());
//CSV
window.open('data:application/csv,charset=utf-8,' + $('#dvData').html());
e.preventDefault();
});
});
function GetMimeTypes () {
var message = "";
// Internet Explorer supports the mimeTypes collection, but it is always empty
if (navigator.mimeTypes && navigator.mimeTypes.length > 0) {
var mimes = navigator.mimeTypes;
for (var i=0; i < mimes.length; i++) {
message += "<b>" + mimes[i].type + "</b> : " + mimes[i].description + "<br />";
}
}
else {
message = "Your browser does not support this ";
//sorry!
}
return ( message);
}
</script>
</head>
<body>
<div id="dvData">
<table>
<tr>
<th>Column One </th>
<th>Column Two</th>
<th>Column Three</th>
</tr>
<tr>
<td>row1 Col1</td>
<td>row1 Col2</td>
<td>row1 Col3</td>
</tr>
<tr>
<td>row2 Col1</td>
<td>row2 Col2</td>
<td>row2 Col3</td>
</tr>
<tr>
<td>row3 Col1</td>
<td>row3 Col2</td>
<td>row3 Col3</td>
</tr>
</table>
</div>
<br/>
<input type="button" id="btnExport" value=" Export Table data into Excel " />
</body>
エラー
CSVです。 ブラウザ上で認識されない
ODS & Excelです。 は動作していますが、システムがインストールされたExcelまたはインストールされたopenofficeを持っているときに生成するためにどちらを見つけることができないのですか?
IE バージョン8:それは完全に動作しません、新しいウィンドウで開き、以下のスクリーンショットのように。
どのように解決するのですか?
デモ
説明は以下をご覧ください。
$(document).ready(function() {
function exportTableToCSV($table, filename) {
var $rows = $table.find('tr:has(td)'),
// Temporary delimiter characters unlikely to be typed by keyboard
// This is to avoid accidentally splitting the actual contents
tmpColDelim = String.fromCharCode(11), // vertical tab character
tmpRowDelim = String.fromCharCode(0), // null character
// actual delimiter characters for CSV format
colDelim = '","',
rowDelim = '"\r\n"',
// Grab text from table into CSV formatted string
csv = '"' + $rows.map(function(i, row) {
var $row = $(row),
$cols = $row.find('td');
return $cols.map(function(j, col) {
var $col = $(col),
text = $col.text();
return text.replace(/"/g, '""'); // escape double quotes
}).get().join(tmpColDelim);
}).get().join(tmpRowDelim)
.split(tmpRowDelim).join(rowDelim)
.split(tmpColDelim).join(colDelim) + '"';
// Deliberate 'false', see comment below
if (false && window.navigator.msSaveBlob) {
var blob = new Blob([decodeURIComponent(csv)], {
type: 'text/csv;charset=utf8'
});
// Crashes in IE 10, IE 11 and Microsoft Edge
// See MS Edge Issue #10396033
// Hence, the deliberate 'false'
// This is here just for completeness
// Remove the 'false' at your own risk
window.navigator.msSaveBlob(blob, filename);
} else if (window.Blob && window.URL) {
// HTML5 Blob
var blob = new Blob([csv], {
type: 'text/csv;charset=utf-8'
});
var csvUrl = URL.createObjectURL(blob);
$(this)
.attr({
'download': filename,
'href': csvUrl
});
} else {
// Data URI
var csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csv);
$(this)
.attr({
'download': filename,
'href': csvData,
'target': '_blank'
});
}
}
// This must be a hyperlink
$(".export").on('click', function(event) {
// CSV
var args = [$('#dvData>table'), 'export.csv'];
exportTableToCSV.apply(this, args);
// If CSV, don't do event.preventDefault() or return false
// We actually need this to be a typical hyperlink
});
});
a.export,
a.export:visited {
display: inline-block;
text-decoration: none;
color: #000;
background-color: #ddd;
border: 1px solid #ccc;
padding: 8px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<a href="#" class="export">Export Table data into Excel</a>
<div id="dvData">
<table>
<tr>
<th>Column One</th>
<th>Column Two</th>
<th>Column Three</th>
</tr>
<tr>
<td>row1 Col1</td>
<td>row1 Col2</td>
<td>row1 Col3</td>
</tr>
<tr>
<td>row2 Col1</td>
<td>row2 Col2</td>
<td>row2 Col3</td>
</tr>
<tr>
<td>row3 Col1</td>
<td>row3 Col2</td>
<td>row3 Col3</td>
</tr>
<tr>
<td>row4 'Col1'</td>
<td>row4 'Col2'</td>
<td>row4 'Col3'</td>
</tr>
<tr>
<td>row5 "Col1"</td>
<td>row5 "Col2"</td>
<td>row5 "Col3"</td>
</tr>
<tr>
<td>row6 "Col1"</td>
<td>row6 "Col2"</td>
<td>row6 "Col3"</td>
</tr>
</table>
</div>
2017年現在
HTML5を使用するようになりました
Blob
と
URL
を優先する方法として
Data URI
が望ましいとされています。
インターネットエクスプローラの場合
他の回答では
window.navigator.msSaveBlob
しかし、これは
IE10/Window 7 および IE11/Windows 10 をクラッシュさせます。
. Microsoft Edgeで動作するかは不明です。
Microsoft Edge イシューチケット #10396033
).
Microsoft 自身の開発者ツール/コンソールでこれを呼び出すだけで、ブラウザがクラッシュします。
navigator.msSaveBlob(new Blob(["hello"], {type: "text/plain"}), "test.txt");
最初の回答から4年後、IEの新しいバージョンにはIE10、IE11、そしてEdgeがあります。これらはすべて、Microsoft が発明した機能でクラッシュします (遅い拍手)。
追加
navigator.msSaveBlob
のサポートは自己責任でお願いします。
2013年現在
通常、これはサーバー サイド ソリューションを使用して実行されますが、これはクライアント サイド ソリューションに対する私の試みです。単に HTML を
Data URI
としてHTMLをダンプするだけではうまくいきませんが、役に立つステップです。そこで
- テーブルの内容を有効な CSV フォーマットの文字列に変換します。(これは簡単な部分です。)
-
ブラウザに強制的にダウンロードさせる。その
window.open
のアプローチは Firefox では機能しないので、私は<a href="{Data URI here}">
. -
デフォルトのファイル名を割り当てるには
<a>
タグのdownload
属性は、Firefox と Google Chrome でしか動作しません。単なる属性なので、優雅に劣化していきます。
注意事項
- ボタンのように見えるようにリンクをスタイルすることができます。この作業はあなたにお任せします
- IEにはデータURIの制約がある . 参照してください。 データ URI スキームと Internet Explorer 9 のエラー
-
について "ダウンロード"属性について は、これらを参照してください。
互換性
テストしているブラウザは以下の通りです。
- Firefox 20+、Win/Mac ( は動作します。 )
- Google Chrome 26+、Win/Mac ( 動作 )
- サファリ 6、Mac ( は動作します。 は動作しますが、ファイル名は無視されます)
- IE 9+ ( が失敗します。 )
コンテンツのエンコード
CSVは正しくエクスポートされますが、Excelにインポートすると、文字が
ü
と出力されます。
ä
. Excelはこの値を間違って解釈します。
導入する
var csv = '\ufeff';
と入力すると、Excel 2013+はその値を正しく解釈します。
Excel 2007との互換性が必要な場合は、各データ値にUTF-8接頭辞を追加してください。こちらもご参照ください。
関連
-
[解決済み] jQueryで要素が非表示になっているかどうかを確認するには?
-
[解決済み] jQueryでチェックボックスに "checked "を設定する
-
[解決済み] jQueryの「exists」関数はありますか?
-
[解決済み] どのラジオボタンが選択されているかをjQueryで知るにはどうしたらよいですか?
-
[解決済み] jQueryで要素にスクロールする
-
[解決済み] git export」(「svn export」のようなもの)を行うか?
-
[解決済み] jQueryを使ったAjaxリクエストの中断
-
[解決済み] ドロップダウンのアイテムの選択値をjQueryで取得する
-
[解決済み】なぜHTMLは "chucknorris "を色と見なすのか?
-
[解決済み】jQueryでチェックボックスがチェックされているかどうかを確認するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JSONをCSV形式に変換し、変数に格納する方法
-
[解決済み] jQueryのイベントハンドラを削除する最良の方法?
-
[解決済み] jQueryを使って「Please Wait, Loading...」というアニメーションを作成するにはどうすればよいですか?
-
[解決済み] UTF-8のCSVファイルをExcelに強制的に自動認識させることは可能ですか?
-
[解決済み] jQueryの複数要素の同一クリックイベント
-
[解決済み] jQueryでフォームフィールドをクリアする
-
[解決済み] jQueryを使用してspanに値を設定する方法
-
[解決済み] jQuery removeClass ワイルドカード
-
[解決済み] jQueryを使用して要素の型を検索する
-
[解決済み] Microsoft Excelは.csvファイルのダイアクリティクスを混乱させますか?