protected virtual void DoNewPivot(object dataSource, PivotOptions options) { options ??= new PivotOptions(); var spread = options.Spreadsheet?.Workbook ?? Workbook; PivotTable pivotTable; using (new UsingProcessor(() => spread.BeginUpdate(), () => spread.EndUpdate())) { //Disable automatic show of pivot table field list. spread.DocumentSettings.ShowPivotTableFieldList = false; var table = FindDataTable(); Worksheet pivotSheet = null; if (!string.IsNullOrWhiteSpace(options.PivotSheetName)) { for (int i = 0; i < spread.Worksheets.Count; i++) { var sheet = spread.Worksheets[i]; if (string.Compare(sheet.Name, options.PivotSheetName, true) == 0) { if (options.Replace) { spread.Worksheets.RemoveAt(i); var newSheet = spread.Worksheets.Insert(i, options.PivotSheetName); pivotSheet = newSheet; } else { throw new Exception($"Cannot create pivot sheet table: sheet '{options.PivotSheetName}' already exists."); } break; } } } if (pivotSheet == null) { pivotSheet = spread.Worksheets.Add(options.PivotSheetName); } pivotTable = pivotSheet.PivotTables.Add(table.Range, pivotSheet[0, 0], options.PivotTableName); using (new UsingProcessor(() => pivotTable.BeginUpdate(), () => pivotTable.EndUpdate())) { if (options.RowFields != null && options.RowFields.Length > 0) { foreach (var fieldName in options.RowFields) { pivotTable.RowFields.Add(pivotTable.Fields[fieldName]); } } if (options.ColumnFields != null && options.ColumnFields.Length > 0) { foreach (var fieldName in options.ColumnFields) { pivotTable.ColumnFields.Add(pivotTable.Fields[fieldName]); } } if (options.PageFields != null && options.PageFields.Length > 0) { foreach (var fieldName in options.PageFields) { pivotTable.PageFields.Add(pivotTable.Fields[fieldName]); } } if (options.DataFields != null && options.DataFields.Length > 0) { foreach (var fieldName in options.DataFields) { pivotTable.DataFields.Add(pivotTable.Fields[fieldName]); } } if (options.CalculatedRowFields != null && options.CalculatedRowFields.Length > 0) { foreach (var fieldDefinition in options.CalculatedRowFields) { var calcField = AddCalculatedField(pivotTable, fieldDefinition); pivotTable.RowFields.Add(calcField); } } if (options.CalculatedColumnFields != null && options.CalculatedColumnFields.Length > 0) { foreach (var fieldDefinition in options.CalculatedColumnFields) { var calcField = AddCalculatedField(pivotTable, fieldDefinition); pivotTable.ColumnFields.Add(calcField); } } if (options.CalculatedPageFields != null && options.CalculatedPageFields.Length > 0) { foreach (var fieldDefinition in options.CalculatedPageFields) { var calcField = AddCalculatedField(pivotTable, fieldDefinition); pivotTable.PageFields.Add(calcField); } } if (options.CalculatedDataFields != null && options.CalculatedDataFields.Length > 0) { foreach (var fieldDefinition in options.CalculatedDataFields) { var calcField = AddCalculatedField(pivotTable, fieldDefinition); pivotTable.DataFields.Add(calcField); } } if (options.RowFieldNumberFormats != null && options.RowFieldNumberFormats.Length > 0) { for (int i = 0; i < Math.Min(options.RowFieldNumberFormats.Length, pivotTable.RowFields.Count); i++) { pivotTable.RowFields[i].Field.NumberFormat = options.RowFieldNumberFormats[i]; } } if (options.ColumnFieldNumberFormats != null && options.ColumnFieldNumberFormats.Length > 0) { for (int i = 0; i < Math.Min(options.ColumnFieldNumberFormats.Length, pivotTable.ColumnFields.Count); i++) { pivotTable.ColumnFields[i].Field.NumberFormat = options.ColumnFieldNumberFormats[i]; } } if (options.PageFieldNumberFormats != null && options.PageFieldNumberFormats.Length > 0) { for (int i = 0; i < Math.Min(options.PageFieldNumberFormats.Length, pivotTable.PageFields.Count); i++) { pivotTable.PageFields[i].Field.NumberFormat = options.PageFieldNumberFormats[i]; } } if (options.DataFieldNumberFormats != null && options.DataFieldNumberFormats.Length > 0) { for (int i = 0; i < Math.Min(options.DataFieldNumberFormats.Length, pivotTable.DataFields.Count); i++) { pivotTable.DataFields[i].Field.NumberFormat = options.DataFieldNumberFormats[i]; } } if (options.ShowValuesAs != null && options.ShowValuesAs.Length > 0) { for (int i = 0; i < Math.Min(options.ShowValuesAs.Length, pivotTable.DataFields.Count); i++) { var baseFieldName = options.ShowValuesAsBaseFields != null && i < options.ShowValuesAsBaseFields.Length ? options.ShowValuesAsBaseFields[i] : null; var baseType = options.ShowValuesAsBaseTypes != null && i < options.ShowValuesAsBaseTypes.Length ? options.ShowValuesAsBaseTypes[i] : PivotShowValueAsItemType.Previous; var baseField = !string.IsNullOrWhiteSpace(baseFieldName) ? pivotTable.Fields[baseFieldName] : null; if (!string.IsNullOrWhiteSpace(baseFieldName) && baseField == null) { throw new Exception($"Cannot configure pivot table: cannot find base field '{baseFieldName}'."); } var dataField = pivotTable.DataFields[i]; dataField.ShowValuesWithCalculation((DevExpress.Spreadsheet.PivotShowValuesAsType)options.ShowValuesAs[i], baseField, (PivotBaseItemType)(int)baseType); } } if (options.SummarizeValuesBy != null && options.SummarizeValuesBy.Length > 0) { for (int i = 0; i < Math.Min(options.SummarizeValuesBy.Length, pivotTable.DataFields.Count); i++) { pivotTable.DataFields[i].SummarizeValuesBy = (DevExpress.Spreadsheet.PivotDataConsolidationFunction)options.SummarizeValuesBy[i]; } } pivotTable.Layout.SetReportLayout((DevExpress.Spreadsheet.PivotReportLayout)(options.Layout ?? PivotReportLayout.Compact)); if (options.CompactNewFields) { pivotTable.Layout.CompactNewFields = true; } if (options.DataOnRows) { pivotTable.Layout.DataOnRows = true; } if (options.IndentInCompactForm.HasValue) { pivotTable.Layout.IndentInCompactForm = options.IndentInCompactForm.Value; } if (options.MergeTitles) { pivotTable.Layout.MergeTitles = true; } if (options.OutlineNewFields) { pivotTable.Layout.OutlineNewFields = true; } if (options.PageOrder.HasValue) { pivotTable.Layout.PageOrder = (DevExpress.Spreadsheet.PivotPageOrder)options.PageOrder.Value; } if (options.PageWrap.HasValue) { pivotTable.Layout.PageWrap = options.PageWrap.Value; } if (options.HideAllSubtotals) { pivotTable.Layout.HideAllSubtotals(); pivotTable.Layout.ShowColumnGrandTotals = false; pivotTable.Layout.ShowRowGrandTotals = false; } if (options.HideColumnGrandTotals) { pivotTable.Layout.ShowColumnGrandTotals = false; } if (options.HideRowGrandTotals) { pivotTable.Layout.ShowRowGrandTotals = false; } if (options.SubtotalIncludeHiddenItems) { pivotTable.Layout.SubtotalIncludeHiddenItems = true; } if (options.HideColumnHeaders) { pivotTable.ShowColumnHeaders = false; } if (options.HideRowHeaders) { pivotTable.ShowRowHeaders = false; } if (options.Style != PivotTableStyleId.None) { pivotTable.Style = spread.TableStyles[(BuiltInPivotStyleId)options.Style]; } if (options.AltTextDescription != null) { pivotTable.View.AltTextDescription = options.AltTextDescription; } if (options.AltTextTitle != null) { pivotTable.View.AltTextTitle = options.AltTextTitle; } if (options.ColumnHeaderCaption != null) { pivotTable.View.ColumnHeaderCaption = options.ColumnHeaderCaption; } if (options.DataCaption != null) { pivotTable.View.DataCaption = options.DataCaption; } if (options.ErrorCaption != null) { pivotTable.View.ErrorCaption = options.ErrorCaption; } if (options.GrandTotalCaption != null) { pivotTable.View.GrandTotalCaption = options.GrandTotalCaption; } if (options.MissingCaption != null) { pivotTable.View.MissingCaption = options.MissingCaption; } if (options.RowHeaderCaption != null) { pivotTable.View.RowHeaderCaption = options.RowHeaderCaption; } if (options.HideDrillIndicators) { pivotTable.View.ShowDrillIndicators = false; } if (options.ShowError) { pivotTable.View.ShowError = true; } if (options.HideFieldHeaders) { pivotTable.View.ShowFieldHeaders = false; } if (options.HideMissing) { pivotTable.View.ShowMissing = false; } if (options.HideMultipleLabels) { pivotTable.View.ShowMultipleLabels = false; } if (options.HideValuesRow) { pivotTable.View.ShowValuesRow = false; } if (options.AllowMultipleFieldFilters) { pivotTable.Behavior.AllowMultipleFieldFilters = true; } if (options.DontAutoFitColumns) { pivotTable.Behavior.AutoFitColumns = false; } } if (!string.IsNullOrWhiteSpace(options.Formatting)) { var scanner = new Scanner(); var parser = new Parser(scanner); var tree = parser.Parse(options.Formatting); if (tree.Errors.Count > 0) { var strErrors = new StringBuilder(); foreach (var error in tree.Errors) { if (strErrors.Length > 0) { strErrors.AppendLine(); } strErrors.Append(error.Message); } throw new Exception(strErrors.ToString()); } List <BaseCommand> commands = null; try { commands = tree.Eval() as List <BaseCommand>; } catch (Exception) { //Do nothing, skip invalid commands } if (commands != null) { var formatRange = pivotTable.Location.DataRange; var gridFormatConditions = GridData.LoadGridFormatConditions(commands); foreach (var gridFormatCondition in gridFormatConditions) { SpreadsheetUtils.ApplyGridFormatCondition(pivotSheet, gridFormatCondition, formatRange); } } } } CopyRangeToBook(options.CopyToBookDataOnly ? pivotTable.Location.DataRange : pivotTable.Location.Range, options); AddComments(pivotTable.Location.WholeRange, options.Comment); DevExpress.Spreadsheet.Table FindDataTable() { Worksheet sheet = null; DevExpress.Spreadsheet.Table table = null; if (!string.IsNullOrWhiteSpace(options.DataSheetName)) { sheet = spread.Worksheets[options.DataSheetName]; if (sheet == null) { throw new Exception($"Cannot find sheet '{options.DataSheetName}'."); } } if (!string.IsNullOrWhiteSpace(options.DataTableName)) { if (sheet != null) { table = sheet.Tables.Where(t => string.Compare(t.Name, options.DataTableName, true) == 0).FirstOrDefault(); } else { foreach (var worksheet in spread.Worksheets) { table = worksheet.Tables.Where(t => string.Compare(t.Name, options.DataTableName, true) == 0).FirstOrDefault(); if (table != null) { break; } } } } if (table == null) { throw new Exception($"Cannot find table '{options.DataTableName}'."); } return(table); }
public SCSpreadsheet NewPivot(object dataSource, PivotOptions options = null) { ExecuteSynchronized(options, () => DoNewPivot(dataSource, options)); return(this); }