Подтвердить что ты не робот

Экспорт в 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

Спасибо.

4b9b3361

Ответ 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>