Reputation: 111335
I need to output data into a console as a table. I was wondering maybe there are some java libraries that would take care of drawing tables in ASCII art, aligning values inside cells, etc?
╔══════╤═══════════╤════════╗
║ ID │ Name │ Age ║
╠══════╪═══════════╪════════╣
║ 1 │ John │ 24 ║
╟──────┼───────────┼────────╢
║ 2 │ Jeff │ 19 ║
╟──────┼───────────┼────────╢
║ 3 │ Joel │ 42 ║
╚══════╧═══════════╧════════╝
Upvotes: 21
Views: 12711
Reputation: 1
You can try Text Table Formatter. It's not a perfect library: it doesn't have JavaDocs, it doesn't have a user guide, the source code contains typos (e.g. see the ShownBorders
class that contains a HEADER_AND_FIRST_COLLUMN
constant). Even this project page that contains examples of usages has at least one typo (HorizontalAlign.right
instead of HorizontalAlign.RIGHT
). However, it's in the Maven Central repository (unlike iNamik's Text Table Formatter), pretty flexible, easy to use, and it works. Here's the fixed "advanced" example provided by the library's creators
public class Advanced {
public static void main(final String[] args) {
CellStyle numberStyle = new CellStyle(HorizontalAlign.RIGHT);
Table t = new Table(3, BorderStyle.DESIGN_FORMAL,
ShownBorders.SURROUND_HEADER_FOOTER_AND_COLUMNS);
t.setColumnWidth(0, 8, 14);
t.setColumnWidth(1, 7, 16);
t.setColumnWidth(2, 9, 16);
t.addCell("Region");
t.addCell("Orders", numberStyle);
t.addCell("Sales", numberStyle);
t.addCell("North");
t.addCell("6,345", numberStyle);
t.addCell("$87.230", numberStyle);
t.addCell("Center");
t.addCell("837", numberStyle);
t.addCell("$12.855", numberStyle);
t.addCell("South");
t.addCell("5,344", numberStyle);
t.addCell("$72.561", numberStyle);
t.addCell("Total", numberStyle, 2);
t.addCell("$172.646", numberStyle);
System.out.println(t.render());
}
}
Output:
==========================
Region Orders Sales
-------- ------- ---------
North 6,345 $87.230
Center 837 $12.855
South 5,344 $72.561
-------- ------- ---------
Total $172.646
==========================
Another option (I personally like it more) is ASCII Table. Unlike the previous library, it has a good user guide, JavaDocs, and multiple versions in Maven Central (which implies it was maintained, at least for a while, the last one is of May 2017). Here's an example of what you can do with it (I'll omit the class and main method declarations)
AsciiTable table = new AsciiTable();
table.getContext().setGrid(A8_Grids.lineDobuleTripple());
table.addHeavyRule();
table.addRow(null, null, "Countries");
table.addHeavyRule();
table.addRow("Country", "Capital", "Population");
table.addRule();
table.addRow("United States", "Washington", "333,287,557");
table.addRow("United Kingdom", "London", "68,138,484");
table.addRow("Australia", "Canberra", "26,540,400");
table.addHeavyRule();
System.out.println(table.render());
Output:
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
Countries
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
Country Capital Population
────────────────────────────────────────────────────────────────────────────────
United States Washington 333,287,557
United Kingdom London 68,138,484
Australia Canberra 26,540,400
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡
Upvotes: 1
Reputation:
If you already have a formatted 2d array of strings with the desired column widths, then you can draw a simple table yourself without any libraries, something like this:
+------+---------+-------+
| ID | Name | Age |
+------+---------+-------+
| 1 | John | 24 |
+------+---------+-------+
| 2 | Jeff | 19 |
+------+---------+-------+
| 3 | Joel | 42 |
+------+---------+-------+
public static String drawTable(String[][] table) {
String borderRow = Arrays.stream(table[0])
// border row between rows
.map(str -> "-".repeat(str.length()))
.collect(Collectors.joining("+", "+", "+\n"));
return Arrays.stream(table)
// table row with borders between cells
.map(row -> Arrays.stream(row)
.collect(Collectors.joining("|", "|", "|\n")))
.collect(Collectors.joining(borderRow, borderRow, borderRow));
}
public static void main(String[] args) {
String[][] table = {
{" ID ", " Name ", " Age "},
{" 1 ", " John ", " 24 "},
{" 2 ", " Jeff ", " 19 "},
{" 3 ", " Joel ", " 42 "}};
System.out.println(drawTable(table));
}
See also:
• How to draw a staircase with Java?
• Formatting 2d array of numbers
Upvotes: 0
Reputation: 1657
Here is also a handy library: https://github.com/JakeWharton/flip-tables
As the doc said:
String[] headers = { "Test", "Header" };
String[][] data = {
{ "Foo", "Bar" },
{ "Kit", "Kat" },
};
System.out.println(FlipTable.of(headers, data));
should have the following output:
╔══════╤════════╗
║ Test │ Header ║
╠══════╪════════╣
║ Foo │ Bar ║
╟──────┼────────╢
║ Kit │ Kat ║
╚══════╧════════╝
Upvotes: 3
Reputation: 572
I like your table and wrote that: https://github.com/klaus31/ascii-art-table
Upvotes: 3
Reputation: 8981
This worked pretty well for me: http://code.google.com/p/java-ascii-table/
String [] header = {
"User Name",
"Salary", "Designation",
"Address", "Lucky#"
};
String[][] data = {
{ "Ram", "2000", "Manager", "#99, Silk board", "1111" },
{ "Sri", "12000", "Developer", "BTM Layout", "22222" },
{ "Prasad", "42000", "Lead", "#66, Viaya Bank Layout", "333333" },
{ "Anu", "132000", "QA", "#22, Vizag", "4444444" },
{ "Sai", "62000", "Developer", "#3-3, Kakinada" },
{ "Venkat", "2000", "Manager" },
{ "Raj", "62000"},
{ "BTC"},
};
Which renders the following:
+-----------+--------+-------------+------------------------+---------+ | User Name | Salary | Designation | Address | Lucky# | +-----------+--------+-------------+------------------------+---------+ | Ram | 2000 | Manager | #99, Silk board | 1111 | | Sri | 12000 | Developer | BTM Layout | 22222 | | Prasad | 42000 | Lead | #66, Viaya Bank Layout | 333333 | | Anu | 132000 | QA | #22, Vizag | 4444444 | | Sai | 62000 | Developer | #3-3, Kakinada | | | Venkat | 2000 | Manager | | | | Raj | 62000 | | | | | BTC | | | | | +-----------+--------+-------------+------------------------+---------+
Upvotes: 7