How to Export Multiple Row Headers in jQuery Datatables?

前端 未结 6 681
挽巷
挽巷 2021-02-10 08:16

Hi I am using jQuery Datatables 1.10. I am trying to export Datatable multiple header rows but not getting. But it is Exporting only second header row. I am using Buttons:

6条回答
  •  春和景丽
    2021-02-10 09:14

    Adding to the solution that was given by Ronnie, since most of us got confused how exactly the approach works, would like to take it in a detail.

    1. To get Excel button working add buttons.html5.js, dataTables.buttons.min.js, jszip.min.js.

    2. For multiple row header table export, add below function in buttons.html5.js at the bottom of the document

      var _fnGetHeaders = function(dt) {
      var thRows = $(dt.header()[0]).children();
      var numRows = thRows.length;
      var matrix = [];
      
      // Iterate over each row of the header and add information to matrix.
      for ( var rowIdx = 0;  rowIdx < numRows;  rowIdx++ ) {
          var $row = $(thRows[rowIdx]);
      
          // Iterate over actual columns specified in this row.
          var $ths = $row.children("th");
          for ( var colIdx = 0;  colIdx < $ths.length;  colIdx++ )
          {
              var $th = $($ths.get(colIdx));
              var colspan = $th.attr("colspan") || 1;
              var rowspan = $th.attr("rowspan") || 1;
              var colCount = 0;
      
              // ----- add this cell's title to the matrix
              if (matrix[rowIdx] === undefined) {
                  matrix[rowIdx] = [];  // create array for this row
              }
              // find 1st empty cell
              for ( var j = 0;  j < (matrix[rowIdx]).length;  j++, colCount++ ) {
                  if ( matrix[rowIdx][j] === "PLACEHOLDER" ) {
                      break;
                  }
              }
              var myColCount = colCount;
              matrix[rowIdx][colCount++] = $th.text();
      
              // ----- If title cell has colspan, add empty titles for extra cell width.
              for ( var j = 1;  j < colspan;  j++ ) {
                  matrix[rowIdx][colCount++] = "";
              }
      
              // ----- If title cell has rowspan, add empty titles for extra cell height.
              for ( var i = 1;  i < rowspan;  i++ ) {
                  var thisRow = rowIdx+i;
                  if ( matrix[thisRow] === undefined ) {
                      matrix[thisRow] = [];
                  }
                  // First add placeholder text for any previous columns.                 
                  for ( var j = (matrix[thisRow]).length;  j < myColCount;  j++ ) {
                      matrix[thisRow][j] = "PLACEHOLDER";
                  }
                  for ( var j = 0;  j < colspan;  j++ ) {  // and empty for my columns
                      matrix[thisRow][myColCount+j] = "";
                  }
              }
          }
      }
      
      return matrix;
      };
      
    3. With in the same file find DataTable.ext.buttons.excelHtml5 and replace the code block

      if(config.header){
          /*Existing code*/
      }
      

      to

      if (config.header) {
          /* ----- BEGIN changed Code ----- */
          var headerMatrix = _fnGetHeaders(dt);
          for (var rowIdx = 0; rowIdx < headerMatrix.length; rowIdx++) {
              addRow(headerMatrix[rowIdx], rowPos);
          }
          /* ----- OLD Code that is replaced: ----- */
          //addRow( data.header, rowPos );
          /* ----- END changed Code ----- */
          $('row c', rels).attr('s', '2'); // bold
      }
      

    That's it. you would be able to export the multiple header rows.

    And adding to the above if you want to export merged cells then below code would help you.

    Add this to buttons customize function.

    buttons: [
        {
            extend: 'excel',
            customize: function (xlsx) {
                //Apply styles, Center alignment of text and making it bold.
                var sSh = xlsx.xl['styles.xml'];
                var lastXfIndex = $('cellXfs xf', sSh).length - 1;
    
                var n1 = '';
                var s2 = '' +
                        '';
    
                sSh.childNodes[0].childNodes[0].innerHTML += n1;
                sSh.childNodes[0].childNodes[5].innerHTML += s2;
    
                var greyBoldCentered = lastXfIndex + 1;
    
                //Merge cells as per the table's colspan
                var sheet = xlsx.xl.worksheets['sheet1.xml'];
                var dt = $('#tblReport').DataTable();
                var frColSpan = $(dt.table().header()).find('th:nth-child(1)').prop('colspan');
                var srColSpan = $(dt.table().header()).find('th:nth-child(2)').prop('colspan');
                var columnToStart = 2;
    
                var mergeCells = $('mergeCells', sheet);
                mergeCells[0].appendChild(_createNode(sheet, 'mergeCell', {
                    attr: {
                        ref: 'A1:' + toColumnName(frColSpan) + '1'
                    }
                }));
    
                mergeCells.attr('count', mergeCells.attr('count') + 1);
    
                var columnToStart = 2;
    
                while (columnToStart <= frColSpan) {
                    mergeCells[0].appendChild(_createNode(sheet, 'mergeCell', {
                        attr: {
                            ref: toColumnName(columnToStart) + '2:' + toColumnName((columnToStart - 1) + srColSpan) + '2'
                        }
                    }));
                    columnToStart = columnToStart + srColSpan;
                    mergeCells.attr('count', mergeCells.attr('count') + 1);
                }
    
                //Text alignment to center and apply bold
                $('row:nth-child(1) c:nth-child(1)', sheet).attr('s', greyBoldCentered);
                for (i = 0; i < frColSpan; i++) {
                    $('row:nth-child(2) c:nth-child(' + i + ')', sheet).attr('s', greyBoldCentered);
                }
    
                function _createNode(doc, nodeName, opts) {
                    var tempNode = doc.createElement(nodeName);
                    if (opts) {
                        if (opts.attr) {
                            $(tempNode).attr(opts.attr);
                        }
                        if (opts.children) {
                            $.each(opts.children, function (key, value) {
                                tempNode.appendChild(value);
                            });
                        }
                        if (opts.text !== null && opts.text !== undefined) {
                            tempNode.appendChild(doc.createTextNode(opts.text));
                        }
                    }
                    return tempNode;
                }
    
                //Function to fetch the cell name
                function toColumnName(num) {
                    for (var ret = '', a = 1, b = 26; (num -= a) >= 0; a = b, b *= 26) {
                        ret = String.fromCharCode(parseInt((num % b) / a) + 65) + ret;
                    }
                    return ret;
                }
            }
        }
    ]
    

提交回复
热议问题