//// This code is part of Document Solutions for Word demos.// Copyright (c) MESCIUS inc. All rights reserved.//usingSystem;usingSystem.Collections.Generic;usingGrapeCity.Documents.Word;usingSystem.Globalization; namespaceDsWordWeb.Demos{// This example demonstrates the available aggregate functions that can be used with the 'calc'// report templates feature for data aggregation.// Unlike other report templates constructs, aggregates do not cause repetition of content// in the generated document. Instead, they aggregate data and insert the single resulting// value into the document.// Aggregate functions' arguments can be expressions involving data, other functions and constants.publicclassDataTplAggregates {publicGcWordDocumentCreateDocx() {// Generate a simple data source with random numeric data:var values = newList<decimal>();var rnd = Util.NewRandom();var count = rnd.Next(10, 20);for (int i = 0; i < count; ++i) values.Add(newdecimal(Math.Round((double)rnd.Next(0, 1000000) / rnd.Next(1, 100), 2))); var doc = newGcWordDocument(); doc.Body.Sections.First.PageSetup.Margin.Top = 36; doc.Body.Sections.First.PageSetup.Margin.Bottom = 36; doc.Body.Sections.First.PageSetup.Margin.Left = 36; doc.Body.Sections.First.PageSetup.Margin.Right = 36; // Add the data source: doc.DataTemplate.DataSources.Add("ds", values); // Styles and templates to show results:var numberedListTemplate = doc.ListTemplates.Add(BuiltInListTemplateId.NumberDefault, "numberedListTemplate");var bulletListTemplate = doc.ListTemplates.Add(BuiltInListTemplateId.BulletDefault, "bulletListTemplate");var exStyle = doc.Styles[BuiltInStyleId.Heading3];var resStyle = doc.Styles[BuiltInStyleId.Strong]; // Print data to be summarized:var paras = doc.Body.Paragraphs; paras.Add("Data values to aggregate:", doc.Styles[BuiltInStyleId.Heading2]);var p = paras.Add("{{#ds}}{{ds.value}}{{/ds}}", doc.Styles[BuiltInStyleId.ListParagraph]); p.ListFormat.Template = numberedListTemplate; // Print the results: paras.Add("Simple aggregates:", doc.Styles[BuiltInStyleId.Heading2]);add("{{ calc Average(ds.value) }}");add("{{ calc Count(ds.value) }}");add("{{ calc First(ds.value) }}");add("{{ calc Last(ds.value) }}");add("{{ calc Max(ds.value) }}");add("{{ calc Min(ds.value) }}");add("{{ calc Sum(ds.value) }}"); paras.Add("Aggregates on expressions:", doc.Styles[BuiltInStyleId.Heading2]);add("{{ calc Sum(ds.value / Count(ds.value)) }}");add("{{ calc Average(Pow(ds.value, 2)) }}");add("{{ calc Average(Sqrt(ds.value)) }}");add("{{ calc Sum(Iif(ds.value > 50, ds.value, 0)) }}"); // Process the templates: doc.DataTemplate.Process(CultureInfo.GetCultureInfo("en-US")); // Add a short note describing the demo at the top of the document: paras.Insert("This example demonstrates the available aggregate functions that can be used with the 'calc' " +"report templates feature for data aggregation. " +"Unlike other report templates constructs, aggregates do not cause repetition of content " +"in the generated document. Instead, they aggregate data and insert the (single) resulting " +"value into the document. " +"For example, to insert the sum of a field's values in all records of a data source, " +"the template '{{calc Sum(ds.value)}}' can be used. " +"Aggregate functions' arguments can be expressions involving data, other functions and constants. " +"The data source used in this demo is a list of random decimal values. " +"Please see this example's source code for full details.",InsertLocation.Start); paras.Insert("Report templates: calc aggregate functions", doc.Styles[BuiltInStyleId.Heading1], InsertLocation.Start); // Done:return doc; voidadd(string expr) {// \x200B is a zero-width space used to prevent template expansion: paras.Add(expr.Insert(1, "\x200B") + " : ", exStyle).ListFormat.Template = bulletListTemplate; paras.Last.GetRange().Runs.Add(expr, resStyle); } } }}