{"id":15011701,"url":"https://github.com/robthree/texttablebuilder","last_synced_at":"2026-03-15T04:33:34.974Z","repository":{"id":69245928,"uuid":"479591673","full_name":"RobThree/TextTableBuilder","owner":"RobThree","description":"Simple, opinionated, modern table builder","archived":false,"fork":false,"pushed_at":"2024-03-07T12:55:38.000Z","size":71,"stargazers_count":13,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-25T23:34:56.270Z","etag":null,"topics":["console","console-table","csharp","dotnet","netstandard","nuget-package","table","text","text-table"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/RobThree.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null},"funding":{"github":["RobThree"],"custom":["https://paypal.me/robiii"]}},"created_at":"2022-04-09T02:03:16.000Z","updated_at":"2025-03-04T14:22:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"2fc1824a-d2da-48d9-92a3-3cf83a01b1c6","html_url":"https://github.com/RobThree/TextTableBuilder","commit_stats":{"total_commits":46,"total_committers":2,"mean_commits":23.0,"dds":0.4782608695652174,"last_synced_commit":"8bcd3c62c707960b6b9f70be97a9bd436d81751a"},"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobThree%2FTextTableBuilder","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobThree%2FTextTableBuilder/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobThree%2FTextTableBuilder/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/RobThree%2FTextTableBuilder/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/RobThree","download_url":"https://codeload.github.com/RobThree/TextTableBuilder/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248512797,"owners_count":21116681,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["console","console-table","csharp","dotnet","netstandard","nuget-package","table","text","text-table"],"created_at":"2024-09-24T19:41:28.432Z","updated_at":"2026-03-15T04:33:34.925Z","avatar_url":"https://github.com/RobThree.png","language":"C#","readme":"﻿# ![logo](https://raw.githubusercontent.com/RobThree/TextTableBuilder/master/logo.png) TextTableBuilder\n\n![Build Status](https://img.shields.io/github/actions/workflow/status/RobThree/IPNetworkHelper/test.yml?branch=main\u0026style=flat-square) [![Nuget version](https://img.shields.io/nuget/v/TextTableBuilder.svg?style=flat-square)](https://www.nuget.org/packages/TextTableBuilder/)\n\nA simple, opinionated, modern table builder. Supports configuring how different datatypes will be formatted. Available as [Nuget package](https://www.nuget.org/packages/TextTableBuilder/)\n\n## Quickstart\n\n```c#\n// Create table\nvar table = new Table();\ntable.AddColumn(\"No\")\n    .AddColumn(\"Name\")\n    .AddColumn(\"Position\")\n    .AddColumn(\"Salary\", Align.Right, Align.Right)  // Align column header and values to the right\n    .AddRow(1, \"Bill Gates\", \"Founder Microsoft\", 10000)\n    .AddRow(2, \"Steve Jobs\", \"Founder Apple\", 1200000)\n    .AddRow(3, \"Larry Page\", \"Founder Google\", 1100000)\n    .AddRow(4, \"Mark Zuckerberg\", \"Founder Facebook\", 1300000);\n\n// Use TableBuilder to render table\nvar tablebuilder = new TableBuilder();\nConsole.WriteLine(tablebuilder.Build(table));\n```\n\n```cmd\nNo | Name            | Position          |    Salary\n-- | --------------- | ----------------- | ---------\n1  | Bill Gates      | Founder Microsoft |    10,000\n2  | Steve Jobs      | Founder Apple     | 1,200,000\n3  | Larry Page      | Founder Google    | 1,100,000\n4  | Mark Zuckerberg | Founder Facebook  | 1,300,000\n```\n\nThere are more [examples below](#examples).\n\n## Convenience methods\n\n### Columns\n\nAn easier, quicker way to add columns is to invoke `AddColumns()`. By passing an array of column names all columns can be specified in one call:\n\n```c#\nvar table = new Table()\n    .AddColumns(new[] { \"No.\", \"Name\", \"Position\", \"^Salary^\" })\n    .AddRow(1, \"Bill Gates\", \"Founder Microsoft\", 10000)\n    // etc...\n```\n\nFor aligning columns, see [Aligning columns and values](#aligning-columns-and-values).\n\n### Rows\n\nRows can be added in three ways:\n\n1. `AddRow(Row row)`\\\n    Either pass a `ValueRow` or `ObjectRow`\n2. `AddRow(params object[] values)`\\\n    Pass all values (e.g. `.AddRow(\"foo\", 123, \"bar)`)\n3. `AddRow\u003cT\u003e(value)`\\\n    Pass an object (e.g `.AddRow\u003cCustomer\u003e(paul)`) (see [Type handling](#type-handling))\n\nMethod 2 adds a `ValueRow` to the table whereas method 3 adds an `ObjectRow` to the table. Method 1 is provided only for completeness' sake.\n\nFor aligning row values, see [Aligning columns and values](#aligning-columns-and-values).\n\n## Aligning columns and values\n\nColumnames can be prefixed and suffixed with:\n\n* `^` Align right\n* `~` Align center\n\nWhen a columnname is specified as `\"^Salary\"`, the column name will be right aligned, the values will default to left. When the name is specified as `\"Salary^\"` the column values will be right aligned, the column name itself will default to left aligned. And, finally, when the name is specified as `\"^Salary^\"` then both the column name and values will be right aligned.\n\nIf you want more control over a column you'll need to use the `AddColumn()` method which allows you to specify a minimum / fixed width for the column as well as a `TypeHandler` (see [Type Handling](#type-handling)).\n\n## Column widths\n\nA column, by default, simply stretches to be wide enough to contain all values in that column. You can, however, specify a minimum width (`MinWidth`) or a width (`Width`). The `MinWidth` ensures the column is always at least the number of specified characters wide, but may be wider when the column contains longer values. The `Width` ensures a column is always exactly the specified width. Longer values will be truncated. Note that truncating depends on the alignment of the values. Right-aligned values will be truncated from the left, left-aligned values will be truncated from the right and center-aligned values will be truncated from both sides.\n\nTo specifiy a width, use either the `AddColumn()` overload that allows you to pass an optional `minWidth` or `width` argument, or the `AddColumn(Column)` overload and specify the `width` or `minWidth` with the `Column`'s constructor arguments.\n\n## Internationalization (i18n)\n\nTextTableBuilder supports i18n by supporting an `IFormatProvider` which can be specified by passing it to the `Build()` method. The above example is based on an `en_US` locale. If we pass another locale, we get:\n\n```c#\nConsole.WriteLine(tablebuilder.Build(table, new CultureInfo(\"nl_NL\")));\n```\n\n```cmd\nNo | Name            | Position          |    Salary\n-- | --------------- | ----------------- | ---------\n1  | Bill Gates      | Founder Microsoft |    10.000\n2  | Steve Jobs      | Founder Apple     | 1.200.000\n3  | Larry Page      | Founder Google    | 1.100.000\n4  | Mark Zuckerberg | Founder Facebook  | 1.300.000\n```\n\nBy default, unless specified otherwise, the TaxtTableBuilder uses the current UI locale (`CultureInfo.CurrentUICulture`).\n\n## Type handling\n\nBy default TextTableBuilder comes with type handlers for all primitives (e.g. `int`, `decimal`, ...) and some other common types like `DateTime` and `TimeSpan`. However, you can customize how a type is formatted by specifying a `TypeHandler` that implements `ITypeHandler`.\n\nTextTableBuilder will first try to use the `TypeHandler` for the column being formatted; when no `TypeHandler` is specified for a column then the type of the value is used to determine which `TypeHandler` to use.\n\nAn example of a typehandler is:\n\n```c#\npublic class CurrencyTypeHandler : ITypeHandler\n{\n    public string Handle(object value, IFormatProvider formatProvider)\n        =\u003e string.Format(\"$ {0:N2}\", value);\n}\n```\n\nSo when we then specify our values as decimals (by adding the `m`-suffix)...\n\n```c#\nvar table = new Table()\n    .AddColumns(new[] { \"No.\", \"Name\", \"Position\", \"^Salary^\" })\n    .AddRow(1, \"Bill Gates\", \"Founder Microsoft\", 10000m)\n    // etc ...\n```\n\n...and we register our new `CurrencyTypeHandler`...\n\n```c#\nvar tablebuilder = new TableBuilder();\ntablebuilder.TypeHandlers.AddHandler\u003cdecimal\u003e(new CurrencyTypeHandler());\nConsole.WriteLine(tablebuilder.Build(table, new CultureInfo(\"en_US\")));\n```\n\n...we get:\n\n```cmd\nNo. | Name            | Position          |         Salary\n--- | --------------- | ----------------- | --------------\n1   | Bill Gates      | Founder Microsoft |    $ 10,000.00\n2   | Steve Jobs      | Founder Apple     | $ 1,200,000.00\n3   | Larry Page      | Founder Google    | $ 1,100,000.00\n4   | Mark Zuckerberg | Founder Facebook  | $ 1,300,000.00\n```\n\nAn alternative method of creating a `TypeHandler` is to inherit from `DelegatingTypeHandler\u003cT\u003e` which allows you to simply use a delegate function:\n\n```c#\npublic class CurrencyTypeHandler : DelegatingTypeHandler\u003cdecimal\u003e\n{\n    public CurrencyTypeHandler()\n        : base((value, formatProvider) =\u003e string.Format(\"$ {0:N2}\", value)) { }\n}\n```\n\nOr, even shorter:\n\n```c#\ntablebuilder.TypeHandlers.AddHandler\u003cdecimal\u003e(new DelegatingTypeHandler\u003cdecimal\u003e((value, fp) =\u003e string.Format(\"$ {0:N2}\", value)));\n```\n\nAnd still shorter:\n\n```c#\ntablebuilder.TypeHandlers.AddHandler\u003cdecimal\u003e((value, formatProvider) =\u003e string.Format(\"$ {0:N2}\", value));\n```\nAnd instead of the `TypeHandlers` property we can also use the `AddTypeHandler()` method:\n\n```c#\ntablebuilder.AddTypeHandler\u003cdecimal\u003e((value, formatProvider) =\u003e string.Format(\"$ {0:N2}\", value));\n```\n\nAnd for those about to point out this can be written even shorter:\n\n```c#\ntablebuilder.AddTypeHandler\u003cdecimal\u003e((v, _) =\u003e $\"$ {v:N2}\");\n```\n\nA `TypeHandler` can also be passed to a `Column`'s constructor, in which case that `TypeHandler` is used for all values in that column.\n\n### Null value handling\n\nA special case is the `NullValueHandler`; by default a `null` value is formatted as an empty string. However, you may want to show `null` values as \"`\u003cNULL\u003e`\" for example. To accomplish this we simply use the built-in `NullValueHandler`:\n\n```c#\ntablebuilder.TypeHandlers.NullValueHandler = new NullHandler(\"\u003cNULL\u003e\");\n```\n\nIt is possible to implement your own `NullValueHandler` by implementing `INullValueHandler`.\n\n### Object handling\n\nFor the following examples we're going to assume a collection of persons:\n\n```c#\npublic record Person(string Name, string Position, decimal Salary);\n\nvar persons = new[]\n{\n    new Person(\"Bill Gates\", \"Founder Microsoft\", 10000m),\n    // etc ...\n};\n```\n#### Default object handling\n\nBy default the TextTableBuilder outputs properties of objects in alfabetical order; for our example that just happens to work out:\n\n```c#\nvar table = new Table()\n    .AddColumns(new[] { \"Name\", \"Position\", \"^Salary^\" })\n    .AddRows(persons);\n\nvar tablebuilder = new TableBuilder();\nConsole.WriteLine(tablebuilder.Build(table));\n```\n\nThe order of the outputted properties can be changed by using a [ColumnOrder attribute](#columnorder-attribute). Properties (or fields) that don't have this attribute will be ordered by name.\n\nYou'll probably want (a lot) more control; in which case you should look into [Custom object handling](#custom-object-handling).\n\n#### Custom object handling\nFirst, we implement an `IObjectHandler`:\n\n```c#\npublic class PersonHandler : IObjectHandler\n{\n    public object[] Handle(object value, int columnCount)\n    {\n        var person = (Person)value;\n        // Return properties as value array\n        return new object[] { person.Name, person.Position, person.Salary };\n    }\n}\n```\n\nAfter that, building a table for this data is simple:\n\n```c#\nvar table = new Table()\n    .AddColumns(new[] { \"Name\", \"Position\", \"^Salary^\" })\n    .AddRows(persons);\n\nvar tablebuilder = new TableBuilder();\n\n// Specify object handler to use for persons\ntablebuilder.ObjectHandlers.AddHandler\u003cPerson\u003e(new PersonHandler());\n// Or, alternatively:\ntablebuilder.AddObjectHandler\u003cPerson\u003e(new PersonHandler());\n\n\nConsole.WriteLine(tablebuilder.Build(table));\n```\n\nWhich outputs:\n\n```cmd\nName            | Position          |       Salary\n--------------- | ----------------- | ------------\nBill Gates      | Founder Microsoft |    10,000.00\nSteve Jobs      | Founder Apple     | 1,200,000.00\nLarry Page      | Founder Google    | 1,100,000.00\nMark Zuckerberg | Founder Facebook  | 1,300,000.00\n```\n\nTextTableBuilder will still use the `TypeHandler`s to handle the types of the values as always.\n\nA shorter method is to inherit from the `DelegateObjectHandler\u003cT\u003e`:\n\n```c#\npublic class PersonHandler : DelegatingObjectHandler\u003cPerson\u003e\n{\n    public PersonHandler()\n        : base((person, columnCount) =\u003e new object[] { person.Name, person.Position, person.Salary }) { }\n}\n```\n\nEven shorter:\n\n```c#\ntablebuilder.ObjectHandlers.AddHandler\u003cPerson\u003e(new DelegatingObjectHandler\u003cdecimal\u003e((person, fp) =\u003e new object[] { person.Name, person.Position, person.Salary }));\n```\n\nStill shorter:\n\n```c#\ntablebuilder.AddObjectHandler\u003cPerson\u003e((person, columnCount) =\u003e new object[] { person.Name, person.Position, person.Salary });\n```\n\nWhen no handler for a specific object can be found then the `DefaultObjectHandler` is used which simply takes all readable properties and returns those in alfabetical order unless...\n\n### ColumnOrder attribute\n\nWhen adding rows by adding objects directly (e.g. `.AddRow(myperson)` where `myperson` is a `Person` objecy) the order of the properties can be specified for the `DefaultObjectHandler`. If you implement your own `IObjectHandler` then you need to either return the values in te correct order or look for the `ColumnOrder` attribute and use it's `Order` property to determine the order of the properties.\n\n```c#\npublic record Person(\n    [property: ColumnOrder(2)] string Name,\n    [property: ColumnOrder(1)] string Position,\n    [property: ColumnOrder(3)] decimal Salary,\n    [property: ColumnOrder(4)] DateTime DateOfBirth\n);\n```\n\nOr, a bit more old-fashioned:\n\n```c#\npublic class Person\n{\n    [ColumnOrder(2)]\n    public string Name { get; set; }\n    [ColumnOrder(1)]\n    public string Position { get; set; }\n    [ColumnOrder(3)]\n    public decimal Salary { get; set; }\n    [ColumnOrder(4)]\n    public DateTime DateOfBirth { get; set; }\n}\n```\n\nIf we now print the table:\n\n```c#\nvar persons = new[]\n{\n    new Person(\"Bill Gates\", \"Founder Microsoft\", 10000m, new DateTime(1955, 10, 28)),\n    // etc ...\n};\n\n var table = new Table()\n    .AddColumns(new[] { \"Position\", \"Name\", \"^Salary^\" })\n    .AddRows(persons);\n\nvar tablebuilder = new TableBuilder();\nConsole.WriteLine(tablebuilder.Build(table));\n```\n\nThe result is:\n\n```cmd\nPosition          | Name            |       Salary\n----------------- | --------------- | ------------\nFounder Microsoft | Bill Gates      |    10,000.00\nFounder Apple     | Steve Jobs      | 1,200,000.00\nFounder Google    | Larry Page      | 1,100,000.00\nFounder Facebook  | Mark Zuckerberg | 1,300,000.00\n```\n\nNote the DateOfBirth column is missing; this is because the `DefaultObjectHandler`, by default, only takes the number of properties equal to the number of columns.\n\nHowever, if we print the table like this:\n\n```c#\nvar table = new Table()\n    .AddColumns(new[] { \"Position\", \"Name\", \"^Salary^\", \"Birthdate\", \"Alma mater\", \"Spouse\" })\n    .AddRows(persons);\n\nvar tablebuilder = new TableBuilder();\ntablebuilder.AddTypeHandler\u003cDateTime\u003e(new DelegatingTypeHandler\u003cDateTime\u003e((date, formatprovider) =\u003e $\"{date:yyyy-MM-dd}\"));\nConsole.WriteLine(tablebuilder.Build(table));\n```\n\nThe result is:\n\n```cmd\nPosition          | Name            |       Salary | Birthdate  | Alma mater | Spouse\n----------------- | --------------- | ------------ | ---------- | ---------- | ------\nFounder Microsoft | Bill Gates      |    10,000.00 | 1955-10-28 |            |\nFounder Apple     | Steve Jobs      | 1,200,000.00 | 1955-02-24 |            |\nFounder Google    | Larry Page      | 1,100,000.00 | 1973-03-26 |            |\nFounder Facebook  | Mark Zuckerberg | 1,300,000.00 | 1984-03-14 |            |\n```\n\nThe `DefaultObjectHandler`, by default, pads all rows with missing values with `null` values.\n\n## Table Renderers\n\nThe TextTableBuilder uses an `ITableRenderer` to do the actual 'rendering' of the table. The TableRenderer is provided with `RenderColums`, which provide column information, and an `IEnumerable\u003cstring[]\u003e` which represents the rows and values. The values have been formatted at this point; the table renderer takes care of aligning, padding etc.\n\nBy default, the TextTableBuilder uses the `DefaultTableRenderer` which produced the above examples. A few other, very simple, renderers are provided. These are the `MinimalTableRenderer` and `MSDOSTableRenderer`, `SimpleLineTableRenderer`, `SingleLineTableRenderer`, `DoubleLineTableRenderer`, `HatchedTableRenderer`, `DotsTableRenderer` and `RounderCornersTableRenderer`.\n\nTo use a specific `ITableRenderer` you pass one to the `Build()` method:\n\n```c#\nConsole.WriteLine(tablebuilder.Build(table, new MSDOSTableRenderer()));\n```\n\nGoing back to our [very first example](#quickstart), the following styles are currently provided. More _may_ be added in the future (as well as ANSI color support etc.) but it's also trivial to build your own; just implement `ITableRenderer`:\n\n### DefaultTableRenderer:\n\n```cmd\n No | Name            | Position          |         Salary \n----|-----------------|-------------------|----------------\n 1  | Bill Gates      | Founder Microsoft |    $ 10,000.00 \n 2  | Steve Jobs      | Founder Apple     | $ 1,200,000.00 \n 3  | Larry Page      | Founder Google    | $ 1,100,000.00 \n 4  | Mark Zuckerberg | Founder Facebook  | $ 1,300,000.00 \n```\n\n### MinimalTableRenderer:\n\n```cmd\nNo Name            Position                  Salary\n1  Bill Gates      Founder Microsoft    $ 10,000.00\n2  Steve Jobs      Founder Apple     $ 1,200,000.00\n3  Larry Page      Founder Google    $ 1,100,000.00\n4  Mark Zuckerberg Founder Facebook  $ 1,300,000.00\n```\n\n### MSDOSTableRenderer:\n\n```cmd\n No ║ Name            ║ Position          ║         Salary \n════║═════════════════║═══════════════════║════════════════\n 1  ║ Bill Gates      ║ Founder Microsoft ║    $ 10,000.00 \n 2  ║ Steve Jobs      ║ Founder Apple     ║ $ 1,200,000.00 \n 3  ║ Larry Page      ║ Founder Google    ║ $ 1,100,000.00 \n 4  ║ Mark Zuckerberg ║ Founder Facebook  ║ $ 1,300,000.00 \n```\n\n### SimpleLineTableRenderer:\n\n```cmd\n+----+-----------------+-------------------+----------------+\n| No | Name            | Position          |         Salary |\n+----+-----------------+-------------------+----------------+\n| 1  | Bill Gates      | Founder Microsoft |    $ 10,000.00 |\n| 2  | Steve Jobs      | Founder Apple     | $ 1,200,000.00 |\n| 3  | Larry Page      | Founder Google    | $ 1,100,000.00 |\n| 4  | Mark Zuckerberg | Founder Facebook  | $ 1,300,000.00 |\n+----+-----------------+-------------------+----------------+\n```\n\n### SingleLineTableRenderer:\n\n```cmd\n┌────┬─────────────────┬───────────────────┬────────────────┐\n│ No │ Name            │ Position          │         Salary │\n├────┼─────────────────┼───────────────────┼────────────────┤\n│ 1  │ Bill Gates      │ Founder Microsoft │    $ 10,000.00 │\n│ 2  │ Steve Jobs      │ Founder Apple     │ $ 1,200,000.00 │\n│ 3  │ Larry Page      │ Founder Google    │ $ 1,100,000.00 │\n│ 4  │ Mark Zuckerberg │ Founder Facebook  │ $ 1,300,000.00 │\n└────┴─────────────────┴───────────────────┴────────────────┘\n```\n\n### DoubleLineTableRenderer:\n\n```cmd\n╔════╦═════════════════╦═══════════════════╦════════════════╗\n║ No ║ Name            ║ Position          ║         Salary ║\n╠════╬═════════════════╬═══════════════════╬════════════════╣\n║ 1  ║ Bill Gates      ║ Founder Microsoft ║    $ 10,000.00 ║\n║ 2  ║ Steve Jobs      ║ Founder Apple     ║ $ 1,200,000.00 ║\n║ 3  ║ Larry Page      ║ Founder Google    ║ $ 1,100,000.00 ║\n║ 4  ║ Mark Zuckerberg ║ Founder Facebook  ║ $ 1,300,000.00 ║\n╚════╩═════════════════╩═══════════════════╩════════════════╝\n```\n\n### RoundedCornersTableRenderer:\n\n```cmd\n╭────┬─────────────────┬───────────────────┬────────────────╮\n│ No │ Name            │ Position          │         Salary │\n├────┼─────────────────┼───────────────────┼────────────────┤\n│ 1  │ Bill Gates      │ Founder Microsoft │    $ 10,000.00 │\n│ 2  │ Steve Jobs      │ Founder Apple     │ $ 1,200,000.00 │\n│ 3  │ Larry Page      │ Founder Google    │ $ 1,100,000.00 │\n│ 4  │ Mark Zuckerberg │ Founder Facebook  │ $ 1,300,000.00 │\n╰────┴─────────────────┴───────────────────┴────────────────╯\n```\n\n### HatchedTableRenderer:\n\n```cmd\n/----+-----------------+-------------------+----------------\\\n| No | Name            | Position          |         Salary |\n+----+-----------------+-------------------+----------------+\n| 1  | Bill Gates      | Founder Microsoft |    $ 10,000.00 |\n| 2  | Steve Jobs      | Founder Apple     | $ 1,200,000.00 |\n| 3  | Larry Page      | Founder Google    | $ 1,100,000.00 |\n| 4  | Mark Zuckerberg | Founder Facebook  | $ 1,300,000.00 |\n\\----+-----------------+-------------------+----------------/\n```\n\n### DotsTableRenderer:\n\n```cmd\n.............................................................\n: No : Name            : Position          :         Salary :\n:....:.................:...................:................:\n: 1  : Bill Gates      : Founder Microsoft :    $ 10,000.00 :\n: 2  : Steve Jobs      : Founder Apple     : $ 1,200,000.00 :\n: 3  : Larry Page      : Founder Google    : $ 1,100,000.00 :\n: 4  : Mark Zuckerberg : Founder Facebook  : $ 1,300,000.00 :\n.............................................................\n```\n\n## Examples\n\nWith all the examples above demonstrating a specific option each, you may not have noticed how easy this package can make your life (that's what it's meant to do). So here's an example that shows typical usage. Assuming you have a `Person` class/record but you can't (or don't want to) 'pollute' it with `ColumnOrder`-attributes:\n\n```c#\nvar table = new Table()\n    .AddColumns(new[] { \"Name\", \"Position\", \"^Salary^\" })\n    .AddRows(DBContext.Persons.Where(p =\u003e p.Salary \u003e 100));\n\nvar tablebuilder = new TableBuilder()\n    .AddObjectHandler\u003cPerson\u003e( // Specify object handler to use for persons\n        (person, columnCount) =\u003e new object[] { person.Name, person.Position, person.Salary }\n    );\nConsole.WriteLine(tablebuilder.Build(table));\n```\n\n---\n\nIcon made by [Freepik](http://www.flaticon.com/authors/freepik) from [www.flaticon.com](http://www.flaticon.com) is licensed by [CC 3.0](http://creativecommons.org/licenses/by/3.0/).\n","funding_links":["https://github.com/sponsors/RobThree","https://paypal.me/robiii"],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobthree%2Ftexttablebuilder","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frobthree%2Ftexttablebuilder","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frobthree%2Ftexttablebuilder/lists"}