Xuất dữ liệu bảng html sang Excel bằng JavaScript / JQuery không hoạt động bình thường trong trình duyệt chrome


90

Tôi có một bảng HTML trong mẫu vận tốc. Tôi muốn xuất dữ liệu bảng html sang excel bằng java script hoặc jquery, comatibale với tất cả trình duyệt. Tôi đang sử dụng tập lệnh dưới đây

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

Tập lệnh này hoạt động tốt trong Mozilla Firefox , nó bật lên với một hộp thoại excel và yêu cầu các tùy chọn mở hoặc lưu. Nhưng khi tôi thử nghiệm cùng một tập lệnh trong trình duyệt Chrome, nó không hoạt động như mong đợi, khi nhấp vào nút không có cửa sổ bật lên cho excel. Dữ liệu được tải xuống trong một tệp có "loại tệp: tệp", không có phần mở rộng như .xls Không có lỗi trong bảng điều khiển chrome.

Ví dụ về jsfiddle:

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

Điều này hoạt động tốt trong mozilla nhưng không hoạt động trong chrome.

Trường hợp kiểm tra trình duyệt Chrome:

Hình ảnh đầu tiên: Tôi nhấp vào nút Export to excel

Hình ảnh đầu tiên: Tôi nhấp vào nút Export to excel

và kết quả:

Kết quả


Trường hợp thử nghiệm là dành cho chrome
Sukane

1
Trường hợp kiểm tra trên không thành công nếu bạn đang sử dụng sản phẩm nguồn mở LibreOffice và trình duyệt Chrome. Nhưng nếu bạn đã cài đặt MS Office thì mã sẽ hoạt động bình thường.
Sukane

Câu trả lời:


164

Tập lệnh xuất Excel hoạt động trên IE7 +, Firefox và 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);
}

Chỉ cần tạo iframe trống:

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

Gọi hàm này trên:

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

1
nếu không thì dòng này là gì ?? var txt = document.getElementById ('txtArea1'). contentWindow;
sampopes

3
Trong Chrome, khi bạn nhấp vào nút tải xuống, không có gì xảy ra khi sử dụng phương pháp này. Không có lỗi giao diện điều khiển hoặc bất cứ điều gì.
Kyle Bachan

