Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Generating Formatted Report in Text file format

Halo,

I have been looking for a way to generate a nicely formatted report in text file using java.

For example, I might need to print a report in the following format

A                              Monthly Report
A                               Report Name                                      Page No: 1
A Date: YYYY-MM-DD              
A
A Category                        Quantity                   Price
A -----------------               -----------------          --------------------
B Pen                             100                        $100
B Paper                           200                        $400
A
A =================                                          ====================
B Total                                                      $500
A =================                                          ====================

I have tried writing my own program, but I just feel that its a mess!!! So I am wondering if there are any existing library that I can use or is there a good way to implement it??

By the way, I have look around and found a library that are similar to what I want https://github.com/iNamik/Java-Text-Table-Formatter

Just wondering if there are other options. Thanks for helping!!

====================================================================

So I have made a sample code that I probably will use to clean up my code

    StringBuilder sb = new StringBuilder();

    sb.append(String.format("%s %50s%n", "A", "Monthly Report"));
    sb.append(String.format("%s %48s%n", "A", "Report Name"));
    sb.append(String.format("%s %n", "A"));
    sb.append(String.format("%s %-20s %-20s %-20s%n", "A", "Category", "Quantity", "Price"));
    sb.append(String.format("%s %-20s %-20s %-20s%n", "A", "--------------", "--------------", "--------------"));
    sb.append(String.format("%s %-20s %-20s %-20s%n", "B", "Paper", 100, "$200"));

    System.out.println(sb.toString());

Output:


A                                     Monthly Report
A                                      Report Name
A 
A Category             Quantity             Price               
A --------------       --------------       --------------      
B Paper                100                  $200                


I am thinking how can I make the "Report Name" at the center and "Page No:" at the right without hard coding the int argument of the formatter (i.e. %50s, without 50, is it possible)

like image 785
coldholic Avatar asked Dec 11 '12 03:12

coldholic


2 Answers

Just as an alternative, here is JDK based solution

public static void main(String[] args) throws Exception {
    printRow("A", "Category", "Quantity", "Price");
    printRow("A", "--------------", "--------------", "--------------");
    printRow("B", "Paper", 100, 200);
}

private static void printRow(String c0, String c1, Object c2, Object c3 ) {
    System.out.printf("%s %-20s %-20s %-20s%n", c0, c1, String.valueOf(c2), c3 instanceof Integer ? "$" + c3 : c3);
}

output

A Category             Quantity             Price               
A --------------       --------------       --------------      
B Paper                100                  $200                
like image 56
Evgeniy Dorofeev Avatar answered Oct 29 '22 10:10

Evgeniy Dorofeev


Apache Velocity is a good tool for text formating or templating. It works with plain text, HTML, JSP, XML, SQL scripts, etc. Here is a nice helloWorld tutorial about it.

The basic steps are:

  1. Write your text template.
  2. Initialize the Velocity Engine.
  3. Insert the context that you need.
  4. And render it.

Others like Latex are more complex but really more powerful. Take a look to JasperReports if you need just reporting formats.

like image 41
CarlosMecha Avatar answered Oct 29 '22 11:10

CarlosMecha