devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
241 lines (235 loc) • 10.3 kB
JavaScript
/**
* DevExtreme (cjs/exporter/exceljs/export_pivot_grid.js)
* Version: 24.2.6
* Build date: Mon Mar 17 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
exports.exportPivotGrid = exportPivotGrid;
var _type = require("../../core/utils/type");
var _export = require("./export");
var _position = require("../../core/utils/position");
var _inflector = require("../../core/utils/inflector");
var _export_merged_ranges_manager = require("./export_merged_ranges_manager");
function _extends() {
return _extends = Object.assign ? Object.assign.bind() : function(n) {
for (var e = 1; e < arguments.length; e++) {
var t = arguments[e];
for (var r in t) {
({}).hasOwnProperty.call(t, r) && (n[r] = t[r])
}
}
return n
}, _extends.apply(null, arguments)
}
const FIELD_HEADERS_SEPARATOR = ", ";
class PivotGridHelpers {
constructor(component, dataProvider, worksheet, options) {
this.component = component;
this.dataProvider = dataProvider;
this.worksheet = worksheet;
this.mergedRangesManager = new _export_merged_ranges_manager.MergedRangesManager(dataProvider, worksheet);
this.topLeftCell = options.topLeftCell;
this.customizeCell = options.customizeCell;
this.mergeColumnFieldValues = options.mergeColumnFieldValues;
this.mergeRowFieldValues = options.mergeRowFieldValues;
this.exportFilterFieldHeaders = options.exportFilterFieldHeaders;
this.exportDataFieldHeaders = options.exportDataFieldHeaders;
this.exportColumnFieldHeaders = options.exportColumnFieldHeaders;
this.exportRowFieldHeaders = options.exportRowFieldHeaders;
this.rtlEnabled = component.option("rtlEnabled");
this.rowHeaderLayout = component.option("rowHeaderLayout");
this.wrapText = !!component.option("wordWrapEnabled");
this.filterFieldHeaders = this._tryGetFieldHeaders("filter");
this.dataFieldHeaders = this._tryGetFieldHeaders("data");
this.columnFieldHeaders = this._tryGetFieldHeaders("column");
this.rowFieldHeaders = this._tryGetFieldHeaders("row")
}
_getFirstColumnIndex() {
return this.topLeftCell.column
}
_getWorksheetFrozenState(cellRange) {
const {
x: x,
y: y
} = this.dataProvider.getFrozenArea();
return {
state: "frozen",
xSplit: cellRange.from.column + x - 1,
ySplit: cellRange.from.row + y + this._getFieldHeaderRowsCount() - 1
}
}
_getFieldHeaderRowsCount() {
return 0 + this._allowExportFilterFieldHeaders() + (this._allowExportDataFieldHeaders() || this._allowExportColumnFieldHeaders())
}
_isFrozenZone() {
return true
}
_isHeaderCell(rowIndex, cellIndex) {
return rowIndex < this.dataProvider.getColumnAreaRowCount() || cellIndex < this.dataProvider.getRowAreaColCount()
}
_getDefaultFieldHeaderCellsData(value) {
return {
text: value,
value: value
}
}
_isInfoCell(rowIndex, cellIndex) {
return rowIndex < this.dataProvider.getColumnAreaRowCount() && cellIndex < this.dataProvider.getRowAreaColCount()
}
_allowToMergeRange(rowIndex, cellIndex, rowspan, colspan) {
return !(this.dataProvider.isColumnAreaCell(rowIndex, cellIndex) && !this.mergeColumnFieldValues && !!colspan || this.dataProvider.isRowAreaCell(rowIndex, cellIndex) && !this.mergeRowFieldValues && !!rowspan)
}
_trySetAutoFilter() {}
_trySetFont(excelCell, bold) {
if ((0, _type.isDefined)(bold)) {
excelCell.font = excelCell.font || {};
excelCell.font.bold = bold
}
}
_getFieldHeaderStyles() {
const borderStyle = {
style: "thin",
color: {
argb: "FF7E7E7E"
}
};
return {
alignment: (0, _position.getDefaultAlignment)(this.rtlEnabled),
bold: true,
border: {
bottom: borderStyle,
left: borderStyle,
right: borderStyle,
top: borderStyle
}
}
}
_trySetOutlineLevel() {}
_getAllFieldHeaders() {
return this.dataProvider._exportController.getDataSource()._descriptions
}
_tryGetFieldHeaders(area) {
if (!this[`export${(0,_inflector.camelize)(area,true)}FieldHeaders`]) {
return []
}
const fields = this._getAllFieldHeaders()["data" === area ? "values" : `${area}s`].filter((fieldHeader => fieldHeader.area === area));
if ("right" === (0, _position.getDefaultAlignment)(this.rtlEnabled)) {
fields.sort(((a, b) => b.areaIndex - a.areaIndex))
}
return fields.map((field => field.caption))
}
_customizeCell(excelCell, pivotCell, shouldPreventCall) {
if ((0, _type.isFunction)(this.customizeCell) && !shouldPreventCall) {
this.customizeCell({
excelCell: excelCell,
pivotCell: pivotCell
})
}
}
_isRowFieldHeadersRow(rowIndex) {
const isLastInfoRangeCell = this._isInfoCell(rowIndex, 0) && "row" === this.dataProvider.getCellData(rowIndex + 1, 0, true).cellSourceData.area;
return this._allowExportRowFieldHeaders() && isLastInfoRangeCell
}
_exportAllFieldHeaders(columns, setAlignment) {
const totalCellsCount = columns.length;
const rowAreaColCount = this.dataProvider.getRowAreaColCount();
let rowIndex = this.topLeftCell.row;
if (this._allowExportFilterFieldHeaders()) {
this._exportFieldHeaders("filter", rowIndex, 0, totalCellsCount, setAlignment);
rowIndex++
}
if (this._allowExportDataFieldHeaders()) {
this._exportFieldHeaders("data", rowIndex, 0, rowAreaColCount, setAlignment);
if (!this._allowExportColumnFieldHeaders()) {
this._exportFieldHeaders("column", rowIndex, rowAreaColCount, totalCellsCount - rowAreaColCount, setAlignment)
}
}
if (this._allowExportColumnFieldHeaders()) {
if (!this._allowExportDataFieldHeaders()) {
this._exportFieldHeaders("data", rowIndex, 0, rowAreaColCount, setAlignment)
}
this._exportFieldHeaders("column", rowIndex, rowAreaColCount, totalCellsCount - rowAreaColCount, setAlignment)
}
}
_exportFieldHeaders(area, rowIndex, startColumnIndex, totalColumnsCount, setAlignment) {
const fieldHeaders = this[`${area}FieldHeaders`];
const row = this.worksheet.getRow(rowIndex);
const shouldMergeHeaderField = "row" !== area || "row" === area && "tree" === this.rowHeaderLayout;
if (shouldMergeHeaderField) {
this.mergedRangesManager.addMergedRange(row.getCell(this.topLeftCell.column + startColumnIndex), 0, totalColumnsCount - 1)
}
for (let cellIndex = 0; cellIndex < totalColumnsCount; cellIndex++) {
const excelCell = row.getCell(this.topLeftCell.column + startColumnIndex + cellIndex);
const values = fieldHeaders;
let cellData = [];
const value = values.length > totalColumnsCount || shouldMergeHeaderField ? values.join(", ") : values[cellIndex];
cellData = _extends({}, this._getDefaultFieldHeaderCellsData(value), {
headerType: area
});
excelCell.value = value;
this._applyHeaderStyles(excelCell, setAlignment);
this._customizeCell(excelCell, cellData)
}
}
_applyHeaderStyles(excelCell, setAlignment) {
const {
bold: bold,
alignment: alignment,
border: border
} = this._getFieldHeaderStyles();
this._trySetFont(excelCell, bold);
setAlignment(excelCell, this.wrapText, alignment);
excelCell.border = border
}
_allowExportRowFieldHeaders() {
return this.rowFieldHeaders.length > 0
}
_allowExportFilterFieldHeaders() {
return this.filterFieldHeaders.length > 0
}
_allowExportDataFieldHeaders() {
return this.dataFieldHeaders.length > 0
}
_allowExportColumnFieldHeaders() {
return this.columnFieldHeaders.length > 0
}
}
function exportPivotGrid(options) {
return _export.Export.export(_getFullOptions(options), PivotGridHelpers, _getLoadPanelTargetElement, _getLoadPanelContainer)
}
function _getFullOptions(options) {
if (!((0, _type.isDefined)(options) && (0, _type.isObject)(options))) {
throw Error('The "exportPivotGrid" method requires a configuration object.')
}
if (!((0, _type.isDefined)(options.component) && (0, _type.isObject)(options.component) && "dxPivotGrid" === options.component.NAME)) {
throw Error('The "component" field must contain a PivotGrid instance.')
}
if (!(0, _type.isDefined)(options.mergeRowFieldValues)) {
options.mergeRowFieldValues = true
}
if (!(0, _type.isDefined)(options.mergeColumnFieldValues)) {
options.mergeColumnFieldValues = true
}
if (!(0, _type.isDefined)(options.exportDataFieldHeaders)) {
options.exportDataFieldHeaders = false
}
if (!(0, _type.isDefined)(options.exportRowFieldHeaders)) {
options.exportRowFieldHeaders = false
}
if (!(0, _type.isDefined)(options.exportColumnFieldHeaders)) {
options.exportColumnFieldHeaders = false
}
if (!(0, _type.isDefined)(options.exportFilterFieldHeaders)) {
options.exportFilterFieldHeaders = false
}
return _export.Export.getFullOptions(options)
}
function _getLoadPanelTargetElement(component) {
return component._dataArea.groupElement()
}
function _getLoadPanelContainer(component) {
return component.$element()
}