<!DOCTYPE html>
<html>
    <head>
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/dt/jq-3.6.0/jszip-2.5.0/dt-1.13.2/b-2.3.4/b-html5-2.3.4/datatables.min.css"/>
 
<script type="text/javascript" src="https://cdn.datatables.net/v/dt/jq-3.6.0/jszip-2.5.0/dt-1.13.2/b-2.3.4/b-html5-2.3.4/datatables.min.js"></script>
      <meta charset=utf-8 />
        <title>DataTables - JS Bin</title>
    </head>
    <body>
        <div class="container">
            <table id="example" class="display" width="100%">
                <thead>
                    <tr>
                        <th>Name</th>
                        <th>Debt</th>
                        <th>Position</th>
                        <th>Age</th>
                    </tr>
                </thead>
                <tfoot>
                    <tr>
                        <th>Name</th>
                        <th>Debt</th>
                        <th>Position</th>
                        <th>Age</th>
                    </tr>
                </tfoot>
            </table>
        </div>
    </body>
</html>
 
body {
    font: 90%/1.45em "Helvetica Neue", HelveticaNeue, Verdana, Arial, Helvetica, sans-serif;
    margin: 0;
    padding: 0;
    color: #333;
    background-color: #fff;
}
div.container {
    min-width: 980px;
    margin: 0 auto;
}
.red_cell_highlight {
  background-color: red;
}
.yellow_cell_highlight {
  background-color: yellow;
}
 
$(document).ready(function() {  
  function isNumeric( n ) {
     return !isNaN(parseFloat(n)) && isFinite(n);
  }
  
  var dataSet = [
    {name:'Sally Smith', debt:{display: '$100,000', value: 100000, alarm: 'RED'}, position:'Accountant', age:40},
    {name:'Sam Smith',   debt:{display: '$500',     value: 500,    alarm: null}, position:'Accountant', age:50},
    {name:'Fred Smith',  debt:{display: '$800',     value: 800,    alarm: null}, position:'Accountant', age:50},
    {name:'Joe Newbee',  debt:{display: '$300,000', value: 300000, alarm: 'RED'}, position:'Office Worker', age:25}
  ];
  function styleCell( cell, cellData ) {
     var highlight = cellData.alarm;
     if ( highlight ) {
        $(cell).addClass( highlight.toLowerCase() + '_cell_highlight' );
     }
  }
  
  function renderCellValue( data, type, row, meta ) {
     if ( data === null ) { return null; }
    
     if ( type === 'display' ) {
        return data.display;
     } else if ( type === 'export' ) {
        // set expected `export` attributes to handle Excel styling
        // Create a new object with just needed values (so produced Excel column isn't as wide).
       let exportData = { value: data.value, 
                         highlight: (data.alarm !== null) ? data.alarm.toLowerCase() : null };
        return JSON.stringify(exportData);
     } else {   // will be used for 'filter' and 'sort'
        return data.value;
     }
  }
  
  var table = $('#example').DataTable({
      dom: 'Bfrtip',
      pageLength: 2,
      data: dataSet,
      deferRender: true,
      "columns": [
        { "data": "name" },
        { "data": "debt", render: renderCellValue, createdCell: styleCell },
        { "data": "position" },
        { "data": "age" }
      ],
    buttons: [{
      extend: 'excelHtml5',
      exportOptions: { orthogonal: 'export' },
      customize: function( xlsx, buttonConfig, api ) {
         let sheet = xlsx.xl.worksheets['sheet1.xml'];
         let numExcelRows = $('sheetData', sheet).children().length;
         let numDataRows = api.rows()[0].length;
         // could be multiple header rows
         let numHeaderRows = numExcelRows - numDataRows;
         // Iterate through data rows & see if we need to "unpack" any styling including in JSON.
         // JSON should look like, e.g.:  { exportValue: 123, exportHighlight: 'red' }
         $('row:nth-child(n+'+(numHeaderRows+1)+') c', sheet).each(function() {
            let excelCell = $(this);
            let cellData  = excelCell.text();
            // only look at JSON objects
            if ( !cellData.startsWith("{") ) {
               return;
            }
            let cellDataParsed;
            try {
               cellDataParsed = JSON.parse(cellData);
            } catch ( exc ) {
               // exception trying to parse JSON, ignore & return
               return;
            }
            // ----- Replace the XML cell's text value with `exportValue`
            if ( 'value' in cellDataParsed ) {
               let exportValue = cellDataParsed.value;
               console.log( 'setting export value: ' + exportValue );
               if ( isNumeric(exportValue) ) {  // set as numeric cell for sorting
                  excelCell.attr('t', 'n');
                  $(this).empty();
                  $(this).append('<v>' + exportValue + '</v>');
               } else {
                  $('is t', this).text(exportValue);
               }
            }
            // ----- Add cell styling from `exportHighlight`
            if ( 'highlight' in cellDataParsed ) {
               let exportHighlight = cellDataParsed.highlight;
               console.log( 'setting export style = ' + exportHighlight );
               if ( exportHighlight === 'red' ) {
                  excelCell.attr('s', '39');
               } else if ( exportHighlight === 'yellow' ) {
                  $(this).attr('s', '22');
               }
            }
        });
      }
    }]
  });
  
} );
10 warnings
Line 28: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 51: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 52: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 53: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 55: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 60: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 61: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 67: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 77: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Line 90: 'let' is available in ES6 (use esnext option) or Mozilla JS extensions (use moz).
Output

You can jump to the latest bin by adding /latest to your URL

Dismiss x
public
Bin info
anonymouspro
0viewers