Ejemplo n.º 1
0
        /// <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);
        }
Ejemplo n.º 2
0
        /// <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);
        }
Ejemplo n.º 3
0
        /// <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()));
        }