Exporting Data

The Exporter package enables data export to various file formats. It supports native XSLX, Excel XML as well as HTML and CSV/TSV (comma/tab separated value) formats.

The package is not bundled within the Ext JS framework, but is easy to require into your application. Whether you’re working with an application generated by Sencha Cmd or with an application structure of your own design, including the Exporter code only requires a couple of steps.

Note: This guide covers the exporter package bundled in the Premium version of the Ext JS 6.2+ SDK.

Requirements

Ext JS

Exporter works with both classic and modern toolkits of Sencha Ext JS 6.2.

Sencha Cmd

Sencha Cmd is not required to utilize the Exporter. However, using Cmd allows you to seamlessly include the Exporter package via your application’s app.json file.

Installation

Using Exporter with Sencha Cmd

The Exporter is delivered with full source code that is packaged in a way that makes it easy to deploy to your application’s packages folder.

To include the Exporter in an application then simply modify your app.json file in your application root directory to require the Exporter package:

  1. {
  2. "name": "YourApp",
  3. "requires": [
  4. "exporter"
  5. ],
  6. "id": "391a5ff6-2fd8-4e10-84d3-9114e1980e2d"
  7. }

The package supports both classic and modern toolkits so there’s no need for toolkit dependent configs.

Using the Exporter without Sencha Cmd

The SDK contains a compiled version of the Exporter’s code that is available for those not using Sencha Cmd. To include the Exporter in this manner, link the following assets from your index page:

  1. {unzippedFolder}/packages/exporter/build/{toolkit}/exporter.js

Using Exporter

The package provides a grid plugin and classes that generate files which could also be used independently.

Grid plugin

It allows grid data export to various file formats available in the package.

The plugin adds two new methods to the grid component:

  • saveDocumentAs: This function will save the exported file

  • getDocumentData: Returns the export document content

Both functions accept a config object as parameter:

  • type: This is the exporter type (_defaults to excel).

  • title: Set a title to be shown above column headers in the exported document.

  • fileName: Name of the saved file.

  1. {
  2. xtype: 'grid',
  3. plugins: 'gridexporter',
  4. columns: [{
  5. dataIndex: 'value',
  6. text: 'Total',
  7. exportStyle: {
  8. format: 'Currency',
  9. alignment: {
  10. horizontal: 'Right'
  11. }
  12. }
  13. }]
  14. }
  15. // later in an event listener
  16. grid.saveDocumentAs({
  17. type: 'xlsx',
  18. title: 'My export',
  19. fileName: 'myExport.xlsx'
  20. });

The following configs are available on the grid column:

  • ignoreExport Set to true to ignore data export for that column

  • exportStyle Allows you to format the exported data on that column

The exportStyle can be defined as a single object that will be used by all available exporters:

  1. {
  2. xtype: 'datecolumn',
  3. dataIndex: 'date',
  4. text: 'Date',
  5. width: 120,
  6. exportStyle: {
  7. alignment: {
  8. horizontal: 'Right'
  9. },
  10. font: {
  11. bold: true
  12. },
  13. format: 'Short Date'
  14. }
  15. }

It could also be defined as an array of objects, each object having a “type” property that specifies the exporter to which it applies:

  1. {
  2. xtype: 'numbercolumn',
  3. dataIndex: 'price',
  4. text: 'Price',
  5. exportStyle: [{
  6. type: 'html', // used by the html exporter
  7. format: 'Currency',
  8. alignment: {
  9. horizontal: 'Right'
  10. },
  11. font: {
  12. italic: true
  13. }
  14. },{
  15. type: 'csv', // used by the csv exporter
  16. format: 'General'
  17. }]
  18. }

When the array form is used, if the first entry does not have a “type” property it will be used for exporters that don’t have a matching entry for its type.

  1. {
  2. xtype: 'numbercolumn',
  3. dataIndex: 'price',
  4. text: 'Price',
  5. exportStyle: [{
  6. // no "type" defined means this is the default
  7. format: 'Currency',
  8. alignment: {
  9. horizontal: 'Right'
  10. },
  11. font: {
  12. italic: true
  13. }
  14. },{
  15. type: 'csv', // only the CSV exporter has a special style
  16. format: 'General'
  17. }]
  18. }

