2013-08-12 19 views
18

Chcę eksportować dane wyświetlane w tabeli do formatu CSV. Próbowałem wielu rzeczy, ale nie mogłem pracować dla IE 9 i wyżej.JavaScript/jQuery: Eksportowanie danych w CSV nie działa w IE

Mam created a dummy fiddle z moim kodem.

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); 
} 

Widziałem wielu ogniw w Stackoverflow, ale nie mógł znaleźć niczego, co działa z IE9 lub powyżej. Jak @ Terry Young explains in how-to-data-export-to-csv-using-jquery-or-javascript

Również wypróbowaną

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>'; 
     } 

Nie wiem, jak to naprawić. Nie chcę uderzać serwera i eksportować pliku CSV (wymaganie tak twierdzę).

+0

@Shubh pan rozwiązać ten problem w ogóle - Jestem z widokiem na ten sam problem - obejrzałem to obejście - http://blog.paxcel.net/blog/savedown-file-using-html5-javascript-the-download-attribute-2/, ale to nie zadziałało dla mnie – anna

+0

@anna 'Nopes. Nie udało mi się go rozwiązać. W końcu musiałem użyć logiki Server Side, aby uzyskać pożądane. – Shubh

+0

ok dzięki będą musieli szukać czegoś, co koszmar! – anna

Odpowiedz

15

Po użyciu JavaScript będzie rozwiązać problem.

Użyj tego dla IE,

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

Aby uzyskać więcej informacji pisałem tutorial, że zobaczyć - Download JSON data in CSV format Cross Browser Support

Nadzieja to będzie pomocne dla Ciebie.

+0

Dzięki, oszczędzam mój czas. –

+0

Czy istnieje mimo to określenie separatora bez wstawiania go do samego pliku CSV? Z jakiegoś powodu, kiedy generuję pliki CSV w Chrome (używając metody podobnej do tej w OP), Excel może otworzyć CSV dobrze bez linii 'sep =,' – JLewkovich

+0

. Muszę obsługiwać nowoczesne przeglądarki i IE8. Ten kawałek kodu bardzo mi pomógł. Dzięki! –

6

dla IE 10+ można zrobić:

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); 

Nie wierzę, że będzie to możliwe w starszych wersjach IE. Bez wywoływania obiektu activeX, ale jeśli jest to dopuszczalne, można użyć:

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

Który zapisałby plik bezpośrednio do systemu plików użytkownika. Zazwyczaj będzie to jednak monitować użytkownika o pytanie, czy chce zezwolić na uruchomienie skryptu. Monit można wyłączyć w środowisku intranetowym.

4

Mam rozwiązanie, które wspiera mnie w IE 8+. Musimy określić separator, jak pokazano poniżej.

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(); 
    } 

Możesz przejść przez odnośnik http://andrew-b.com/view/article/44

+0

Link jest martwy – ameliapond

1

To będzie działać na dowolnej przeglądarce, bez potrzeby jQuery.

  1. Dodaj następujące iframe dowolnym miejscu na swojej stronie:

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

  2. Daj id w tabeli na stronie chcesz wyeksportować:

    <table id="dataTable">

  3. Dostosuj swoje łącze lub przycisk, aby wywołać funkcję ExportToCsv, przekazując domyślną nazwę pliku i identyfikator tabeli jako parametry.Na przykład:

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

  4. Dodaj do tego pliku JavaScript lub odcinku:

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

To działa w Chrome, ale kończy się niepowodzeniem w IE. –

+1

To nie działa w IE11. – Madhura

3

Jest również jedną z odpowiedzi, które użyłem i pracujących doskonały do ​​wersji 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); 
     }   
    } 

Mam nadzieję, że to pomoże.

0

użycie Blob obiekt Tworzenie obiektu blob i używać msSaveBlob lub msSaveOrOpenBlob Kod działa w IE11 (nie testowane na innych przeglądarkach)

<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

Dziękuję bardzo. To rozwiązanie sprawdziło się w IE11. – Madhura