1
+1 hoàn hảo !!! Nó hoạt động trong IE 11, Chrome 35, Firefox 29, Opera 17 Nhưng không hoạt động trong safari 5.1.7 !!! :(
Suganth G

9
làm cách nào để thay đổi tên Randome. Tôi muốn đặt tên đặc biệt.
osman Rahimi

21
"Định dạng tệp và phần mở rộng của download.xls không khớp" Điều này không làm người quản lý hài lòng: / Có ý kiến ​​gì không?
Tom Stickel

34

Plugin Datatable giải quyết mục đích tốt nhất và cho phép chúng tôi xuất dữ liệu bảng HTML sang Excel, PDF, TEXT. dễ dàng cấu hình.

Vui lòng tìm ví dụ đầy đủ trong liên kết tham khảo có thể lập được bên dưới:

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

(ảnh chụp màn hình từ trang web tham khảo có thể dữ liệu) nhập mô tả hình ảnh ở đây


4
CHÚA ƠI! Đây là một plugin tuyệt vời! ... và có một số plugin được nhúng !! Xuất, Sắp xếp, Sắp xếp lại, Xem trước Bản in, v.v. ... Giải quyết tất cả các nhu cầu hiển thị dữ liệu của tôi chỉ trong 1 lần chụp!
Gusstavv Gil

Tôi có thể áp dụng các kiểu cho excel của mình bằng cách sử dụng plugin này không?
Shruthi Sathyanarayana,

@Addy đây là một giải pháp duy nhất của DataTables, phải không?
Karl

1
Nút xuất sẽ loại bỏ từng số hàng trang thả xuống, nếu bạn muốn giữ lại cả hai thứ? vui lòng kiểm tra datatables.net/extensions/buttons/examples/initialisation/… để giải quyết vấn đề này.
Kaushik Das

Plugin rất tuyệt. Có cách nào chỉ cần trích xuất mã liên quan để xuất dữ liệu và đánh dấu ở đây không? Đó sẽ là một sự trợ giúp tuyệt vời. Cảm ơn trước
Murtuza Husain

31

Điều này có thể giúp

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
điều gì sẽ xảy ra nếu tôi chỉ muốn xuất các cột hiển thị trong bảng html ??
Nouman Bhatti

Xin chào, tôi không thể thực hiện bất kỳ thao tác EXCEL nào với trang tính, ví dụ: Autosum. Đó là do định dạng dữ liệu của trang EXCEL này hay bất kỳ vấn đề nào khác .. Tôi cần trợ giúp để thực hiện một số thao tác.
Nanda Kishore Allu

9

http://wsnippets.com/export-html-table-data-excel-sheet-using-jquery/ hãy thử liên kết này, nó có thể giải quyết vấn đề của bạn

nhập mô tả hình ảnh ở đây


Rất tiếc, cảm ơn câu trả lời của bạn.
Sukane

5
Tôi đã thử mã của bạn trên jsfiddle và tôi nhận được kết quả tích cực. Nó hoạt động tốt ngay cả trong chorme. Bạn có thể nhìn thấy trong hình ở trên mà tải là sucessfull
Uchit Shrestha

1
Uchit, cảm ơn bạn. Có mã đang hoạt động. Vấn đề là tôi đang sử dụng Libre Office, vì vậy trong Chrome xuất sang excel không hoạt động tốt (ảnh chụp màn hình tham chiếu trong câu hỏi m). Nhưng trong văn phòng MS, nó hoạt động, như bạn đã đề cập. Cảm ơn bạn đã cung cấp mã jQuery cho việc này.
Sukane

Chức năng này không xuất giá trị của các trường có thả xuống..và dấu thời gian
SNT93

nó không hoạt động với nhiều bảng html, chỉ với một bảng. Làm thế nào tôi có thể làm điều này với bảng bội số ??????
ignacio chiazzo

9

Thay vì sử dụng, window.openbạn có thể sử dụng liên kết với onclicksự kiện.
Và bạn có thể đặt bảng html vào uri và đặt tên tệp sẽ tải xuống.

Bản thử trực tiếp :

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>


Làm thế nào tôi có thể đặt đường viền bảng, chiều rộng td, v.v. trong chức năng?
Zeffry Reynando

8

TableExport

TableExport - Thư viện đơn giản, dễ triển khai để xuất các bảng HTML sang các tệp xlsx, xls, csv và txt.

Để sử dụng thư viện này, đơn giản hãy gọi hàm TableExporttạo:

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

// OR simply

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

// OR using jQuery

$("table").tableExport(); 

Các thuộc tính bổ sung có thể được chuyển vào để tùy chỉnh giao diện của bảng, nút và dữ liệu đã xuất của bạn. Xem thêm thông tin ở đây


Nó có hỗ trợ PhantomJs không? Làm thế nào để báo cáo lỗi?
golimar

5

Hợp nhất của tôi về các ví dụ này:

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 không được xác định
Pedro Joaquín


4

Câu trả lời liên quan đến sampopes từ ngày 6 tháng 6 '14 lúc 11:59:

Tôi đã chèn một kiểu css với kích thước phông chữ là 20px để hiển thị dữ liệu excel lớn hơn. Trong mã sampopes, các <tr>thẻ ở đầu bị thiếu, vì vậy trước tiên tôi xuất dòng tiêu đề và các dòng khác của bảng trong một vòng lặp.

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

Bạn có thể vui lòng cho tôi biết làm thế nào để loại bỏ cột cụ thể để xuất khẩu sang excel. Ví dụ, tôi muốn tránh tab.rows[j].cells[13] , sự giúp đỡ của bạn thực sự được đánh giá cao
Disera

Câu trả lời rất hay, đối với một bảng rất đơn giản, tôi chỉ xin giữ lại dòng cuối cùng: window.open('data:application/vnd.ms-excel,' + encodeURIComponent(tab_text));việc xếp chồng lên nhau là rất quan trọng.
Trang Pere

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

Ở đây Giá trị từ 1 đến 10 là tên cột mà bạn đang nhận được


4

Bạn có thể sử dụng tableToExcel.js để xuất bảng trong tệp excel.

Điều này hoạt động theo cách sau:

1). Bao gồm CDN này trong dự án / tệp của bạn

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

2). Sử dụng 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). Hoặc bằng cách sử dụng 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
           }
        });
    });
});

Bạn có thể tham khảo liên kết github này để biết thêm thông tin

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

hoặc để tham khảo ví dụ trực tiếp, hãy truy cập liên kết sau

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

Hy vọng điều này sẽ giúp ai đó :-)


1

Phiên bản câu trả lời @sampopes của tôi

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

Yêu cầu iframe

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

Sử dụng

$("#btnExportToExcel").click(function () {
    exportToExcel(this, '#mytable');
});
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.