2013-08-12 4 views
18

Мне нужно экспортировать данные, отображаемые в формате таблицы в формате CSV. Я много пробовал много, но не мог заставить его работать для IE 9 и выше.Javascript/jQuery: Экспорт данных в CSV, не работающих в IE

У меня есть created a dummy fiddle с моим кодом.

var data = [ 
    ["name1", "city1", "some other info"], 
    ["name2", "city2", "more info"] 
];//Some dummy data 

var csv = ConvertToCSV(data);//Convert it to CSV format 
var fileName = "test";//Name the file- which will be dynamic 

if (navigator.userAgent.search("MSIE") >= 0) { 
    //This peice of code is not working in IE, we will working on this 
    //TODO 
    var uriContent = "data:application/octet-stream;filename=" + fileName + '.csv' + "," + escape(csv); 
    window.open(uriContent + fileName + '.csv'); 
} else { 
    var uri = 'data:text/csv;charset=utf-8,' + escape(csv); 
    var downloadLink = document.createElement("a"); 
    downloadLink.href = uri; 
    downloadLink.download = fileName + ".csv"; 
    document.body.appendChild(downloadLink); 
    downloadLink.click(); 
    document.body.removeChild(downloadLink); 
} 

Я видел много ссылок в Stackoverflow, но не мог найти ничего, что работает с IE9 или выше. Как @ Terry Young explains in how-to-data-export-to-csv-using-jquery-or-javascript

Кроме того, tried-

var csv = ConvertToCSV(_tempObj); 
     var fileName = csvExportFileName(); 
     if (navigator.appName != 'Microsoft Internet Explorer') { 
      window.open('data:text/csv;charset=utf-8,' + escape(str)); 
     } 
     else { 
      var popup = window.open('', 'csv', ''); 
      popup.document.body.innerHTML = '<pre>' + str + '</pre>'; 
     } 

Не знаю, как это исправить. Я не хочу ударять по серверу и экспортировать свой CSV (скажем так).

+0

@Shubh вы решить эту проблему на всех - я столкнулся такая же проблема - я посмотрел на это обходное решение - http://blog.paxcel.net/blog/savedownload-file-using-html5-javascript-the-download-attribute-2/, но он не работал для меня – anna

+0

@anna 'Nopes.' Я не смог его решить. Наконец, я должен был использовать логику Server Side для получения желаемого. – Shubh

+0

ОК спасибо, придется продолжать искать что-то, что кошмар! – anna

ответ

15

После использования Javascript он будет решить вашу проблему.

Используйте это для IE,

var IEwindow = window.open(); 
IEwindow.document.write('sep=,\r\n' + CSV); 
IEwindow.document.close(); 
IEwindow.document.execCommand('SaveAs', true, fileName + ".csv"); 
IEwindow.close(); 

Для получения более подробной информации я написал учебник по этим см - Download JSON data in CSV format Cross Browser Support

Надеется, что это будет полезно для вас.

+0

Спасибо, это экономит мое время. –

+0

Нужно ли вообще указать разделитель, не вставляя его непосредственно в файл CSV? По какой-то причине, когда я генерирую CSV в Chrome (используя метод, аналогичный одному в OP), Excel может открыть CSV просто отлично без строки 'sep =,' – JLewkovich

+0

Я должен поддерживать современные браузеры и IE8. Этот бит кода очень помог мне. Благодаря! –

6

Для IE 10+ вы можете сделать:

var a = document.createElement('a'); 
     if(window.navigator.msSaveOrOpenBlob){ 
      var fileData = str; 
      blobObject = new Blob([str]); 
      a.onclick=function(){ 
       window.navigator.msSaveOrOpenBlob(blobObject, 'MyFile.csv'); 
      } 
     } 
     a.appendChild(document.createTextNode('Click to Download')); 
     document.body.appendChild(a); 

Я не считаю, что это возможно в более ранних версиях IE. Без вызова объекта ActiveX, но если это приемлемо, вы можете использовать:

var sfo=new ActiveXObject('scripting.FileSystemObject'); 
var fLoc=sfo.CreateTextFile('MyFile.csv'); 
fLoc.WriteLine(str); 
fLoc.close(); 

Какой бы написать файл непосредственно в файловой системе пользователя. Однако, как правило, это побуждает пользователя спрашивать, хотят ли они разрешить запуск сценария. Приглашение можно отключить в среде интрасети.

4

У меня есть решение для него, которое поддерживает IE 8+ для меня. Нам нужно указать разделитель, как показано ниже.

if (navigator.appName == "Microsoft Internet Explorer") {  
    var oWin = window.open(); 
    oWin.document.write('sep=,\r\n' + CSV); 
    oWin.document.close(); 
    oWin.document.execCommand('SaveAs', true, fileName + ".csv"); 
    oWin.close(); 
    } 

Вы можете перейти по ссылке http://andrew-b.com/view/article/44

+0

Ссылка мертва – ameliapond

1

Это будет работать в любом браузере, без необходимости jQuery.

  1. Добавьте следующую IFRAME в любом месте вашей страницы:

    <iframe id="CsvExpFrame" style="display: none"></iframe>

  2. Дайте идентификатор в таблице на странице вы хотите экспортировать:

    <table id="dataTable">

  3. Настройте свою ссылку или кнопку, чтобы вызвать функцию ExportToCsv, передав имя файла по умолчанию и идентификатор таблицы как параметры.Например:

    <input type="button" onclick="ExportToCsv('DefaultFileName','dataTable')"/>

  4. Добавьте это в файл JavaScript или раздел:

