/// <summary> /// Returns a reference to object which allow resolve the field aggregate. /// </summary> /// <param name="field">The field.</param> /// <param name="rows">The rows.</param> /// <returns> /// A <see cref="T:iTin.Export.ComponentModel.NonTabularFormulaResolver"/> reference which allow resolve the field aggregate. /// </returns> private NonTabularFormulaResolver GetFormula(BaseDataFieldModel field, XElement[] rows) { var rowsCount = rows.Length; var attributes = rows.ToList().Attributes(); var aggregate = field.Aggregate; var formula = new NonTabularFormulaResolver(aggregate); var name = BaseDataFieldModel.GetFieldNameFrom(field); switch (field.FieldType) { #region Field: Field case KnownFieldType.Field: formula.Data = attributes.Where(attr => attr.Name.LocalName.ToUpperInvariant().Equals(name.ToUpperInvariant())).Select(n => n.Value); break; #endregion #region Field: Fixed case KnownFieldType.Fixed: var @fixed = (FixedFieldModel)field; var fixedItem = Fixed[@fixed.Pieces]; var dataList = rows.Select(row => fixedItem.DataSource = row) .Select(entries => fixedItem.ToDictionary()) .Select(entry => entry[name]); formula.Data = dataList; break; #endregion #region Field: Gap case KnownFieldType.Gap: var datalist = new List <string>(); for (var i = 0; i <= rowsCount - 1; i++) { datalist.Add(" "); } formula.Data = datalist; break; #endregion #region Field: Group case KnownFieldType.Group: var group = (GroupFieldModel)field; var values = new List <string>(); foreach (var row in rows) { group.DataSource = row; var value = group.Value.GetValue(Provider.SpecialChars); values.Add(value.FormattedValue); } formula.Data = values; break; #endregion } return(formula); }
/// <summary> /// Adds aggregate to specified table from export model. /// </summary> /// <param name="table">Destination table for headers</param> /// <param name="model">Export table model</param> /// <param name="rows">Source data for calculate the aggregate</param> /// <param name="specialChars">The special chars</param> /// <param name="aggregateLocation">The aggregate location</param> /// <returns> /// table with /// </returns> public static PdfPTable AddAggregateByLocation(this PdfPTable table, TableModel model, XElement[] rows, char[] specialChars, KnownAggregateLocation aggregateLocation) { SentinelHelper.ArgumentNull(table); SentinelHelper.ArgumentNull(model); var hasAnyAggregate = model.Fields.Any(field => field.Aggregate.Show == YesNo.Yes && field.Aggregate.Location == aggregateLocation); if (!hasAnyAggregate) { return(table); } var fix = model.Parent.Resources.Fixed; var rowsCount = rows.Length; var fields = model.Fields; var attributes = rows.Attributes().ToList(); foreach (var field in fields) { var aggregate = field.Aggregate; if (aggregate.AggregateType == KnownAggregateType.None) { continue; } var style = field.Aggregate.GetStyle(); if (field.Aggregate.Show == YesNo.Yes && field.Aggregate.Location == aggregateLocation) { var formula = new NonTabularFormulaResolver(field.Aggregate); switch (field.FieldType) { #region Field: Field case KnownFieldType.Field: BaseDataFieldModel field1 = field; formula.Data = attributes.Where( attr => attr.Name.LocalName.ToUpperInvariant() .Equals( BaseDataFieldModel.GetFieldNameFrom(field1).ToUpperInvariant())) .Select(n => n.Value); break; #endregion #region Field: Fixed case KnownFieldType.Fixed: var fixedFieldModel = (FixedFieldModel)field; var piecesModel = fix[fixedFieldModel.Pieces]; BaseDataFieldModel field2 = field; var dataList = rows.Select(row => piecesModel.DataSource = row) .Select(entries => piecesModel.ToDictionary()) .Select(entry => entry[BaseDataFieldModel.GetFieldNameFrom(field2)]); formula.Data = dataList; break; #endregion #region Field: Gap case KnownFieldType.Gap: var datalist = new List <string>(); for (var i = 0; i <= rowsCount - 1; i++) { datalist.Add(" "); } formula.Data = datalist; break; #endregion #region Field: Group case KnownFieldType.Group: var groupFieldModel = (GroupFieldModel)field; var groupDataList = new List <string>(); foreach (var row in rows) { groupFieldModel.DataSource = row; var group = groupFieldModel.Value.GetValue(specialChars); groupDataList.Add(@group.FormattedValue); } formula.Data = groupDataList; break; #endregion } table.AddCell(PdfHelper.CreateCell(style.Content.DataType.GetFormattedDataValue(formula.Resolve()))); } else { var emptyStyle = StyleModel.Empty; emptyStyle.Content = style.Content; emptyStyle.Content.DataType = new TextDataTypeModel(); ////emptyStyle.SetOwner(model.Styles); table.AddCell(PdfHelper.CreateCell(style.Content.DataType.GetFormattedDataValue(string.Empty))); } } return(table); }
/// <inheritdoc /> /// <summary> /// Generates the output in tab-separated values format. /// </summary> protected override void Execute() { // document result _documentBuilder = new StringBuilder(); // initialize var fields = Table.Fields; // get target data var rows = Service.RawDataFiltered; // get header styles var headerStyles = fields.Select(field => Resources.Styles.GetBy(field.Header.Style).Font.FontStyles).ToList(); var valueStyles = fields.Select(field => Resources.Styles.GetBy(field.Value.Style).Font.FontStyles).ToList(); var aggregateStyles = fields.Select(field => Resources.Styles.GetBy(field.Aggregate.Style).Font.FontStyles).ToList(); // Block lines var blocklines = Provider.Input.Model.BlockLines; var hasBlockLines = blocklines.Any(); if (hasBlockLines) { foreach (var blockline in blocklines) { if (blockline.Show == YesNo.No) { continue; } var keyLines = blockline.Items.Keys; foreach (var keyLine in keyLines) { var line = Resources.Lines.GetBy(keyLine); if (line.Show == YesNo.No) { continue; } var times = line.Repeat == 0 ? 1 : line.Repeat; for (var i = 1; i <= times; i++) { var lineType = line.LineType; switch (lineType) { case KnownLineType.EmptyLine: var emptyLine = (EmptyLineModel)line; if (emptyLine.Show == YesNo.No) { continue; } _documentBuilder.AppendLine(); break; case KnownLineType.TextLine: var textLine = (TextLineModel)line; var items = textLine.Items; var values = new Collection <string>(); foreach (var item in items) { if (item.Show == YesNo.No) { continue; } values.Add(item.Value); } _documentBuilder.Append($"### {string.Join("\t", values)}"); _documentBuilder.AppendLine(); break; } } } } _documentBuilder.AppendLine(); } // headers var idx = 0; _documentBuilder.Append("|"); var headerValues = fields.Select(field => field.Header.Show == YesNo.No ? string.Empty : ParseField(field.Alias)).ToList(); foreach (var fontStyle in headerStyles) { headerValues[idx] = string.Format(fontStyle.ToMarkdownStylePattern(), headerValues[idx]); idx++; } _documentBuilder.Append(string.Join("|", headerValues.ToArray())); _documentBuilder.Append("|"); _documentBuilder.Append(Table.Output.NewLineDelimiter); // data styles if (Table.ShowDataValues == YesNo.Yes) { _documentBuilder.Append("|"); var alignments = fields.Select(field => Resources.Styles.GetBy(field.Value.Style).Content.Alignment.Horizontal); foreach (var alignment in alignments) { _documentBuilder.Append(alignment.ToMarkdownTextAlignment()); _documentBuilder.Append("|"); } _documentBuilder.Append(Table.Output.NewLineDelimiter); } // data values if (Table.ShowDataValues == YesNo.Yes) { _documentBuilder.Append("|"); foreach (var row in rows) { idx = 0; var values = new Collection <string>(); foreach (var field in fields) { field.DataSource = row; var value = field.Value.GetValue(Provider.SpecialChars); var parsedValue = ParseField(value.FormattedValue); values.Add(parsedValue); } foreach (var fontStyle in valueStyles) { values[idx] = string.Format(fontStyle.ToMarkdownStylePattern(), values[idx]); idx++; } // add values. _documentBuilder.Append(string.Join("|", values.ToArray())); // new line defined in output tag. _documentBuilder.Append(Table.Output.NewLineDelimiter); } } else { _documentBuilder.Append("|"); _documentBuilder.Append(string.Join("|", fields.Select(field => "---"))); _documentBuilder.AppendLine("|"); } // add bottom aggregates var fieldsWithBottomAggregates = fields.GetRange(KnownAggregateLocation.Bottom).ToList(); var hasBottomAggregates = fieldsWithBottomAggregates.Any(); if (Table.ShowDataValues == YesNo.Yes) { if (hasBottomAggregates) { _documentBuilder.Append("|"); idx = 0; var values = new Collection <string>(); foreach (var field in fieldsWithBottomAggregates) { var aggregate = field.Aggregate; var formula = new NonTabularFormulaResolver(aggregate) { Data = rows.Select(attr => attr.Attribute(BaseDataFieldModel.GetFieldNameFrom(field)).Value) }; values.Add(formula.Resolve()); } foreach (var fontStyle in aggregateStyles) { if (string.IsNullOrEmpty(values[idx])) { idx++; continue; } values[idx] = string.Format(fontStyle.ToMarkdownStylePattern(), values[idx]); idx++; } // add values. _documentBuilder.Append(string.Join("|", values.ToArray())); // new line defined in output tag. _documentBuilder.Append(Table.Output.NewLineDelimiter); } } // end of file _documentBuilder.Append(Table.Output.EndOfFile); // add document to result list. Result.Add(Encoding.UTF8.GetBytes(_documentBuilder.ToString())); }