Exporting jquery datatable to excel with additional rows is not working IE

后端 未结 2 1064
甜味超标
甜味超标 2021-01-27 09:17

I am trying to export datatable using jquery export button options to excel sheet. And i want additional rows to be added before the table data in excel file. I made a similar d

2条回答
  •  梦毁少年i
    2021-01-27 09:41

    As @Jonatan Perez put it, Internet Explorer does not support innerHTML, nor insertAdjacentHTML for that matter. And other additional problems can occur.

    To sum it up, you have to switch from this:

    // Get the sheet objects
    var sSh = xlsx.xl['styles.xml'];
    var styleSheet = sSh.childNodes[0];
    numFmts = styleSheet.childNodes[0];
    cellXfs = styleSheet.childNodes[5];
    var sheet = xlsx.xl.worksheets['sheet1.xml'];
    
    // Set a custom format ID
    var formatID = 300;
    
    // Create a custom number format (percent). Note that using " instead of \" in the format code does not work for Internet Explorer!
    var newNumberFormat = '';
    // Create a custom style based on this number format (bold centered rounded)
    var newStyle =
        'horizontal="center" />>';
    
    // Append the new format next to the other ones
    numFmts.innerHTML += newNumberFormat;
    // Append the style next to the other ones
    cellXfs.childNodes[5].innerHTML += newStyle;
    
    // Use the new style on cell A1
    $('c[r=A1]', sheet).attr('s', cellXfs.length);
    

    To this:

    // Get the sheet objects
    var sSh = xlsx.xl['styles.xml'];
    var styleSheet = sSh.childNodes[0];
    numFmts = styleSheet.childNodes[0];
    cellXfs = styleSheet.childNodes[5];
    var sheet = xlsx.xl.worksheets['sheet1.xml'];
    
    // Set a custom format ID
    var formatID = 300;
    
    /// In what follows, use "createElementNS" everytime the attribute has an uppercase letter; otherwise, Chrome and Firefox will break the XML by lowercasing it
    
    // Using this instead of "" (required for Excel 2007+, not for 2003)
    var ns = "http://schemas.openxmlformats.org/spreadsheetml/2006/main";
    // Create a custom number format
    var newNumberFormat = document.createElementNS(ns, "numFmt");
    newNumberFormat.setAttribute("numFmtId", formatID);
    newNumberFormat.setAttribute("formatCode", "0.0");
    // Append the new format next to the other ones
    numFmts.appendChild(newNumberFormat);
    
    // Create a custom style
    var lastStyleNum = $('cellXfs xf', sSh).length - 1;
    var styleNum = lastStyleNum + 1;
    var newStyle = document.createElementNS(ns, "xf");
    // Customize style
    newStyle.setAttribute("numFmtId", formatID);
    newStyle.setAttribute("fontId", 2);
    newStyle.setAttribute("fillId", 0);
    newStyle.setAttribute("borderId", 0);
    newStyle.setAttribute("applyFont", 1);
    newStyle.setAttribute("applyFill", 1);
    newStyle.setAttribute("applyBorder", 1);
    newStyle.setAttribute("xfId", 0);
    newStyle.setAttribute("applyNumberFormat", 1);
    // Alignment (optional)
    var align = document.createElementNS(ns, "alignment");
    align.setAttribute("horizontal", "center");
    newStyle.appendChild(align);
    // Append the style next to the other ones
    cellXfs.appendChild(newStyle);
    
    // Use the new style on "Age" column
    $('row:not(:eq(1)) c[r^=D]', sheet).attr('s', styleNum);
    

    LIVE DEMO

    Solution inspired by Raghul and rf1234 in the forums of DataTables.net:
    https://www.datatables.net/forums/discussion/comment/116614/#Comment_116641
    https://datatables.net/forums/discussion/36045/excel-export-add-rows-and-data#Comment_103911

    Also based on the following SO answers:
    Keep uppercase using attr() with jquery (case sensitive)
    Create XML DOM Element while keeping case sensitivity

提交回复
热议问题