DataTplCalcOps.cs
C# VB
//// This code is part of Document Solutions for Word demos.// Copyright (c) MESCIUS inc. All rights reserved.//using System;using System.Globalization;using GrapeCity.Documents.Word;
namespace DsWordWeb.Demos{ // This example demonstrates the available binary and unary operators // that can be used with the 'calc' report templates feature // to perform various operations on data. // For example, to insert the remainder of the division of two data fields, // the template '{{calc ds.a Mod ds.b)}}' can be used. // The data source used in this demo contains a single record // with random decimal and string values. public class DataTplCalcOps { public GcWordDocument CreateDocx() { var rnd = Util.NewRandom(); decimal next() { return new decimal(Math.Round((double)rnd.Next(1, 1000000) / rnd.Next(1, 100), 2)); }
// Generate a sample data source with a single record of random data: var data = new[] { new { a = next(), b = next(), ta = Util.LoremIpsumWord(), tb = Util.LoremIpsumWord() }, };
var doc = new GcWordDocument();
// Add the data source: doc.DataTemplate.DataSources.Add("ds", data); var paras = doc.Body.Paragraphs;
// Styles and templates to show results: var bulletListTemplate = doc.ListTemplates.Add(BuiltInListTemplateId.BulletDefault, "bulletListTemplate"); var exStyle = doc.Styles[BuiltInStyleId.Heading3]; exStyle.ParagraphFormat.TabStops.Add(130); exStyle.ParagraphFormat.TabStops.Add(260); var resStyle = doc.Styles[BuiltInStyleId.Strong];
add("Data", "{{ds.a}}"); add("Data", "{{ds.b}}"); add("Data", "{{ds.ta}}"); add("Data", "{{ds.tb}}");
add("Add", "{{calc ds.a + ds.b}}"); add("Subtract", "{{calc ds.a - ds.b}}"); add("Multiply", "{{calc ds.a * ds.b}}"); add("Divide", "{{calc ds.a / ds.b}}"); add("Modulus", "{{calc ds.a Mod ds.b}}"); add("Concatenate", "{{calc ds.ta & ds.tb}}"); add("Equal", "{{calc ds.a = ds.b}}"); add("Not equal", "{{calc ds.a <> ds.b}}"); add("Greater than", "{{calc ds.a > ds.b}}"); add("Greater or equal", "{{calc ds.a >= ds.b}}"); add("Less than", "{{calc ds.a < ds.b}}"); add("Less or equal", "{{calc ds.a <= ds.b}}"); add("Logical And", "{{calc ds.a And ds.b}}"); add("Logical Or", "{{calc ds.a Or ds.b}}"); add("Logical Not", "{{calc Not ds.a}}");
// 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 binary and unary operators " + "that can be used with the 'calc' report templates feature " + "to perform various operations on data." + "For example, to insert the remainder of the division of two data fields, " + "the template '{{calc ds.a Mod ds.b)}}' can be used. " + "The data source used in this demo contains a single record " + "with random decimal and string values. " + "Please see this example's source code for full details.", InsertLocation.Start); paras.Insert("Report templates: calc operators", doc.Styles[BuiltInStyleId.Heading1], InsertLocation.Start);
// Done: return doc;
void add(string caption, string expr) { // \x200B is a zero-width space used to prevent template expansion: paras.Add(caption + "\t" + expr.Insert(1, "​​​\x200B") + ":\t", exStyle).ListFormat.Template = bulletListTemplate; paras.Last.GetRange().Runs.Add(expr, resStyle); } } }}