I have a tabular data which I need to export to csv without using any external plugin or api. I used the window.open
method passing the mime types but faced issues like below:
How to determine whether Microsoft Excel or Open Office is installed on the system using jquery
The code should be independent of the fact that what is being installed on the system i.e., openoffice or ms excel. I believe CSV is the format which can be expected to show in both the editors.
CODE
<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>
Errors:
CSV: Unrecognised over the browsers
ODS & Excel: is working but I am not able to find which one to generate when system is having an excel installed or openoffice installed?
IE version 8 : it is totally not working, opens in a new window and as below screenshot.
A tiny update for @Terry Young answer, i.e. add IE 10+ support
I am not sure if the above CSV generation code is so great as it appears to skip
th
cells and also did not appear to allow for commas in the value. So here is my CSV generation code that might be useful.It does assume you have the
$table
variable which is a jQuery object (eg.var $table = $('#yourtable');
)What if you have your data in CSV format and convert it to HTML for display on the web page? You may use the http://code.google.com/p/js-tables/ plugin. Check this example http://code.google.com/p/js-tables/wiki/Table As you are already using jQuery library I have assumed you are able to add other javascript toolkit libraries.
If the data is in CSV format, you should be able to use the generic 'application/octetstream' mime type. All the 3 mime types you have tried are dependent on the software installed on the clients computer.
Demo
See below for an explanation.
As of 2017
Now uses HTML5
Blob
andURL
as the preferred method withData URI
as a fallback.On Internet Explorer
Other answers suggest
window.navigator.msSaveBlob
; however, it is known to crash IE10/Window 7 and IE11/Windows 10. Whether it works using Microsoft Edge is dubious (see Microsoft Edge issue ticket #10396033).Merely calling this in Microsoft's own Developer Tools / Console causes the browser to crash:
Four years after my first answer, new IE versions include IE10, IE11, and Edge. They all crash on a function that Microsoft invented (slow clap).
As of 2013
Typically this would be performed using a server-side solution, but this is my attempt at a client-side solution. Simply dumping HTML as a
Data URI
will not work, but is a helpful step. So:window.open
approach would not work in Firefox, so I used<a href="{Data URI here}">
.<a>
tag'sdownload
attribute, which only works in Firefox and Google Chrome. Since it is just an attribute, it degrades gracefully.Notes
About the "download" attribute, see these:
Compatibility
Browsers testing includes:
Content Encoding
The CSV is exported correctly, but when imported into Excel, the character
ü
is printed out asä
. Excel interprets the value incorrectly.Introduce
var csv = '\ufeff';
and then Excel 2013+ interprets the values correctly.If you need compatibility with Excel 2007, add UTF-8 prefixes at each data value. See also:
From what I understand, you have your data on a table and you want to create the CSV from that data. However, you have problem creating the CSV.
My thoughts would be to iterate and parse the contents of the table and generate a string from the parsed data. You can check How to convert JSON to CSV format and store in a variable for an example. You are using jQuery in your example so that would not count as an external plugin. Then, you just have to serve the resulting string using
window.open
and useapplication/octetstream
as suggested.