"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var XLSX = require("xlsx");
var DataTable_1 = require("./DataTable");
var WorkBook = (function () {
function WorkBook() {
}
return WorkBook;
}());
var WorkSheet = (function () {
function WorkSheet() {
}
return WorkSheet;
}());
/** Default constructor
* @class DataTableXlsSerializer
* @classdesc Saves and loads a {@link DataTable} object to and from a MS Excel file (xlsx).
* When reading from an Excel file, the data is taken from the first sheet in the workbook.
* It is assumed that the first row contains the column names.
* When serializing, the name of the sheet containing the data will be the name in the DataTable object.
*/
var DataTableXlsSerializer = (function () {
function DataTableXlsSerializer() {
this.extension = "xlsx";
}
/** Serializes the specified {@link DataTable} object into a Buffer data.
* @method DataTableXlsSerializer#serialize
*/
DataTableXlsSerializer.prototype.serialize = function (dataTable) {
var wb = new WorkBook();
var ws = new WorkSheet();
wb.Sheets = {};
var sheetName = dataTable.name || "DynamicsNode";
wb.Sheets[sheetName] = ws;
wb.SheetNames = [sheetName];
// Holds the list of columns in the dataTable
var columnNames = [];
for (var rowIndex = 0; rowIndex < dataTable.rows.length; rowIndex++) {
var row = dataTable.rows[rowIndex];
for (var colName in row) {
if (row.hasOwnProperty(colName)) {
var colValue = row[colName];
if (colValue !== null) {
var colIndex = this.getColIndex(colName, columnNames);
var cellRef = XLSX.utils.encode_cell({ c: colIndex, r: rowIndex + 1 });
var cellType = this.getCellType(colValue);
// convert to milliseconds
var isDate = colValue instanceof Date;
if (isDate)
colValue = colValue.valueOf();
var cell = { v: colValue, t: cellType };
if (isDate)
cell.z = XLSX.SSF._table[14];
ws[cellRef] = cell;
}
}
}
}
// add the column names
for (var colIndex = 0; colIndex < columnNames.length; colIndex++) {
var columnName = columnNames[colIndex];
var cellRef = XLSX.utils.encode_cell({ c: colIndex, r: 0 });
var cell = { v: columnName, t: 's' };
ws[cellRef] = cell;
}
var range;
var encodedRange;
var rangeColumnsTo = columnNames.length > 0 ? columnNames.length - 1 : 0;
var rangeRowsTo = dataTable.rows.length;
if (rangeColumnsTo == 0 && rangeRowsTo == 0) {
encodedRange = "A1:A1";
}
else {
range = { e: { c: 0, r: 0 }, s: { c: rangeColumnsTo, r: rangeRowsTo } };
encodedRange = XLSX.utils.encode_range(range.e, range.s);
}
ws['!ref'] = encodedRange;
var serialized = XLSX.write(wb, { bookType: 'xlsx', type: 'buffer' });
return serialized;
};
DataTableXlsSerializer.prototype.getCellType = function (value) {
var type = 's';
if (typeof value === 'number') {
type = 'n';
}
else if (typeof value === 'boolean') {
type = 'b';
}
else if (value instanceof Date) {
type = 'n';
}
return type;
};
/** Gets the index of the column. If it doesn't exist, it adds it to the columns array */
DataTableXlsSerializer.prototype.getColIndex = function (colName, columns) {
var index = columns.indexOf(colName);
if (index == -1) {
columns.push(colName);
index = columns.length - 1;
}
return index;
};
/** Deserializes the specified buffer data into a {@link DataTable} object
* @method DataTableXlsSerializer#deserialize
*/
DataTableXlsSerializer.prototype.deserialize = function (data) {
var dt = new DataTable_1.DataTable();
var workBook = XLSX.read(data);
var sheetName = workBook.SheetNames[0];
var workSheet = workBook.Sheets[sheetName];
dt.name = sheetName;
var rangeName = workSheet["!ref"];
var range = XLSX.utils.decode_range(rangeName);
var from = range.s, to = range.e;
// Assume the firs row contains column names
// TODO: Make this optional
for (var rowIndex = from.r + 1, tableRowIndex = 0; rowIndex <= to.r; rowIndex++, tableRowIndex++) {
var row = {};
for (var colIndex = from.c, tableColIndex = 0; colIndex <= to.c; colIndex++, tableColIndex++) {
// Get the column name
var nameColRange = XLSX.utils.encode_cell({ r: from.r, c: colIndex });
var colName = workSheet[nameColRange];
var currentRange = XLSX.utils.encode_cell({ r: rowIndex, c: colIndex });
var colValue = workSheet[currentRange];
if (colName !== undefined && colName.v !== null && colName.v !== null &&
colValue !== undefined && colValue.v !== undefined && colValue.v !== null) {
row[colName.v] = colValue.v;
}
}
dt.rows.push(row);
}
return dt;
};
return DataTableXlsSerializer;
}());
exports.DataTableXlsSerializer = DataTableXlsSerializer;
//# sourceMappingURL=DataTableXlsSerializer.js.map