private string[] GetTextLineParts(TextColumnsDataSpecs specs, int rowIndex, int lineIndex)
        {
            var rowTextArray = new string[ColumnsCount];

            for (var columnIndex = 0; columnIndex < ColumnsCount; columnIndex++)
            {
                var columnData      = specs.LinesMatrix[columnIndex];
                var columnAlignment = GetColumnAlignment(columnIndex);
                var columnWidth     = specs.ColumnWidths[columnIndex];

                if (rowIndex >= columnData.Length)
                {
                    rowTextArray[columnIndex] = new string(' ', columnWidth);
                    continue;
                }

                var rowData      = columnData[rowIndex];
                var rowAlignment = GetRowAlignment(rowIndex);

                if (
                    (rowAlignment == TextRowAlignment.Top && lineIndex >= rowData.Length) ||
                    (rowAlignment == TextRowAlignment.Bottom && lineIndex < specs.RowHeights[rowIndex] - rowData.Length)
                    )
                {
                    rowTextArray[columnIndex] = new string(' ', columnWidth);

                    continue;
                }

                var lineText =
                    rowAlignment == TextRowAlignment.Top
                    ? rowData[lineIndex]
                    : rowData[lineIndex - (specs.RowHeights[rowIndex] - rowData.Length)];

                rowTextArray[columnIndex] =
                    columnAlignment == TextColumnAlignment.Right
                        ? lineText.PadLeft(columnWidth)
                        : lineText.PadRight(columnWidth);
            }

            return(rowTextArray);
        }
        public string GenerateText()
        {
            var tableSpecs = new TextColumnsDataSpecs(_columnsData);

            var s = new StringBuilder();

            for (var rowIndex = 0; rowIndex < tableSpecs.RowsCount; rowIndex++)
            {
                var rowHeight = tableSpecs.RowHeights[rowIndex];

                for (var lineIndex = 0; lineIndex < rowHeight; lineIndex++)
                {
                    s.AppendLine(
                        GetTextLineParts(tableSpecs, rowIndex, lineIndex)
                        .Concatenate(ColumnSeparator ?? string.Empty)
                        );
                }
            }

            s.Length -= Environment.NewLine.Length;

            return(s.ToString());
        }