DataTables Export Test

HTML

<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/1.10.15/css/dataTables.bootstrap.min.css">
<link rel="stylesheet" href="https://cdn.datatables.net/select/1.2.2/css/select.bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/1.10.15/js/jquery.dataTables.min.js"></script>
<script src="https://cdn.datatables.net/1.10.15/js/dataTables.bootstrap.min.js"></script>
<script src="https://cdn.datatables.net/buttons/1.3.1/js/dataTables.buttons.min.js"></script>
<script src="https://cdn.datatables.net/buttons/1.3.1/js/buttons.bootstrap.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.1.3/jszip.min.js"></script>
<script src="https://cdn.datatables.net/buttons/1.3.1/js/buttons.html5.min.js"></script>
<script src="https://cdn.datatables.net/select/1.2.2/js/dataTables.select.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.1.1/js/dataTables.responsive.min.js"></script>
<script src="https://cdn.datatables.net/responsive/2.1.1/js/responsive.bootstrap.min.js"></script>
<main class="main container">
  <h1>Export Test</h1>

  <p>Viewport:
    <strong>
		  <span class="visible-xs-inline">xs</span>
		  <span class="visible-sm-inline">sm</span>
		  <span class="visible-md-inline">md</span>
		  <span class="visible-lg-inline">lg</span>
	  </strong>
  </p>

  <button id="load-combined-columns">Combined Columns Page &amp; Export</button>
  <button id="load-separate-columns">Combined Columns Page; Separate Columns Export</button>

  <hr />

  <table id="leadInfoTable" class="display table table-bordered table-striped" width="100%">
    <thead></thead>
    <tbody></tbody>
  </table>

</main>

CSS

a:link {
  white-space: nowrap;
}

tr.new-lead {
  font-weight: bold;
}

.modal .hidden-modal {
  display: none;
}

.visible-modal-inline {
  display: none;
}

.modal .visible-modal-inline {
  display: inline;
}

.modal table > tr > td {
  vertical-align: top;
}

JavaScript

// Generate dummy data for table
var numRows = 30000;

function generatePhone(n) {
  // convert any number to a 10-character string
  n = n.toString();
  var l = n.length;
  if (l > 9) {
    return n.substr(l - 10, l);
  }
  l = 10 - l;
  var phone = n;
  for (var i = 0; i < l; i++) {
    phone += '0';
  }
  return phone;
}

var data = [];
for (var i = 0; i < numRows; i++) {
  // populate data with random numbers --
  // that way table will still have to be sorted on load

  var rand = Math.floor(Math.random() * 10000000000),
    phone = generatePhone(rand);
  data.push({
    viewed: (rand % 5 > 0),
    firstName: rand,
    lastName: rand,
    address: rand,
    city: rand,
    state: rand,
    postal: rand,
    workPhone: phone,
    homePhone: phone,
    age: rand,
    mediaType: rand,
    language: (rand % 3 > 0),
    receivedDate: rand,
    assignedDate: rand,
    letterEligible: rand % 2
  });
}

// layout for when DataTable has multiple pages:
// entries per page and paging buttonbar appear at bottom
$.pagedLayout = 'Bfrt' // buttons, filter, processing, table
  + '<"row paged-layout"' + '<"col-sm-3 col-md-push-5"l>' // length
  + '<"col-sm-9 col-md-5 col-md-push-4"p>' // paging
  + '<"col-sm-12 col-md-4 col-md-pull-8"i>' // info
  + '>';


// responsive settings
var defaultResponsiveRenderer = function(api, rowIdx, columns) {
  // Copy the row to a two-column table inside the modal.
  // First column will be the column's title,
  // second column will be its content.
  var modalContent = $('<div/>'),
    table = $('<table class="table"/>'),
    errors;

  $.each(columns, function(i) {
    // get the node for the current table cell.
    var colNode = $(api.cell(rowIdx, i).node());

    // ignore cells that aren't supposed to be rendered
    // inside the modal.
    if (colNode.hasClass('launch-modal') || colNode.hasClass('select-checkbox') || colNode.hasClass('hidden-modal')) {
      return;
    }

    // insert error messages after table
    if...