/
exportFile.js
executable file
·159 lines (142 loc) · 4.82 KB
/
exportFile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
import BasePlugin from '../_base';
import { registerPlugin } from '../../plugins';
import DataProvider from './dataProvider';
import typeFactory, { EXPORT_TYPES } from './typeFactory';
/**
* @plugin ExportFile
*
* @description
* The plugin enables exporting table data to file. It allows to export data as a string, blob or a downloadable file in
* CSV format.
*
* See [the export file demo](https://docs.handsontable.com/demo-export-file.html) for examples.
*
* @example
* ```js
* const container = document.getElementById('example');
* const hot = new Handsontable(container, {
* data: getData()
* });
*
* // access to exportFile plugin instance
* const exportPlugin = hot.getPlugin('exportFile');
*
* // export as a string
* exportPlugin.exportAsString('csv');
*
* // export as a blob object
* exportPlugin.exportAsBlob('csv');
*
* // export to downloadable file (named: MyFile.csv)
* exportPlugin.downloadFile('csv', {filename: 'MyFile'});
*
* // export as a string (with specified data range):
* exportPlugin.exportAsString('csv', {
* exportHiddenRows: true, // default false
* exportHiddenColumns: true, // default false
* columnHeaders: true, // default false
* rowHeaders: true, // default false
* columnDelimiter: ';', // default ','
* range: [1, 1, 6, 6] // [startRow, endRow, startColumn, endColumn]
* });
* ```
*/
class ExportFile extends BasePlugin {
/**
* Checks if the plugin is enabled in the handsontable settings. This method is executed in {@link Hooks#beforeInit}
* hook and if it returns `true` than the {@link ExportFile#enablePlugin} method is called.
*
* @returns {Boolean}
*/
isEnabled() {
return true;
}
/**
* @typedef ExportOptions
* @memberof ExportFile
* @type {object}
* @property {boolean} [exportHiddenRows=false] Include hidden rows in the exported file.
* @property {boolean} [exportHiddenColumns=false] Include hidden columns in the exported file.
* @property {boolean} [columnHeaders=false] Include column headers in the exported file.
* @property {boolean} [rowHeaders=false] Include row headers in the exported file.
* @property {string} [columnDelimiter=','] Column delimiter.
* @property {string} [range=[]] Cell range that will be exported to file.
*/
/**
* Exports table data as a string.
*
* @param {String} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
*/
exportAsString(format, options = {}) {
return this._createTypeFormatter(format, options).export();
}
/**
* Exports table data as a blob object.
*
* @param {String} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
*/
exportAsBlob(format, options = {}) {
return this._createBlob(this._createTypeFormatter(format, options));
}
/**
* Exports table data as a downloadable file.
*
* @param {String} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
*/
downloadFile(format, options = {}) {
const { rootDocument, rootWindow } = this.hot;
const formatter = this._createTypeFormatter(format, options);
const blob = this._createBlob(formatter);
const URL = (rootWindow.URL || rootWindow.webkitURL);
const a = rootDocument.createElement('a');
const name = `${formatter.options.filename}.${formatter.options.fileExtension}`;
if (a.download !== void 0) {
const url = URL.createObjectURL(blob);
a.style.display = 'none';
a.setAttribute('href', url);
a.setAttribute('download', name);
rootDocument.body.appendChild(a);
a.dispatchEvent(new MouseEvent('click'));
rootDocument.body.removeChild(a);
setTimeout(() => {
URL.revokeObjectURL(url);
}, 100);
} else if (navigator.msSaveOrOpenBlob) { // IE10+
navigator.msSaveOrOpenBlob(blob, name);
}
}
/**
* Creates and returns class formatter for specified export type.
*
* @private
* @param {String} format Export format type eq. `'csv'`.
* @param {ExportOptions} options Export options.
*/
_createTypeFormatter(format, options = {}) {
if (!EXPORT_TYPES[format]) {
throw new Error(`Export format type "${format}" is not supported.`);
}
return typeFactory(format, new DataProvider(this.hot), options);
}
/**
* Creates blob object based on provided type formatter class.
*
* @private
* @param {BaseType} typeFormatter
* @returns {Blob}
*/
_createBlob(typeFormatter) {
let formatter = null;
if (typeof Blob !== 'undefined') {
formatter = new Blob([typeFormatter.export()], {
type: `${typeFormatter.options.mimeType};charset=${typeFormatter.options.encoding}`,
});
}
return formatter;
}
}
registerPlugin('exportFile', ExportFile);
export default ExportFile;