UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

276 lines (262 loc) • 11.1 kB
/** * DevExtreme (exporter/exceljs/exportDataGrid.js) * Version: 19.2.6 * Build date: Thu Jan 30 2020 * * Copyright (c) 2012 - 2020 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports._getFullOptions = exports.MAX_EXCEL_COLUMN_WIDTH = exports.exportDataGrid = void 0; var _type = require("../../core/utils/type"); var _excel_format_converter = require("../excel_format_converter"); var _excel_format_converter2 = _interopRequireDefault(_excel_format_converter); var _message = require("../../localization/message"); var _message2 = _interopRequireDefault(_message); var _extend = require("../../core/utils/extend"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj } } var MAX_DIGIT_WIDTH_IN_PIXELS = 7; var MAX_EXCEL_COLUMN_WIDTH = 255; function exportDataGrid(options) { if (!(0, _type.isDefined)(options)) { return } var _getFullOptions2 = _getFullOptions(options), customizeCell = _getFullOptions2.customizeCell, component = _getFullOptions2.component, worksheet = _getFullOptions2.worksheet, topLeftCell = _getFullOptions2.topLeftCell, autoFilterEnabled = _getFullOptions2.autoFilterEnabled, keepColumnWidths = _getFullOptions2.keepColumnWidths, selectedRowsOnly = _getFullOptions2.selectedRowsOnly, loadPanel = _getFullOptions2.loadPanel; var initialLoadPanelOptions = (0, _extend.extend)({}, component.option("loadPanel")); if ("animation" in component.option("loadPanel")) { loadPanel.animation = null } component.option("loadPanel", loadPanel); worksheet.properties.outlineProperties = { summaryBelow: false, summaryRight: false }; var cellsRange = { from: { row: topLeftCell.row, column: topLeftCell.column }, to: { row: topLeftCell.row, column: topLeftCell.column } }; var dataProvider = component.getDataProvider(selectedRowsOnly); return new Promise(function(resolve) { dataProvider.ready().done(function() { var columns = dataProvider.getColumns(); var headerRowCount = dataProvider.getHeaderRowCount(); var dataRowsCount = dataProvider.getRowsCount(); if (keepColumnWidths) { _setColumnsWidth(worksheet, columns, cellsRange.from.column) } var mergedCells = []; var mergeRanges = []; for (var rowIndex = 0; rowIndex < dataRowsCount; rowIndex++) { var row = worksheet.getRow(cellsRange.from.row + rowIndex); _exportRow(rowIndex, columns.length, row, cellsRange.from.column, dataProvider, customizeCell, headerRowCount, mergedCells, mergeRanges); if (rowIndex >= headerRowCount) { row.outlineLevel = dataProvider.getGroupLevel(rowIndex) } if (rowIndex >= 1) { cellsRange.to.row++ } } _mergeCells(worksheet, topLeftCell, mergeRanges); cellsRange.to.column += columns.length > 0 ? columns.length - 1 : 0; var worksheetViewSettings = worksheet.views[0] || {}; if (component.option("rtlEnabled")) { worksheetViewSettings.rightToLeft = true } if (headerRowCount > 0) { if (Object.keys(worksheetViewSettings).indexOf("state") === -1) { (0, _extend.extend)(worksheetViewSettings, { state: "frozen", ySplit: cellsRange.from.row + dataProvider.getFrozenArea().y - 1 }) } _setAutoFilter(dataProvider, worksheet, component, cellsRange, autoFilterEnabled) } if (Object.keys(worksheetViewSettings).length > 0) { worksheet.views = [worksheetViewSettings] } resolve(cellsRange) }).always(function() { component.option("loadPanel", initialLoadPanelOptions) }) }) } function _getFullOptions(options) { var fullOptions = (0, _extend.extend)({}, options); if (!(0, _type.isDefined)(fullOptions.topLeftCell)) { fullOptions.topLeftCell = { row: 1, column: 1 } } if (!(0, _type.isDefined)(fullOptions.keepColumnWidths)) { fullOptions.keepColumnWidths = true } if (!(0, _type.isDefined)(fullOptions.selectedRowsOnly)) { fullOptions.selectedRowsOnly = false } if (!(0, _type.isDefined)(fullOptions.loadPanel)) { fullOptions.loadPanel = {} } if (!(0, _type.isDefined)(fullOptions.loadPanel.enabled)) { fullOptions.loadPanel.enabled = true } if (!(0, _type.isDefined)(fullOptions.loadPanel.text)) { fullOptions.loadPanel.text = _message2.default.format("dxDataGrid-exporting") } if (!(0, _type.isDefined)(fullOptions.autoFilterEnabled) && (0, _type.isDefined)(fullOptions.component)) { fullOptions.autoFilterEnabled = !!fullOptions.component.option("export.excelFilterEnabled") } return fullOptions } function _exportRow(rowIndex, cellCount, row, startColumnIndex, dataProvider, customizeCell, headerRowCount, mergedCells, mergeRanges) { var styles = dataProvider.getStyles(); for (var cellIndex = 0; cellIndex < cellCount; cellIndex++) { var cellData = dataProvider.getCellData(rowIndex, cellIndex, true); var gridCell = cellData.cellSourceData; var excelCell = row.getCell(startColumnIndex + cellIndex); excelCell.value = cellData.value; if ((0, _type.isDefined)(excelCell.value)) { var _styles$dataProvider$ = styles[dataProvider.getStyleId(rowIndex, cellIndex)], bold = _styles$dataProvider$.bold, alignment = _styles$dataProvider$.alignment, wrapText = _styles$dataProvider$.wrapText, format = _styles$dataProvider$.format, dataType = _styles$dataProvider$.dataType; var numberFormat = _tryConvertToExcelNumberFormat(format, dataType); if ((0, _type.isDefined)(numberFormat)) { numberFormat = numberFormat.replace(/&quot;/g, "") } else { if ((0, _type.isString)(excelCell.value) && /^[@=+-]/.test(excelCell.value)) { numberFormat = "@" } } _setNumberFormat(excelCell, numberFormat); _setFont(excelCell, bold); _setAlignment(excelCell, wrapText, alignment) } if ((0, _type.isDefined)(customizeCell)) { customizeCell({ cell: excelCell, excelCell: excelCell, gridCell: gridCell }) } if (rowIndex < headerRowCount) { var mergeRange = _tryGetMergeRange(rowIndex, cellIndex, mergedCells, dataProvider); if ((0, _type.isDefined)(mergeRange)) { mergeRanges.push(mergeRange) } } } } function _setAutoFilter(dataProvider, worksheet, component, cellsRange, autoFilterEnabled) { if (autoFilterEnabled) { if (!(0, _type.isDefined)(worksheet.autoFilter) && dataProvider.getRowsCount() > 0) { worksheet.autoFilter = cellsRange } } } function _setNumberFormat(excelCell, numberFormat) { excelCell.numFmt = numberFormat } function _tryConvertToExcelNumberFormat(format, dataType) { var newFormat = _formatObjectConverter(format, dataType); var currency = newFormat.currency; format = newFormat.format; dataType = newFormat.dataType; return _excel_format_converter2.default.convertFormat(format, newFormat.precision, dataType, currency) } function _formatObjectConverter(format, dataType) { var result = { format: format, precision: format && format.precision, dataType: dataType }; if ((0, _type.isObject)(format)) { return (0, _extend.extend)(result, format, { format: format.formatter || format.type, currency: format.currency }) } return result } function _setFont(excelCell, bold) { if ((0, _type.isDefined)(bold)) { excelCell.font = excelCell.font || {}; excelCell.font.bold = bold } } function _setAlignment(excelCell, wrapText, horizontalAlignment) { excelCell.alignment = excelCell.alignment || {}; if ((0, _type.isDefined)(wrapText)) { excelCell.alignment.wrapText = wrapText } if ((0, _type.isDefined)(horizontalAlignment)) { excelCell.alignment.horizontal = horizontalAlignment } } function _setColumnsWidth(worksheet, columns, startColumnIndex) { if (!(0, _type.isDefined)(columns)) { return } for (var i = 0; i < columns.length; i++) { var columnWidth = columns[i].width; if ("number" === typeof columnWidth && isFinite(columnWidth)) { worksheet.getColumn(startColumnIndex + i).width = Math.min(MAX_EXCEL_COLUMN_WIDTH, Math.floor(columnWidth / MAX_DIGIT_WIDTH_IN_PIXELS * 100) / 100) } } } function _tryGetMergeRange(rowIndex, cellIndex, mergedCells, dataProvider) { if (!mergedCells[rowIndex] || !mergedCells[rowIndex][cellIndex]) { var cellMerge = dataProvider.getCellMerging(rowIndex, cellIndex); if (cellMerge.colspan || cellMerge.rowspan) { for (var i = rowIndex; i <= rowIndex + cellMerge.rowspan || 0; i++) { for (var j = cellIndex; j <= cellIndex + cellMerge.colspan || 0; j++) { if (!mergedCells[i]) { mergedCells[i] = [] } mergedCells[i][j] = true } } return { start: { row: rowIndex, column: cellIndex }, end: { row: rowIndex + (cellMerge.rowspan || 0), column: cellIndex + (cellMerge.colspan || 0) } } } } } function _mergeCells(worksheet, topLeftCell, mergeRanges) { mergeRanges.forEach(function(mergeRange) { worksheet.mergeCells(mergeRange.start.row + topLeftCell.row, mergeRange.start.column + topLeftCell.column, mergeRange.end.row + topLeftCell.row, mergeRange.end.column + topLeftCell.column) }) } exports.exportDataGrid = exportDataGrid; exports.MAX_EXCEL_COLUMN_WIDTH = MAX_EXCEL_COLUMN_WIDTH; exports._getFullOptions = _getFullOptions;