Експорт даних таблиці html у Excel за допомогою JavaScript / JQuery не працює належним чином у браузері chrome


91

У мене є таблиця HTML у шаблоні швидкості. Я хочу експортувати дані таблиці html в Excel, використовуючи або сценарій Java, або jquery, comatibale з усіма браузерами. Я використовую сценарій нижче

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

Цей скрипт чудово працює у Mozilla Firefox , він з’являється з діалоговим вікном Excel і запитує параметри відкриття або збереження. Але коли я тестував той самий сценарій у браузері Chrome, він працює не так, як очікувалось, при натисканні на кнопку спливаюче вікно для Excel не з’являється. Дані завантажуються у файл із "типом файлу: файл", без розширення, такого як .xls У консолі chrome немає помилок.

Приклад Jsfiddle:

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

Це чудово працює в мозилі, але не в хромі.

Тестовий кейс для браузера Chrome:

Перше зображення: Я натискаю кнопку Експорт у Excel

Перше зображення: Я натискаю кнопку Експорт у Excel

і результат:

Результат


Тест для хрому
Sukane

1
Наведений вище тест не вдається, якщо ви використовуєте продукт з відкритим кодом LibreOffice та браузер Chrome. Але якщо у вас встановлений MS Office, тоді код працюватиме належним чином.
Сукане

Відповіді:


168

Сценарій експорту Excel працює на IE7 +, Firefox та 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);
}

Просто створіть порожній iframe:

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

Викличте цю функцію на:

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

1
якщо ні, то для чого цей рядок ?? var txt = document.getElementById ('txtArea1'). contentWindow;
sampopes

3
У Chrome при натисканні кнопки завантаження взагалі нічого не відбувається при використанні цього методу. Ніяких помилок на консолі чи чогось іншого.
Kyle Bachan

1
Ідеально +1 !!! Він працює в IE 11, Chrome 35, Firefox 29, Opera 17 Але не працює в сафарі 5.1.7 !!! :(
Suganth G

9
як я можу змінити ім'я Randome. Я не хочу встановити конкретне ім'я.
Осман Рахімі 02

21
"Формат файлу та розширення download.xls не збігаються" Це не робить менеджера щасливим: / Будь-які ідеї?
Tom Stickel

36

Плагін Datatable найкраще вирішує ціль і дозволяє експортувати дані таблиці HTML у Excel, PDF, TEXT. легко налаштовується.

Будь ласка, знайдіть повний приклад у довідковому посиланні нижче

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

(знімок екрана з довідкового веб-сайту) введіть тут опис зображення


4
О БОЖЕ МІЙ! Це чудовий плагін! ... і має кілька вбудованих плагінів !! Експорт, сортування, порядок, попередній перегляд друку тощо ... Вирішено всі мої дані, що відображають потреби, лише за 1 постріл!
Gusstavv Gil

Чи можу я застосувати стилі до мого Excel за допомогою цього плагіна?
Shruthi Sathyanarayana

@Addy, це рішення лише для DataTables, правда?
Карл,

1
Кнопка експорту видалить випадаючий підрахунок кожного рядка сторінки, якщо ви хочете зберегти обидві речі? будь ласка, перевірте datatables.net/extensions/buttons/examples/initialisation/…, щоб вирішити це.
Kaushik Das

Плагін чудовий. Чи є спосіб просто витягти відповідний код для експорту даних та виділити тут? Це було б великою підмогою. Заздалегідь спасибі
Муртуза Хусайн

31

Це може допомогти

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
що робити, якщо я хочу експортувати лише стовпці, які видно в таблиці html ??
Nouman Bhatti

Привіт, я не можу виконати жодних операцій EXCEL з аркушем, наприклад: Autosum. Це через формат даних цього аркуша EXCEL чи будь-які інші проблеми .. Мені потрібна допомога для виконання деяких операцій.
Нанда Кішоре Аллу,

9

http://wsnippets.com/export-html-table-data-excel-sheet-using-jquery/ спробуйте це посилання, це може вирішити вашу проблему

введіть тут опис зображення


Uchit, дякую за вашу відповідь. Але я вже пробував цей приклад. Як я вже згадував, ставлю під сумнів, що він працює нормально в Mozilla, але не в Chorme. Чи можете випробувати цей приклад у браузері Chrome?
Sukane

5
Я спробував ваш код на jsfiddle, і я отримав позитивний результат. Це чудово працює навіть у хормі. На зображенні вище ви можете побачити, що завантаження було
успішним

1
Учіт, дякую. Так код працює. Проблема в тому, що я використовував Libre Office, тому в Chrome експорт в Excel не працював нормально (знімок екрана в запитанні m). Але в MS Office це працює, як ви вже згадували. Дякуємо, що надали для цього код jQuery.
Сукане

Ця функція не експортує значення полів зі спадними меню та мітками часу
SNT93,

він не працює з кількома таблицями html, лише з однією таблицею. Як я можу це зробити за допомогою декількох таблиць ??????
ignacio chiazzo

9

Замість використання window.openви можете використовувати посилання на onclickподію.
І ви можете помістити таблицю html в uri і встановити ім'я файлу для завантаження.

Демо-версія:

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>


як я можу встановити функцію межі таблиці, td ширини тощо?
Зеффрі Рейнандо,

9

TableExport

TableExport - проста, проста у реалізації бібліотека для експорту таблиць HTML у файли xlsx, xls, csv та txt.

Щоб скористатися цією бібліотекою, просто викличте TableExportконструктор:

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

// OR simply

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

// OR using jQuery

$("table").tableExport(); 

Додаткові властивості можна передавати для налаштування зовнішнього вигляду ваших таблиць, кнопок та експортованих даних. Дивіться тут більше інформації


Чи підтримує він PhantomJs? Як повідомляти про помилки?
голімар

6

Моє злиття цих прикладів:

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
Uncaught ReferenceError: base64 не визначено
Педро Хоакін


4

Щодо відповідей сампопів від 6 червня 2014 року об 11:59:

Я вставив стиль css з розміром шрифту 20 пікселів, щоб відображати дані Excel більше. У коді sampopes провідні <tr>теги відсутні, тому я спочатку вивожу заголовок, а не інші рядки таблиць у циклі.

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

Підкажіть, будь ласка, як видалити певний стовпець з експорту до Excel. Наприклад, я хочу уникнути tab.rows[j].cells[13] , ваша допомога справді вдячна
Дізера

Дуже приємна відповідь, для дуже простої таблиці я б просто window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));залишив останній рядок: додавання дуже важливо.
Пере Сторінки

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

Тут значення від 1 до 10 - це назви стовпців, які ви отримуєте


4

Ви можете використовувати tableToExcel.js для експорту таблиці у файлі Excel.

Це працює наступним чином:

1). Включіть цей CDN у свій проект / файл

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

2). Або за допомогою 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). Або за допомогою 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
           }
        });
    });
});

Ви можете звернутися до цього посилання на github для отримання будь-якої іншої інформації

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

або для перегляду прикладу в реальному часі перейдіть за наступним посиланням

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

Сподіваюся, це комусь допоможе :-)


1

Моя версія відповіді @sampopes

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

Потрібен iframe

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

Використання

$("#btnExportToExcel").click(function () {
    exportToExcel(this, '#mytable');
});
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.