21

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   ║ 
 ╚══════╧═══════════╧════════╝
serg
  • 109,619
  • 77
  • 317
  • 330
  • 4
    If you are serious about the *ASCII* in ASCII art, then you can only use `+`, `-` and `|` as line drawing characters, not the fancy ones you used in the example. – Roland Illig Apr 09 '11 at 23:35
  • I once created such a function in PHP (to format a table for e-mail output). It had the same interface as other functions outputting to HTML or PDF. – Paŭlo Ebermann Apr 10 '11 at 00:31
  • Here is [the link](http://svn.berlios.de/wsvn/aligilo/programo/iloj/iloj_kotizo_formatado.php) - class TekstaKotizoFormatilo. But it is not much commented, and in Esperanto, and for our own format of table, so it might not help you here. If no suitable library is found here, I might think about porting it to Java. – Paŭlo Ebermann Apr 10 '11 at 00:41
  • 1
    Hmm... how come Google Translate doesn't support Esperanto? – Vladimir Dyuzhev Apr 10 '11 at 02:15
  • 1
    The 1980's just called... they want their character set back. – WhiteFang34 Apr 10 '11 at 02:34
  • https://github.com/MarounMaroun/simple-table – Maroun Jan 19 '17 at 07:33

6 Answers6

7

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 |        |             |                        |         |
+-----------+--------+-------------+------------------------+---------+
Mike Valenty
  • 8,941
  • 2
  • 30
  • 32
4

Try iNamik Text Table Formatter for Java.

Matt Ball
  • 354,903
  • 100
  • 647
  • 710
Jonas Kongslund
  • 5,058
  • 2
  • 28
  • 27
3

I like your table and wrote that: https://github.com/klaus31/ascii-art-table

user470370
  • 572
  • 1
  • 5
  • 17
3

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    ║
╚══════╧════════╝
zhxchen17
  • 1,617
  • 2
  • 16
  • 23
0

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  |
+------+---------+-------+

Try it online!

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

0

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                
≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡≡