Esporta i dati della tabella html in Excel utilizzando JavaScript / JQuery non funziona correttamente nel browser Chrome


90

Ho una tabella HTML nel modello di velocità. Voglio esportare i dati della tabella html in Excel utilizzando java script o jquery, comatibale con tutti i browser. Sto usando lo script sottostante

<script type="text/javascript">
function ExportToExcel(mytblId){
       var htmltable= document.getElementById('my-table-id');
       var html = htmltable.outerHTML;
       window.open('data:application/vnd.ms-excel,' + encodeURIComponent(html));
    }
</script>

Questo script funziona bene in Mozilla Firefox , si apre con una finestra di dialogo di Excel e richiede opzioni di apertura o salvataggio. Ma quando ho testato lo stesso script nel browser Chrome non funziona come previsto, quando si fa clic sul pulsante non viene visualizzato alcun pop-up per Excel. I dati vengono scaricati in un file con "tipo di file: file", nessuna estensione come .xls Non ci sono errori nella console di Chrome.

Esempio di Jsfiddle:

http://jsfiddle.net/insin/cmewv/

Funziona bene in Mozilla ma non in Chrome.

Caso di test del browser Chrome:

Prima immagine: faccio clic sul pulsante Esporta in Excel

Prima immagine: faccio clic sul pulsante Esporta in Excel

e risultato:

Risultato


Il test case è per cromo
Sukane

1
Lo scenario di test sopra riportato non riesce se si utilizza il prodotto open source LibreOffice e il browser Chrome. Ma se hai installato MS Office, il codice funzionerà correttamente.
Sukane

Risposte:


164

Lo script di esportazione di Excel funziona su IE7 +, Firefox e Chrome.

function fnExcelReport()
{
    var tab_text="<table border='2px'><tr bgcolor='#87AFC6'>";
    var textRange; var j=0;
    tab = document.getElementById('headerTable'); // id of table

    for(j = 0 ; j < tab.rows.length ; j++) 
    {     
        tab_text=tab_text+tab.rows[j].innerHTML+"</tr>";
        //tab_text=tab_text+"</tr>";
    }

    tab_text=tab_text+"</table>";
    tab_text= tab_text.replace(/<A[^>]*>|<\/A>/g, "");//remove if u want links in your table
    tab_text= tab_text.replace(/<img[^>]*>/gi,""); // remove if u want images in your table
    tab_text= tab_text.replace(/<input[^>]*>|<\/input>/gi, ""); // reomves input params

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE "); 

    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer
    {
        txtArea1.document.open("txt/html","replace");
        txtArea1.document.write(tab_text);
        txtArea1.document.close();
        txtArea1.focus(); 
        sa=txtArea1.document.execCommand("SaveAs",true,"Say Thanks to Sumit.xls");
    }  
    else                 //other browser not tested on IE 11
        sa = window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));  

    return (sa);
}

Basta creare un iframe vuoto:

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

Chiama questa funzione su:

<button id="btnExport" onclick="fnExcelReport();"> EXPORT </button>

1
se non allora per cosa è questa linea ?? var txt = document.getElementById ('txtArea1'). contentWindow;
sampopes

3
In Chrome, quando si fa clic sul pulsante di download non accade nulla quando si utilizza questo metodo. Nessun errore della console o altro.
Kyle Bachan

