README
¶
ASCII Table Writer
Generate ASCII table on the fly ... Installation is simple as
go get github.com/olekukonko/tablewriter
Features
- Automatic Padding
- Support Multiple Lines
- Supports Alignment
- Support Custom Separators
- Automatic Alignment of numbers & percentage
- Write directly to http , file etc via
io.Writer
- Read directly from CSV file
- Optional row line via
SetRowLine
- Normalise table header
- Make CSV Headers optional
- Enable or disable table border
- Set custom footer support
- Optional identical cells merging
- Set custom caption
- Optional reflowing of paragrpahs in multi-line cells.
Example 1 - Basic
data := [][]string{
[]string{"A", "The Good", "500"},
[]string{"B", "The Very very Bad Man", "288"},
[]string{"C", "The Ugly", "120"},
[]string{"D", "The Gopher", "800"},
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Name", "Sign", "Rating"})
for _, v := range data {
table.Append(v)
}
table.Render() // Send output
+------+-----------------------+--------+
| NAME | SIGN | RATING |
+------+-----------------------+--------+
| A | The Good | 500 |
| B | The Very very Bad Man | 288 |
| C | The Ugly | 120 |
| D | The Gopher | 800 |
+------+-----------------------+--------+
Example 2 - Without Border / Footer / Bulk Append
data := [][]string{
[]string{"1/1/2014", "Domain name", "2233", "$10.98"},
[]string{"1/1/2014", "January Hosting", "2233", "$54.95"},
[]string{"1/4/2014", "February Hosting", "2233", "$51.00"},
[]string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer
table.SetBorder(false) // Set Border to false
table.AppendBulk(data) // Add Bulk Data
table.Render()
DATE | DESCRIPTION | CV2 | AMOUNT
+----------+--------------------------+-------+---------+
1/1/2014 | Domain name | 2233 | $10.98
1/1/2014 | January Hosting | 2233 | $54.95
1/4/2014 | February Hosting | 2233 | $51.00
1/4/2014 | February Extra Bandwidth | 2233 | $30.00
+----------+--------------------------+-------+---------+
TOTAL | $146 93
+-------+---------+
Example 3 - CSV
table, _ := tablewriter.NewCSV(os.Stdout, "testdata/test_info.csv", true)
table.SetAlignment(tablewriter.ALIGN_LEFT) // Set Alignment
table.Render()
+----------+--------------+------+-----+---------+----------------+
| FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA |
+----------+--------------+------+-----+---------+----------------+
| user_id | smallint(5) | NO | PRI | NULL | auto_increment |
| username | varchar(10) | NO | | NULL | |
| password | varchar(100) | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
Example 4 - Custom Separator
table, _ := tablewriter.NewCSV(os.Stdout, "testdata/test.csv", true)
table.SetRowLine(true) // Enable row line
// Change table lines
table.SetCenterSeparator("*")
table.SetColumnSeparator("╪")
table.SetRowSeparator("-")
table.SetAlignment(tablewriter.ALIGN_LEFT)
table.Render()
*------------*-----------*---------*
╪ FIRST NAME ╪ LAST NAME ╪ SSN ╪
*------------*-----------*---------*
╪ John ╪ Barry ╪ 123456 ╪
*------------*-----------*---------*
╪ Kathy ╪ Smith ╪ 687987 ╪
*------------*-----------*---------*
╪ Bob ╪ McCornick ╪ 3979870 ╪
*------------*-----------*---------*
Example 5 - Markdown Format
data := [][]string{
[]string{"1/1/2014", "Domain name", "2233", "$10.98"},
[]string{"1/1/2014", "January Hosting", "2233", "$54.95"},
[]string{"1/4/2014", "February Hosting", "2233", "$51.00"},
[]string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
table.SetBorders(tablewriter.Border{Left: true, Top: false, Right: true, Bottom: false})
table.SetCenterSeparator("|")
table.AppendBulk(data) // Add Bulk Data
table.Render()
| DATE | DESCRIPTION | CV2 | AMOUNT |
|----------|--------------------------|------|--------|
| 1/1/2014 | Domain name | 2233 | $10.98 |
| 1/1/2014 | January Hosting | 2233 | $54.95 |
| 1/4/2014 | February Hosting | 2233 | $51.00 |
| 1/4/2014 | February Extra Bandwidth | 2233 | $30.00 |
Example 6 - Identical cells merging
data := [][]string{
[]string{"1/1/2014", "Domain name", "1234", "$10.98"},
[]string{"1/1/2014", "January Hosting", "2345", "$54.95"},
[]string{"1/4/2014", "February Hosting", "3456", "$51.00"},
[]string{"1/4/2014", "February Extra Bandwidth", "4567", "$30.00"},
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
table.SetFooter([]string{"", "", "Total", "$146.93"})
table.SetAutoMergeCells(true)
table.SetRowLine(true)
table.AppendBulk(data)
table.Render()
+----------+--------------------------+-------+---------+
| DATE | DESCRIPTION | CV2 | AMOUNT |
+----------+--------------------------+-------+---------+
| 1/1/2014 | Domain name | 1234 | $10.98 |
+ +--------------------------+-------+---------+
| | January Hosting | 2345 | $54.95 |
+----------+--------------------------+-------+---------+
| 1/4/2014 | February Hosting | 3456 | $51.00 |
+ +--------------------------+-------+---------+
| | February Extra Bandwidth | 4567 | $30.00 |
+----------+--------------------------+-------+---------+
| TOTAL | $146 93 |
+----------+--------------------------+-------+---------+
Table with color
data := [][]string{
[]string{"1/1/2014", "Domain name", "2233", "$10.98"},
[]string{"1/1/2014", "January Hosting", "2233", "$54.95"},
[]string{"1/4/2014", "February Hosting", "2233", "$51.00"},
[]string{"1/4/2014", "February Extra Bandwidth", "2233", "$30.00"},
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Date", "Description", "CV2", "Amount"})
table.SetFooter([]string{"", "", "Total", "$146.93"}) // Add Footer
table.SetBorder(false) // Set Border to false
table.SetHeaderColor(tablewriter.Colors{tablewriter.Bold, tablewriter.BgGreenColor},
tablewriter.Colors{tablewriter.FgHiRedColor, tablewriter.Bold, tablewriter.BgBlackColor},
tablewriter.Colors{tablewriter.BgRedColor, tablewriter.FgWhiteColor},
tablewriter.Colors{tablewriter.BgCyanColor, tablewriter.FgWhiteColor})
table.SetColumnColor(tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor},
tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiRedColor},
tablewriter.Colors{tablewriter.Bold, tablewriter.FgHiBlackColor},
tablewriter.Colors{tablewriter.Bold, tablewriter.FgBlackColor})
table.SetFooterColor(tablewriter.Colors{}, tablewriter.Colors{},
tablewriter.Colors{tablewriter.Bold},
tablewriter.Colors{tablewriter.FgHiRedColor})
table.AppendBulk(data)
table.Render()
Table with color Output
Example 6 - Set table caption
data := [][]string{
[]string{"A", "The Good", "500"},
[]string{"B", "The Very very Bad Man", "288"},
[]string{"C", "The Ugly", "120"},
[]string{"D", "The Gopher", "800"},
}
table := tablewriter.NewWriter(os.Stdout)
table.SetHeader([]string{"Name", "Sign", "Rating"})
table.SetCaption(true, "Movie ratings.")
for _, v := range data {
table.Append(v)
}
table.Render() // Send output
Note: Caption text will wrap with total width of rendered table.
+------+-----------------------+--------+
| NAME | SIGN | RATING |
+------+-----------------------+--------+
| A | The Good | 500 |
| B | The Very very Bad Man | 288 |
| C | The Ugly | 120 |
| D | The Gopher | 800 |
+------+-----------------------+--------+
Movie ratings.
TODO
Import Directly from CSV-done
Support for-SetFooter
done
Support for-SetBorder
done
Support table with uneven rows-done
Support custom alignment- General Improvement & Optimisation
NewHTML
Parse table from HTML
Documentation
¶
Overview ¶
Create & Generate text based table
Example (Autowrap) ¶
Output: mode 0 autoFmt false autoWrap false reflow false +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | woo | A multiline | | | string with some lines being really long. | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ mode 0 autoFmt false autoWrap true reflow false +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | A multiline | | | | | | string with some lines being | | | really long. | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ mode 0 autoFmt false autoWrap true reflow true +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | A multiline string with some | | | lines being really long. | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ mode 1 autoFmt false autoWrap false reflow false +-----+-------------------------------------------+ | woo | A multiline | | | string with some lines being really long. | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ mode 1 autoFmt false autoWrap true reflow false +-----+--------------------------------+ | woo | A multiline | | | | | | string with some lines being | | | really long. | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ mode 1 autoFmt false autoWrap true reflow true +-----+--------------------------------+ | woo | A multiline string with some | | | lines being really long. | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ mode 1 autoFmt true autoWrap false reflow false +-----+-------------------------------------------+ | WOO | A MULTILINE | | | STRING WITH SOME LINES BEING REALLY LONG | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | WOO | WAA | +-----+-------------------------------------------+ mode 1 autoFmt true autoWrap true reflow false +-----+--------------------------------+ | WOO | A MULTILINE | | | | | | STRING WITH SOME LINES BEING | | | REALLY LONG | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | WOO | WAA | +-----+--------------------------------+ mode 1 autoFmt true autoWrap true reflow true +-----+--------------------------------+ | WOO | A MULTILINE STRING WITH SOME | | | LINES BEING REALLY LONG | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | WOO | WAA | +-----+--------------------------------+ mode 2 autoFmt false autoWrap false reflow false +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | woo | A multiline | | | string with some lines being really long. | +-----+-------------------------------------------+ mode 2 autoFmt false autoWrap true reflow false +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | A multiline | | | | | | string with some lines being | | | really long. | +-----+--------------------------------+ mode 2 autoFmt false autoWrap true reflow true +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | A multiline string with some | | | lines being really long. | +-----+--------------------------------+ mode 2 autoFmt true autoWrap false reflow false +-----+-------------------------------------------+ | WOO | WAA | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | WOO | A MULTILINE | | | STRING WITH SOME LINES BEING REALLY LONG | +-----+-------------------------------------------+ mode 2 autoFmt true autoWrap true reflow false +-----+--------------------------------+ | WOO | WAA | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | WOO | A MULTILINE | | | | | | STRING WITH SOME LINES BEING | | | REALLY LONG | +-----+--------------------------------+ mode 2 autoFmt true autoWrap true reflow true +-----+--------------------------------+ | WOO | WAA | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | WOO | A MULTILINE STRING WITH SOME | | | LINES BEING REALLY LONG | +-----+--------------------------------+ mode 3 autoFmt false autoWrap false reflow false +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | A multiline | | string with some lines being really long. | +-----+-------------------------------------------+ mode 3 autoFmt false autoWrap true reflow false +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | A multiline | | | | string with some lines being | | really long. | +-----+--------------------------------+ mode 3 autoFmt false autoWrap true reflow true +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | A multiline string with some | | lines being really long. | +-----+--------------------------------+ mode 3 autoFmt true autoWrap false reflow false +-----+-------------------------------------------+ | WOO | WAA | +-----+-------------------------------------------+ | woo | waa | +-----+-------------------------------------------+ | A MULTILINE | | STRING WITH SOME LINES BEING REALLY LONG | +-----+-------------------------------------------+ mode 3 autoFmt true autoWrap true reflow false +-----+--------------------------------+ | WOO | WAA | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | A MULTILINE | | | | STRING WITH SOME LINES BEING | | REALLY LONG | +-----+--------------------------------+ mode 3 autoFmt true autoWrap true reflow true +-----+--------------------------------+ | WOO | WAA | +-----+--------------------------------+ | woo | waa | +-----+--------------------------------+ | A MULTILINE STRING WITH SOME | | LINES BEING REALLY LONG | +-----+--------------------------------+
Index ¶
- Constants
- func Color(colors ...int) []int
- func ConditionString(cond bool, valid, inValid string) string
- func DisplayWidth(str string) int
- func Pad(s, pad string, width int) string
- func PadLeft(s, pad string, width int) string
- func PadRight(s, pad string, width int) string
- func Title(name string) string
- func WrapString(s string, lim int) ([]string, int)
- func WrapWords(words []string, spc, lim, pen int) [][]string
- type Border
- type Colors
- type Table
- func (t *Table) Append(row []string)
- func (t *Table) AppendBulk(rows [][]string)
- func (t *Table) ClearFooter()
- func (t *Table) ClearRows()
- func (t *Table) NumLines() int
- func (t *Table) Render()
- func (t *Table) SetAlignment(align int)
- func (t *Table) SetAutoFormatHeaders(auto bool)
- func (t *Table) SetAutoMergeCells(auto bool)
- func (t *Table) SetAutoWrapText(auto bool)
- func (t *Table) SetBorder(border bool)
- func (t *Table) SetBorders(border Border)
- func (t *Table) SetCaption(caption bool, captionText ...string)
- func (t *Table) SetCenterSeparator(sep string)
- func (t *Table) SetColMinWidth(column int, width int)
- func (t *Table) SetColWidth(width int)
- func (t *Table) SetColumnAlignment(keys []int)
- func (t *Table) SetColumnColor(colors ...Colors)
- func (t *Table) SetColumnSeparator(sep string)
- func (t *Table) SetFooter(keys []string)
- func (t *Table) SetFooterAlignment(fAlign int)
- func (t *Table) SetFooterColor(colors ...Colors)
- func (t *Table) SetHeader(keys []string)
- func (t *Table) SetHeaderAlignment(hAlign int)
- func (t *Table) SetHeaderColor(colors ...Colors)
- func (t *Table) SetHeaderLine(line bool)
- func (t *Table) SetNewLine(nl string)
- func (t *Table) SetReflowDuringAutoWrap(auto bool)
- func (t *Table) SetRowLine(line bool)
- func (t *Table) SetRowSeparator(sep string)
Examples ¶
Constants ¶
const ( CENTER = "+" ROW = "-" COLUMN = "|" SPACE = " " NEWLINE = "\n" )
const ( ALIGN_DEFAULT = iota ALIGN_CENTER ALIGN_RIGHT ALIGN_LEFT )
const ( BgBlackColor int = iota + 40 BgRedColor BgGreenColor BgYellowColor BgBlueColor BgMagentaColor BgCyanColor BgWhiteColor )
const ( FgBlackColor int = iota + 30 FgRedColor FgGreenColor FgYellowColor FgBlueColor FgMagentaColor FgCyanColor FgWhiteColor )
const ( BgHiBlackColor int = iota + 100 BgHiRedColor BgHiGreenColor BgHiYellowColor BgHiBlueColor BgHiMagentaColor BgHiCyanColor BgHiWhiteColor )
const ( FgHiBlackColor int = iota + 90 FgHiRedColor FgHiGreenColor FgHiYellowColor FgHiBlueColor FgHiMagentaColor FgHiCyanColor FgHiWhiteColor )
const ( Normal = 0 Bold = 1 UnderlineSingle = 4 Italic )
const ESC = "\033"
const (
MAX_ROW_WIDTH = 30
)
const SEP = ";"
Variables ¶
This section is empty.
Functions ¶
func ConditionString ¶
Simple Condition for string Returns value based on condition
func DisplayWidth ¶
func WrapString ¶
Wrap wraps s into a paragraph of lines of length lim, with minimal raggedness.
func WrapWords ¶
WrapWords is the low-level line-breaking algorithm, useful if you need more control over the details of the text wrapping process. For most uses, WrapString will be sufficient and more convenient.
WrapWords splits a list of words into lines with minimal "raggedness", treating each rune as one unit, accounting for spc units between adjacent words on each line, and attempting to limit lines to lim units. Raggedness is the total error over all lines, where error is the square of the difference of the length of the line and lim. Too-long lines (which only happen when a single word is longer than lim units) have pen penalty units added to the error.
Types ¶
type Table ¶
type Table struct {
// contains filtered or unexported fields
}
func NewCSVReader ¶
Start a New Table Writer with csv.Reader
This enables customisation such as reader.Comma = ';' See http://golang.org/src/pkg/encoding/csv/reader.go?s=3213:3671#L94
func (*Table) AppendBulk ¶
Allow Support for Bulk Append Eliminates repeated for loops
func (*Table) SetAutoFormatHeaders ¶
Turn header autoformatting on/off. Default is on (true).
func (*Table) SetAutoMergeCells ¶
Set Auto Merge Cells This would enable / disable the merge of cells with identical values
func (*Table) SetAutoWrapText ¶
Turn automatic multiline text adjustment on/off. Default is on (true).
func (*Table) SetBorders ¶
func (*Table) SetCaption ¶
Set table Caption
func (*Table) SetCenterSeparator ¶
Set the center Separator
func (*Table) SetColMinWidth ¶
Set the minimal width for a column
func (*Table) SetColumnAlignment ¶
func (*Table) SetColumnColor ¶
Adding column colors (ANSI codes)
func (*Table) SetColumnSeparator ¶
Set the Column Separator
func (*Table) SetFooterAlignment ¶
Set Footer Alignment
func (*Table) SetFooterColor ¶
Adding column colors (ANSI codes)
func (*Table) SetHeaderAlignment ¶
Set Header Alignment
func (*Table) SetHeaderColor ¶
Adding header colors (ANSI codes)
func (*Table) SetHeaderLine ¶
Set Header Line This would enable / disable a line after the header
func (*Table) SetReflowDuringAutoWrap ¶
Turn automatic reflowing of multiline text when rewrapping. Default is on (true).
func (*Table) SetRowLine ¶
Set Row Line This would enable / disable a line on each row of the table