Pivot Grid plugin

This plugin is part of the pivot package but uses exporters to export the data. The exportStyle config used by the grid column and described in the previous section is available on the aggregate and left axis dimensions of the pivot grid.

  1. {
  2. xtype: 'pivotgrid',
  3. plugins: 'exporter',
  4. matrix: {
  5. leftAxis: [{
  6. dataIndex: 'employee',
  7. header: 'Employee',
  8. exportStyle: {
  9. font: {
  10. bold: true
  11. }
  12. }
  13. }],
  14. aggregate: [{
  15. dataIndex: 'price',
  16. header: 'Total',
  17. aggregator: 'sum',
  18. exportStyle: {
  19. format: 'Currency',
  20. alignment: {
  21. horizontal: 'Right'
  22. },
  23. font: {
  24. italic: true
  25. }
  26. }
  27. }]
  28. // ... more configs
  29. }
  30. }

Exporters

The base class for an exporter is Ext.exporter.Base. If a new exporter is needed then a new class could be defined that extends the Base class.

  1. Ext.define('App.exporter.Pdf', {
  2. extend: 'Ext.exporter.Base',
  3. alias: 'exporter.pdf',
  4. fileName: 'export.pdf',
  5. binary: true,
  6. getContent: function(){
  7. // generate pdf content and return it back
  8. }
  9. });

The new exporter will be available for Grid and Pivot Grid Exporter plugins.

  1. // in an event listener
  2. grid.saveDocumentAs({
  3. type: 'pdf',
  4. title: 'My export',
  5. fileName: 'myExport.pdf'
  6. // ... other pdf specific configs
  7. });

There are cases when tabular data that doesn’t come from a grid panel or a pivot grid needs to be exported to a file. This could be achieved using the available exporters independently.

  1. var exporter = Ext.Factory.exporter({
  2. type: 'excel',
  3. data: {
  4. columns: [{
  5. text: 'Vacation',
  6. columns: [
  7. { text: 'Month', width: 200, style: { alignment: { horizontal: 'Right' } } },
  8. { text: 'Days', style: { format: 'General Number' } }
  9. ]
  10. }],
  11. groups: [{
  12. text: 'Employees',
  13. groups: [{
  14. text: 'Adrian',
  15. rows: [{
  16. cells: [
  17. { value: 'January' },
  18. { value: 2 }
  19. ]
  20. },{
  21. cells: [
  22. { value: 'July' },
  23. { value: 10 }
  24. ]
  25. }],
  26. summaries: [{
  27. cells: [
  28. { value: 'Total' },
  29. { value: 12 }
  30. ]
  31. }]
  32. },{
  33. text: 'John',
  34. rows: [{
  35. cells: [
  36. { value: 'March' },
  37. { value: 4 }
  38. ]
  39. },{
  40. cells: [
  41. { value: 'May' },
  42. { value: 4 }
  43. ]
  44. },{
  45. cells: [
  46. { value: 'July' },
  47. { value: 2 }
  48. ]
  49. }],
  50. summaries: [{
  51. cells: [
  52. { value: 'Total' },
  53. { value: 10 }
  54. ]
  55. }]
  56. }],
  57. summaries: [{
  58. cells: [
  59. { value: 'Grand total' },
  60. { value: 22 }
  61. ]
  62. }]
  63. }]
  64. }
  65. });
  66. // save the file
  67. exporter.saveAs().then( function() { exporter.destroy(); } );

File saving

The singleton Ext.exporter.File contains functions for file manipulation. It is used by exporters to save generated files on the end-user machine. Some modern browsers allow local file saving via Blobs but others do not support this. To solve this problem the generated file content is sent to the server and returned back with proper headers that will trigger a file download. The default server that does that is defined in Ext.exporter.File#property-url which goes to https://exporter.sencha.com but an internal server could be used instead.

Check out the server folder in the exporter package for Node and PHP implementations of a server script.