1
Perfetto +1 !!! Funziona in IE 11, Chrome 35, Firefox 29, Opera 17 ma non funziona in Safari 5.1.7 !!! :(
Suganth G

9
come posso cambiare il nome di Randome. Voglio impostare un nome specifico.
osman Rahimi

21
"Il formato del file e l'estensione di download.xls non corrispondono" Questo non rende felice il manager: / Qualche idea?
Tom Stickel

34

Il plug-in Datatable risolve al meglio lo scopo e ci consente di esportare i dati della tabella HTML in Excel, PDF, TEXT. facilmente configurabile.

Si prega di trovare l'esempio completo nel collegamento di riferimento databile di seguito:

https://datatables.net/extensions/buttons/examples/html5/simple.html

(screenshot dal sito di riferimento datatable) inserisci qui la descrizione dell'immagine


4
OH MIO DIO! Questo è un plugin fantastico! ... e ha diversi plugin incorporati !! Esporta, ordina, riordina, anteprima di stampa, ecc ... Risolto tutti i miei dati che mostrano le esigenze in un solo colpo!
Gusstavv Gil

Posso applicare stili al mio Excel usando questo plugin?
Shruthi Sathyanarayana

@Addy questa è solo una soluzione DataTables, giusto?
Karl

1
Il pulsante Esporta rimuoverà ogni elenco a discesa del conteggio delle righe di pagina, se vuoi mantenere entrambe le cose? si prega di controllare datatables.net/extensions/buttons/examples/initialisation/… per risolverlo.
Kaushik Das

Il plugin è fantastico. C'è un modo per estrarre semplicemente il codice pertinente per esportare i dati ed evidenziare qui? Sarebbe di grande aiuto. Grazie in anticipo
Murtuza Husain

31

Questo potrebbe aiutare

function exportToExcel(){
var htmls = "";
            var uri = 'data:application/vnd.ms-excel;base64,';
            var template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>'; 
            var base64 = function(s) {
                return window.btoa(unescape(encodeURIComponent(s)))
            };

            var format = function(s, c) {
                return s.replace(/{(\w+)}/g, function(m, p) {
                    return c[p];
                })
            };

            htmls = "YOUR HTML AS TABLE"

            var ctx = {
                worksheet : 'Worksheet',
                table : htmls
            }


            var link = document.createElement("a");
            link.download = "export.xls";
            link.href = uri + base64(format(template, ctx));
            link.click();
}

1
cosa succede se voglio esportare solo le colonne che sono visibili nella tabella html ??
Nouman Bhatti

Salve, non sono in grado di eseguire alcuna operazione EXCEL con il foglio, ad esempio: Autosum. È a causa del formato dei dati di questo foglio EXCEL o di altri problemi .. Ho bisogno di aiuto per fare alcune operazioni.
Nanda Kishore Allu

9

http://wsnippets.com/export-html-table-data-excel-sheet-using-jquery/ prova questo link potrebbe risolvere il tuo problema

inserisci qui la descrizione dell'immagine


Uchit, grazie per la tua risposta, ma ho già provato questo esempio. Come ho già detto, metto in dubbio che funziona bene in Mozilla ma non in Chorme. Puoi provare questo esempio nel browser Chrome?
Sukane

5
Ho provato il tuo codice su jsfiddle e sto ottenendo risultati positivi. Funziona bene anche a chorme. Puoi vedere nell'immagine sopra che il download ha avuto successo
Uchit Shrestha

1
Uchit, grazie Sì, il codice funziona. Il problema è che stavo usando Libre Office, quindi in Chrome l'esportazione in Excel non funzionava bene (schermata di riferimento nella domanda m). Ma nell'ufficio MS funziona, come hai detto. Grazie per aver fornito un codice jQuery per questo.
Sukane

Questa funzione non esporta i valori dei campi con elenchi a discesa e timestamp
SNT93

non funziona con le tabelle multiple html, solo con una tabella. Come posso farlo con le tabelle multiple ??????
ignacio chiazzo

9

Invece di usare window.openpuoi usare un link con l' onclickevento.
E puoi mettere la tabella html nell'uri e impostare il nome del file da scaricare.

Dimostrazione dal vivo :

function exportF(elem) {
  var table = document.getElementById("table");
  var html = table.outerHTML;
  var url = 'data:application/vnd.ms-excel,' + escape(html); // Set your html table into url 
  elem.setAttribute("href", url);
  elem.setAttribute("download", "export.xls"); // Choose the file name
  return false;
}
<table id="table" border="1">
  <tr>
    <td>
      Foo
    </td>
    <td>
      Bar
    </td>
  </tr>
</table>

<a id="downloadLink" onclick="exportF(this)">Export to excel</a>


come posso impostare il bordo della tabella, larghezza td ecc in funzione?
Zeffry Reynando,

8

TableExport

TableExport : la semplice e facile da implementare per esportare tabelle HTML in file xlsx, xls, csv e txt.

Per utilizzare questa libreria, chiama semplicemente il TableExportcostruttore:

new TableExport(document.getElementsByTagName("table"));

// OR simply

TableExport(document.getElementsByTagName("table"));

// OR using jQuery

$("table").tableExport(); 

È possibile passare proprietà aggiuntive per personalizzare l'aspetto di tabelle, pulsanti e dati esportati. Vedi qui maggiori informazioni


Supporta PhantomJs? Come segnalare bug?
golimar

5

La mia fusione di questi esempi:

https://www.codexworld.com/export-html-table-data-to-excel-using-javascript https://bl.ocks.org/Flyer53/1de5a78de9c89850999c

function exportTableToExcel(tableId, filename) {
    let dataType = 'application/vnd.ms-excel';
    let extension = '.xls';

    let base64 = function(s) {
        return window.btoa(unescape(encodeURIComponent(s)))
    };

    let template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table></body></html>';
    let render = function(template, content) {
        return template.replace(/{(\w+)}/g, function(m, p) { return content[p]; });
    };

    let tableElement = document.getElementById(tableId);

    let tableExcel = render(template, {
        worksheet: filename,
        table: tableElement.innerHTML
    });

    filename = filename + extension;

    if (navigator.msSaveOrOpenBlob)
    {
        let blob = new Blob(
            [ '\ufeff', tableExcel ],
            { type: dataType }
        );

        navigator.msSaveOrOpenBlob(blob, filename);
    } else {
        let downloadLink = document.createElement("a");

        document.body.appendChild(downloadLink);

        downloadLink.href = 'data:' + dataType + ';base64,' + base64(tableExcel);

        downloadLink.download = filename;

        downloadLink.click();
    }
}

1
Errore di riferimento non rilevato: base64 non è definito
Pedro Joaquín


4

Per quanto riguarda i sampopes, risposta dal 6 giugno 14 alle 11:59:

Ho inserito uno stile CSS con dimensione del carattere di 20px per visualizzare i dati di Excel più grandi. Nel codice sampopes mancano i <tr>tag iniziali , quindi prima metto in output il titolo e poi le altre righe della tabella all'interno di un ciclo.

function fnExcelReport()
{
    var tab_text = '<table border="1px" style="font-size:20px" ">';
    var textRange; 
    var j = 0;
    var tab = document.getElementById('DataTableId'); // id of table
    var lines = tab.rows.length;

    // the first headline of the table
    if (lines > 0) {
        tab_text = tab_text + '<tr bgcolor="#DFDFDF">' + tab.rows[0].innerHTML + '</tr>';
    }

    // table data lines, loop starting from 1
    for (j = 1 ; j < lines; j++) {     
        tab_text = tab_text + "<tr>" + tab.rows[j].innerHTML + "</tr>";
    }

    tab_text = tab_text + "</table>";
    tab_text = tab_text.replace(/<A[^>]*>|<\/A>/g, "");             //remove if u want links in your table
    tab_text = tab_text.replace(/<img[^>]*>/gi,"");                 // remove if u want images in your table
    tab_text = tab_text.replace(/<input[^>]*>|<\/input>/gi, "");    // reomves input params
    // console.log(tab_text); // aktivate so see the result (press F12 in browser)

    var ua = window.navigator.userAgent;
    var msie = ua.indexOf("MSIE "); 

     // if Internet Explorer
    if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./)) {
        txtArea1.document.open("txt/html","replace");
        txtArea1.document.write(tab_text);
        txtArea1.document.close();
        txtArea1.focus(); 
        sa = txtArea1.document.execCommand("SaveAs", true, "DataTableExport.xls");
    }  
    else // other browser not tested on IE 11
        sa = window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));  

    return (sa);
}   

