外部プラグインまたはAPIを使用せずにcsvにエクスポートする必要がある表形式のデータがあります。 MIMEタイプを渡すwindow.open
メソッドを使用しましたが、以下のような問題に直面しました。
jqueryを使用してMicrosoft ExcelまたはOpen Officeがシステムにインストールされているかどうかを確認する方法
コードは、システムにインストールされているもの(つまり、openofficeまたはms 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がインストールされている場合に生成するものを見つけることができませんか?
すなわちバージョン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>
HTML5 Blob
およびURL
を優先メソッドとして使用し、Data URI
をフォールバックとして使用するようになりました。
他の答えはwindow.navigator.msSaveBlob
を示唆しています。ただし、クラッシュIE10/Window 7およびIE11/Windows 1であることが知られています。 Microsoft Edgeを使用して動作するかどうかは疑わしい( Microsoft Edgeの問題チケット#103960 を参照)。
Microsoft独自の開発者ツール/コンソールでこれを呼び出すだけで、ブラウザがクラッシュします。
navigator.msSaveBlob(new Blob(["hello"], {type: "text/plain"}), "test.txt");
最初の回答から4年後、新しいIEバージョンにはIE10、IE11、およびEdgeが含まれます。それらはすべてMicrosoftが発明した関数でクラッシュします(遅い拍手)。
ご自身の責任で
navigator.msSaveBlob
サポートを追加してください。
通常、これはサーバー側のソリューションを使用して実行されますが、これはクライアント側のソリューションでの私の試みです。 HTMLを単にData URI
としてダンプすることはできませんが、役に立つステップです。そう:
window.open
アプローチはFirefoxでは機能しないため、<a href="{Data URI here}">
を使用しました。<a>
タグのdownload
属性を使用してデフォルトのファイル名を割り当てます。これは、FirefoxとGoogle Chromeでのみ機能します。これは単なる属性であるため、適切に低下します。"download"属性については、以下を参照してください。
ブラウザのテストには次のものが含まれます。
CSVは正しくエクスポートされますが、Excelにインポートされると、文字ü
はä
として出力されます。 Excelは値を誤って解釈します。
var csv = '\ufeff';
を導入すると、Excel 2013+は値を正しく解釈します。
Excel 2007との互換性が必要な場合は、各データ値にUTF-8プレフィックスを追加します。こちらもご覧ください:
上記のCSV生成コードがth
セルをスキップするように見え、値にコンマを許可するように見えなかったほどすばらしいかどうかはわかりません。だから、ここに役に立つかもしれない私のCSV生成コードがあります。
それは仮定します jQueryオブジェクトである$table
変数があります(例var $table = $('#yourtable');
)
$rows = $table.find('tr');
var csvData = "";
for(var i=0;i<$rows.length;i++){
var $cells = $($rows[i]).children('th,td'); //header or content cells
for(var y=0;y<$cells.length;y++){
if(y>0){
csvData += ",";
}
var txt = ($($cells[y]).text()).toString().trim();
if(txt.indexOf(',')>=0 || txt.indexOf('\"')>=0 || txt.indexOf('\n')>=0){
txt = "\"" + txt.replace(/\"/g, "\"\"") + "\"";
}
csvData += txt;
}
csvData += '\n';
}
@ Terry Young answerの小さな更新、つまりIE 10+サポートの追加
if (window.navigator.msSaveOrOpenBlob) {
// IE 10+
var blob = new Blob([decodeURIComponent(encodeURI(csvString))], {
type: 'text/csv;charset=' + document.characterSet
});
window.navigator.msSaveBlob(blob, filename);
} else {
// actual real browsers
//Data URI
csvData = 'data:application/csv;charset=utf-8,' + encodeURIComponent(csvData);
$(this).attr({
'download': filename,
'href': csvData,
'target': '_blank'
});
}
<a id="export" role='button'>
Click Here To Download Below Report
</a>
<table id="testbed_results" style="table-layout:fixed">
<thead>
<tr width="100%" style="color:white" bgcolor="#3195A9" id="tblHeader">
<th>Name</th>
<th>Date</th>
<th>Speed</th>
<th>Column2</th>
<th>Interface</th>
<th>Interface2</th>
<th>Sub</th>
<th>COmpany result</th>
<th>company2</th>
<th>Gen</th>
</tr>
</thead>
<tbody>
<tr id="samplerow">
<td>hello</td>
<td>100</td>
<td>200</td>
<td>300</td>
<td>html2svc</td>
<td>ajax</td>
<td>200</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
<tr>
<td>hello</td>
<td>100</td>
<td>200</td>
<td>300</td>
<td>html2svc</td>
<td>ajax</td>
<td>200</td>
<td>7</td>
<td>8</td>
<td>9</td>
</tr>
</tbody>
</table>
$(document).ready(function () {
Html2CSV('testbed_results', 'myfilename','export');
});
function Html2CSV(tableId, filename,alinkButtonId) {
var array = [];
var headers = [];
var arrayItem = [];
var csvData = new Array();
$('#' + tableId + ' th').each(function (index, item) {
headers[index] = '"' + $(item).html() + '"';
});
csvData.Push(headers);
$('#' + tableId + ' tr').has('td').each(function () {
$('td', $(this)).each(function (index, item) {
arrayItem[index] = '"' + $(item).html() + '"';
});
array.Push(arrayItem);
csvData.Push(arrayItem);
});
var fileName = filename + '.csv';
var buffer = csvData.join("\n");
var blob = new Blob([buffer], {
"type": "text/csv;charset=utf8;"
});
var link = document.getElementById(alinkButton);
if (link.download !== undefined) { // feature detection
// Browsers that support HTML5 download attribute
link.setAttribute("href", window.URL.createObjectURL(blob));
link.setAttribute("download", fileName);
}
else if (navigator.msSaveBlob) { // IE 10+
link.setAttribute("href", "#");
link.addEventListener("click", function (event) {
navigator.msSaveBlob(blob, fileName);
}, false);
}
else {
// it needs to implement server side export
link.setAttribute("href", "http://www.example.com/export");
}
}
</script>
CSV形式のデータがあり、それをWebページに表示するためにHTMLに変換するとどうなりますか? http://code.google.com/p/js-tables/ プラグインを使用できます。この例を確認してください http://code.google.com/p/js-tables/wiki/Table 既にjQueryライブラリを使用しているので、他のjavascriptツールキットライブラリを追加できると想定しました。
データがCSV形式の場合、汎用の「application/octetstream」MIMEタイプを使用できるはずです。試行した3つのMIMEタイプはすべて、クライアントコンピューターにインストールされているソフトウェアに依存しています。
私が理解していることから、あなたはあなたのデータをテーブルに持っていて、そのデータからCSVを作成したいと思っています。ただし、CSVの作成に問題があります。
私の考えは、テーブルの内容を繰り返して解析し、解析されたデータから文字列を生成することです。例として、 JSONをCSV形式に変換して変数に保存する方法を確認できます 。例ではjQueryを使用しているため、外部プラグインとしてカウントされません。次に、window.open
を使用して結果の文字列を提供し、推奨されるようにapplication/octetstream
を使用する必要があります。