How to format tabular data as text in Java?

2020-06-18 03:31发布

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.

3条回答
该账号已被封号
2楼-- · 2020-06-18 03:55

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.

查看更多
Bombasti
3楼-- · 2020-06-18 04:01

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/

查看更多
萌系小妹纸
4楼-- · 2020-06-18 04:02

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)

查看更多
登录 后发表回答