Puoi dirmi come rimuovere una colonna specifica dall'esportazione in Excel. Ad esempio, voglio evitare tab.rows[j].cells[13] , il tuo aiuto è davvero apprezzato
Disera

Risposta molto bella, per una tabella molto semplice mi window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));limiterò a mantenere l'ultima riga: l'enconding è molto importante.
Pere Pages

4

 function exportToExcel() {
        var tab_text = "<tr bgcolor='#87AFC6'>";
        var textRange; var j = 0, rows = '';
        tab = document.getElementById('student-detail');
        tab_text = tab_text + tab.rows[0].innerHTML + "</tr>";
        var tableData = $('#student-detail').DataTable().rows().data();
        for (var i = 0; i < tableData.length; i++) {
            rows += '<tr>'
                + '<td>' + tableData[i].value1 + '</td>'
                + '<td>' + tableData[i].value2 + '</td>'
                + '<td>' + tableData[i].value3 + '</td>'
                + '<td>' + tableData[i].value4 + '</td>'
                + '<td>' + tableData[i].value5 + '</td>'
                + '<td>' + tableData[i].value6 + '</td>'
                + '<td>' + tableData[i].value7 + '</td>'
                + '<td>' +  tableData[i].value8 + '</td>'
                + '<td>' + tableData[i].value9 + '</td>'
                + '<td>' + tableData[i].value10 + '</td>'
                + '</tr>';
        }
        tab_text += rows;
        var data_type = 'data:application/vnd.ms-excel;base64,',
            template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table border="2px">{table}</table></body></html>',
            base64 = function (s) {
                return window.btoa(unescape(encodeURIComponent(s)))
            },
            format = function (s, c) {
                return s.replace(/{(\w+)}/g, function (m, p) {
                    return c[p];
                })
            }

        var ctx = {
            worksheet: "Sheet 1" || 'Worksheet',
            table: tab_text
        }
        document.getElementById("dlink").href = data_type + base64(format(template, ctx));
        document.getElementById("dlink").download = "StudentDetails.xls";
        document.getElementById("dlink").traget = "_blank";
        document.getElementById("dlink").click();
    }

Qui i valori da 1 a 10 sono i nomi delle colonne che stai ottenendo


