How to format tabular data as text in Java?

2020-06-18 03:07发布

问题:

I would like to produce nicely formatted tabular text from arbitrary dataset object models. Is there a good library to do this in Java?

Specifically, I want output that is formatted like command line data management tools such as the CLI for mysql. Example:

+---------+--------------+------+-----+---------+-------+
| Field   | Type         | Null | Key | Default | Extra |
+---------+--------------+------+-----+---------+-------+
| name    | varchar(100) | YES  |     | NULL    |       |
| release | year(4)      | YES  |     | NULL    |       |
| studio  | varchar(50)  | YES  |     | NULL    |       |
| review  | varchar(50)  | YES  |     | NULL    |       |
| gross   | int(11)      | YES  |     | NULL    |       |
+---------+--------------+------+-----+---------+-------+

One main challenge is that I won't automatically know the maximum column widths before I start traversing the data. Also, there are plenty of edge cases, such as dealing with very large value lengths and large numbers of rows and columns.

If I have to build this myself, I imagine I would make use of String.format, and I'd need to pre-analyze the full dataset before starting the output. That's a very low level of coding though, so I'd love to find a good library that has already solved this problem.

回答1:

Check out TableFormatter: it appears to do what you want for formatting tabular data. Source code is also available. You can append rows and cells to a table using a fluent interface approach. An example follows:

TableFormatter tf = new SimpleTableFormatter(true) // true = show border
        .nextRow()
            .nextCell()
                .addLine("Field")
            .nextCell()
                .addLine("Type")

So it will build up the cells in the correct format and adjust whitespace accordingly. It also will allow you to do basic alignment of text within the cell (center, top, bottom)



回答2:

trac.inamik.com/trac/jtable_format is under GPL license, not suitable in some cases.

Another option (Apache 2 license):

http://sourceforge.net/projects/texttablefmt/



回答3:

For those interested, I have forked TableFormatter (which is dual license GPL and MIT) to make it generics-friendly and remove all the compilation warnings.

Note that I use Java 7 diamond operator so to make it compatible with Java 6 will require adding the types in lists declarations.