Экспорт в csv в jQuery
Я динамически генерирую div, который подобен:
<div id='PrintDiv'>
<table id="mainTable">
<tr>
<td>
Col1
</td>
<td>
Col2
</td>
<td>
Col3
</td>
</tr>
<tr>
<td>
Val1
</td>
<td>
Val2
</td>
<td>
Val3
</td>
</tr>
<tr>
<td>
Val11
</td>
<td>
Val22
</td>
<td>
Val33
</td>
</tr>
<tr>
<td>
Val111
</td>
<td>
Val222
</td>
<td>
Val333
</td>
</tr>
</table>
</div>
И на странице есть еще много элементов.
Теперь, как я могу получить файл csv следующим образом:
Col1,Col2,Col3
Val1,Val2,Val3
Val11,Val22,Val33
Val111,Val222,Val333
с помощью jQuery?
нужно также сохранить файл dailog box, например:
![alt text]()
Спасибо.
Ответы
Ответ 1
Вы можете сделать это только на стороне клиента, в браузере, который принимает URI данных:
data:application/csv;charset=utf-8,content_encoded_as_url
В вашем примере URI данных должен быть:
data:application/csv;charset=utf-8,Col1%2CCol2%2CCol3%0AVal1%2CVal2%2CVal3%0AVal11%2CVal22%2CVal33%0AVal111%2CVal222%2CVal333
Вы можете вызвать этот URI:
- используя
window.open
- или установите
window.location
- или href привязки
- добавив атрибут загрузки, он будет работать в хроме, все равно придется тестировать в IE.
Чтобы протестировать, просто скопируйте URI выше и вставьте адресную строку браузера. Или проверьте привязку ниже на странице HTML:
<a download="somedata.csv" href="data:application/csv;charset=utf-8,Col1%2CCol2%2CCol3%0AVal1%2CVal2%2CVal3%0AVal11%2CVal22%2CVal33%0AVal111%2CVal222%2CVal333">Example</a>
Чтобы создать контент, получив значения из таблицы, вы можете использовать table2CSV и выполните:
var data = $table.table2CSV({delivery:'value'});
$('<a></a>')
.attr('id','downloadFile')
.attr('href','data:text/csv;charset=utf8,' + encodeURIComponent(data))
.attr('download','filename.csv')
.appendTo('body');
$('#downloadFile').ready(function() {
$('#downloadFile').get(0).click();
});
Большинство, если не все, версии IE не поддерживают навигацию по каналу передачи данных, поэтому взлом должен быть реализован, часто с iframe
. Используя iframe
в сочетании с document.execCommand('SaveAs'..)
, вы можете получить подобное поведение в большинстве используемых в настоящее время версий IE.
Ответ 2
Это моя реализация (основанная на: https://gist.github.com/3782074):
Использование:
HTML:
<table class="download">...</table>
<a href="" download="name.csv">DOWNLOAD CSV</a>
JS:
$("a[download]").click(function(){
$("table.download").toCSV(this);
});
Код
jQuery.fn.toCSV = function(link) {
var $link = $(link);
var data = $(this).first(); //Only one table
var csvData = [];
var tmpArr = [];
var tmpStr = '';
data.find("tr").each(function() {
if($(this).find("th").length) {
$(this).find("th").each(function() {
tmpStr = $(this).text().replace(/"/g, '""');
tmpArr.push('"' + tmpStr + '"');
});
csvData.push(tmpArr);
} else {
tmpArr = [];
$(this).find("td").each(function() {
if($(this).text().match(/^-{0,1}\d*\.{0,1}\d+$/)) {
tmpArr.push(parseFloat($(this).text()));
} else {
tmpStr = $(this).text().replace(/"/g, '""');
tmpArr.push('"' + tmpStr + '"');
}
});
csvData.push(tmpArr.join(','));
}
});
var output = csvData.join('\n');
var uri = 'data:application/csv;charset=UTF-8,' + encodeURIComponent(output);
$link.attr("href", uri);
}
Примечания:
- Он использует "th" теги для заголовков. Если они отсутствуют, они не
добавлено.
- Этот код определяет номера в формате: - ####. ## (вам нужно изменить код, чтобы принимать другие форматы, например, с помощью запятых).
UPDATE
Моя предыдущая реализация работала нормально, но она не установила имя файла csv. Код был изменен для использования имени файла, но для него требуется <a> . Кажется, что вы не можете динамически генерировать <a> и запустить событие "click" (возможно, соображения безопасности?).
DEMO
http://jsfiddle.net/nLj74t0f/
(К сожалению, jsfiddle не может сгенерировать файл, и вместо этого он выдает ошибку: "пожалуйста, используйте запрос POST", не позволяйте этой ошибке останавливать вас от тестирования этого кода в вашем приложении).
Ответ 3
Недавно я опубликовал бесплатную библиотеку программного обеспечения для этого: "html5csv.js" - GitHub
Он предназначен для упрощения создания небольших приложений для симуляторов
в Javascript, который может потребоваться импортировать или экспортировать файлы csv, манипулировать, отображать, редактировать
данные, выполнять различные математические процедуры, такие как подгонка и т.д.
После загрузки "html5csv.js" проблема сканирования таблицы и создания CSV является однострочным:
CSV.begin('#PrintDiv').download('MyData.csv').go();
Вот JSFiddle демо вашего примера с этим кодом.
Внутри, для Firefox/Chrome это ориентированное на данные решение, аналогичное предложению @italo, @lepe и @adeneo (по другому вопросу). Для IE
Вызов CSV.begin()
устанавливает систему для чтения данных во внутренний массив. Затем происходит выборка. Затем .download()
создает URL-адрес URL-адреса данных и щелкает его кликом-кликом. Это подталкивает файл конечному пользователю.
Согласно caniuse IE10 не поддерживает <a download=...>
. Поэтому для IE моя библиотека вызывает navigator.msSaveBlob()
внутренне, как предложенную @Manu Sharma
Ответ 4
Вот два WORKAROUNDS для проблемы запуска загрузки только с клиента. В более поздних браузерах вы должны посмотреть "blob"
1. Перетащите таблицу
Знаете ли вы, что можете просто перетащить таблицу в excel?
Вот как выбрать таблицу для вырезания и прокрутки или перетаскивания
Выберите полную таблицу с Javascript (для копирования в буфер обмена)
2. создать всплывающее окно из вашего div
Несмотря на то, что не создает диалог сохранения, если всплывающее результирующее сохраняется с расширением .csv, оно будет корректно обработано Excel.
Строка может быть
w.document.write("row1.1\trow1.2\trow1.3\nrow2.1\trow2.2\trow2.3");
например tab-delimited с линией перевода строк.
Есть плагины, которые создадут для вас строку - например, http://plugins.jquery.com/project/table2csv
var w = window.open('','csvWindow'); // popup, may be blocked though
// the following line does not actually do anything interesting with the
// parameter given in current browsers, but really should have.
// Maybe in some browser it will. It does not hurt anyway to give the mime type
w.document.open("text/csv");
w.document.write(csvstring); // the csv string from for example a jquery plugin
w.document.close();
ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ. Это обходные пути и не полностью отвечают на вопрос, который в настоящее время имеет ответ для большинства браузеров: не возможно только на клиенте
Ответ 5
Используя только jQuery, вы не можете избежать вызова сервера.
Однако для достижения этого результата я использую Downloadify, который позволяет мне сохранять файлы, не делая другого вызова сервера, Это уменьшает нагрузку на сервер и делает хороший пользовательский интерфейс.
Чтобы получить правильный CSV, вам просто нужно вынуть все ненужные теги и поместить между ними данные '.'.
Ответ 6
Вы не можете избежать вызова сервера здесь, JavaScript просто не может (по соображениям безопасности) сохранить файл в файловой системе пользователя. Вам нужно будет отправить свои данные на сервер и отправить его .csv
в качестве ссылки или вложения напрямую.
HTML5 имеет некоторую возможность сделать это (хотя сохранение действительно не указано - просто прецедент, вы можете прочитать файл, если вы хотите), но теперь нет решения для кросс-браузера.
Ответ 7
Просто попробуйте следующую кодировку... очень просто создать CSV со значениями таблиц HTML. Проблемы с браузером не появятся
<!DOCTYPE html>
<html>
<head>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
<script src="http://www.csvscript.com/dev/html5csv.js"></script>
<script>
$(document).ready(function() {
$('table').each(function() {
var $table = $(this);
var $button = $("<button type='button'>");
$button.text("Export to CSV");
$button.insertAfter($table);
$button.click(function() {
CSV.begin('table').download('Export.csv').go();
});
});
})
</script>
</head>
<body>
<div id='PrintDiv'>
<table style="width:100%">
<tr>
<td>Jill</td>
<td>Smith</td>
<td>50</td>
</tr>
<tr>
<td>Eve</td>
<td>Jackson</td>
<td>94</td>
</tr>
<tr>
<td>John</td>
<td>Doe</td>
<td>80</td>
</tr>
</table>
</div>
</body>
</html>