function ExportToCsv(fileName, tableName) { 
 
    var data = GetCellValues(tableName); 
 
    var csv = ConvertToCsv(data); 
 
    if (navigator.userAgent.search("Trident") >= 0) { 
 
    window.CsvExpFrame.document.open("text/html", "replace"); 
 
    window.CsvExpFrame.document.write(csv); 
 
    window.CsvExpFrame.document.close(); 
 
    window.CsvExpFrame.focus(); 
 
    window.CsvExpFrame.document.execCommand('SaveAs', true, fileName + ".csv"); 
 
    } else { 
 
    var uri = "data:text/csv;charset=utf-8," + escape(csv); 
 
    var downloadLink = document.createElement("a"); 
 
    downloadLink.href = uri; 
 
    downloadLink.download = fileName + ".csv"; 
 
    document.body.appendChild(downloadLink); 
 
    downloadLink.click(); 
 
    document.body.removeChild(downloadLink); 
 
    } 
 
}; 
 

 
function GetCellValues(tableName) { 
 
    var table = document.getElementById(tableName); 
 
    var tableArray = []; 
 
    for (var r = 0, n = table.rows.length; r < n; r++) { 
 
    tableArray[r] = []; 
 
    for (var c = 0, m = table.rows[r].cells.length; c < m; c++) { 
 
     var text = table.rows[r].cells[c].textContent || table.rows[r].cells[c].innerText; 
 
     tableArray[r][c] = text.trim(); 
 
    } 
 
    } 
 
    return tableArray; 
 
} 
 

 
function ConvertToCsv(objArray) { 
 
    var array = typeof objArray != "object" ? JSON.parse(objArray) : objArray; 
 
    var str = "sep=,\r\n"; 
 
    var line = ""; 
 
    var index; 
 
    var value; 
 
    for (var i = 0; i < array.length; i++) { 
 
    line = ""; 
 
    var array1 = array[i]; 
 
    for (index in array1) { 
 
     if (array1.hasOwnProperty(index)) { 
 
     value = array1[index] + ""; 
 
     line += "\"" + value.replace(/"/g, "\"\"") + "\","; 
 
     } 
 
    } 
 
    line = line.slice(0, -1); 
 
    str += line + "\r\n"; 
 
    } 
 
    return str; 
 
};
<table id="dataTable"> 
 
    <tr> 
 
    <th>Name</th> 
 
    <th>Age</th> 
 
    <th>Email</th> 
 
    </tr> 
 
    <tr> 
 
    <td>Andrew</td> 
 
    <td>20</td> 
 
    <td>[email protected]</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Bob</td> 
 
    <td>32</td> 
 
    <td>[email protected]</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Sarah</td> 
 
    <td>19</td> 
 
    <td>[email protected]</td> 
 
    </tr> 
 
    <tr> 
 
    <td>Anne</td> 
 
    <td>25</td> 
 
    <td>[email protected]</td> 
 
    </tr> 
 
</table> 
 

 
<a href="#" onclick="ExportToCsv('DefaultFileName', 'dataTable');return true;">Click this to download a .csv</a>

+1

Это работает в Chrome, но не работает в IE. –

+1

Это не работает на IE11. – Madhura

3

Это также один из ответов, которые я использовал и рабочих отлично подходит для версий IE 10+:

var csv = JSON2CSV(json_obj);    
var blob = new Blob([csv],{type: "text/csv;charset=utf-8;"}); 

if (navigator.msSaveBlob) { // IE 10+ 
navigator.msSaveBlob(blob, "fileName.csv") 
    } else { 
     var link = document.createElement("a"); 
     if (link.download !== undefined) { // feature detection 
      // Browsers that support HTML5 download attribute 
      var url = URL.createObjectURL(blob); 
      link.setAttribute("href", url); 
      link.setAttribute("download", "fileName.csv"); 
      link.style = "visibility:hidden"; 
      document.body.appendChild(link); 
      link.click(); 
      document.body.removeChild(link); 
     }   
    } 

Надеюсь, что это поможет.

0

использование Blob объект Создать объект блоб и использовать msSaveBlob или msSaveOrOpenBlob код работает в IE11 (не тестировалась для других браузеров)

<script> 


var csvString ='csv,object,file'; 
    var blobObject = new Blob(csvString); 

     window.navigator.msSaveBlob(blobObject, 'msSaveBlob_testFile.txt'); // The user only has the option of clicking the Save button. 
     alert('note the single "Save" button below.'); 

     var fileData = ["Data to be written in file."]; 
    //csv string object inside "[]" 
     blobObject = new Blob(fileData); 
     window.navigator.msSaveOrOpenBlob(blobObject, 'msSaveBlobOrOpenBlob_testFile.txt'); // Now the user will have the option of clicking the Save button and the Open button.`enter code here` 
     alert('File save request made using msSaveOrOpenBlob() - note the two "Open" and "Save" buttons below.'); 
     </script> 
+0

Большое вам спасибо. Это решение работало для меня в IE11. – Madhura

Смежные вопросы