4

Puoi utilizzare tableToExcel.js per esportare la tabella in un file Excel.

Funziona in un modo seguente:

1). Includi questo CDN nel tuo progetto / file

<script src="https://cdn.jsdelivr.net/gh/linways/table-to-excel@v1.0.4/dist/tableToExcel.js"></script>

2). O utilizzando JavaScript:

<button id="btnExport" onclick="exportReportToExcel(this)">EXPORT REPORT</button>

function exportReportToExcel() {
  let table = document.getElementsByTagName("table"); // you can use document.getElementById('tableId') as well by providing id to the table tag
  TableToExcel.convert(table[0], { // html code may contain multiple tables so here we are refering to 1st table tag
    name: `export.xlsx`, // fileName you could use any name
    sheet: {
      name: 'Sheet 1' // sheetName
    }
  });
}

3). O usando Jquery

<button id="btnExport">EXPORT REPORT</button>

$(document).ready(function(){
    $("#btnExport").click(function() {
        let table = document.getElementsByTagName("table");
        TableToExcel.convert(table[0], { // html code may contain multiple tables so here we are refering to 1st table tag
           name: `export.xlsx`, // fileName you could use any name
           sheet: {
              name: 'Sheet 1' // sheetName
           }
        });
    });
});

Puoi fare riferimento a questo collegamento GitHub per qualsiasi altra informazione

https://github.com/linways/table-to-excel/tree/master

o per fare riferimento all'esempio dal vivo, visitare il seguente collegamento

https://codepen.io/rohithb/pen/YdjVbb

Spero che questo aiuti qualcuno :-)


1

La mia versione di @sampopes risponde

function exportToExcel(that, id, hasHeader, removeLinks, removeImages, removeInputParams) {
if (that == null || typeof that === 'undefined') {
    console.log('Sender is required');
    return false;
}

if (!(that instanceof HTMLAnchorElement)) {
    console.log('Sender must be an anchor element');
    return false;
}

if (id == null || typeof id === 'undefined') {
    console.log('Table id is required');
    return false;
}
if (hasHeader == null || typeof hasHeader === 'undefined') {
    hasHeader = true;
}
if (removeLinks == null || typeof removeLinks === 'undefined') {
    removeLinks = true;
}
if (removeImages == null || typeof removeImages === 'undefined') {
    removeImages = false;
}
if (removeInputParams == null || typeof removeInputParams === 'undefined') {
    removeInputParams = true;
}

var tab_text = "<table border='2px'>";
var textRange;

tab = $(id).get(0);

if (tab == null || typeof tab === 'undefined') {
    console.log('Table not found');
    return;
}

var j = 0;

if (hasHeader && tab.rows.length > 0) {
    var row = tab.rows[0];
    tab_text += "<tr bgcolor='#87AFC6'>";
    for (var l = 0; l < row.cells.length; l++) {
        if ($(tab.rows[0].cells[l]).is(':visible')) {//export visible cols only
            tab_text += "<td>" + row.cells[l].innerHTML + "</td>";
        }
    }
    tab_text += "</tr>";
    j++;
}

for (; j < tab.rows.length; j++) {
    var row = tab.rows[j];
    tab_text += "<tr>";
    for (var l = 0; l < row.cells.length; l++) {
        if ($(tab.rows[j].cells[l]).is(':visible')) {//export visible cols only
            tab_text += "<td>" + row.cells[l].innerHTML + "</td>";
        }
    }
    tab_text += "</tr>";
}

tab_text = tab_text + "</table>";
if (removeLinks)
    tab_text = tab_text.replace(/<A[^>]*>|<\/A>/g, "");
if (removeImages)
    tab_text = tab_text.replace(/<img[^>]*>/gi, ""); 
if (removeInputParams)
    tab_text = tab_text.replace(/<input[^>]*>|<\/input>/gi, "");

var ua = window.navigator.userAgent;
var msie = ua.indexOf("MSIE ");

if (msie > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./))      // If Internet Explorer
{
    myIframe.document.open("txt/html", "replace");
    myIframe.document.write(tab_text);
    myIframe.document.close();
    myIframe.focus();
    sa = myIframe.document.execCommand("SaveAs", true, document.title + ".xls");
    return true;
}
else {
    //other browser tested on IE 11
    var result = "data:application/vnd.ms-excel," + encodeURIComponent(tab_text);
    that.href = result;
    that.download = document.title + ".xls";
    return true;
}
}

Richiede un iframe

<iframe id="myIframe" style="opacity: 0; width: 100%; height: 0px;" seamless="seamless"></iframe>

Utilizzo

$("#btnExportToExcel").click(function () {
    exportToExcel(this, '#mytable');
});
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.