天天看點

jasperreports 動态報表

Jasperreport的文檔表明:

    1> 開發靜态報表建議采納模闆方式

    2> 開發動态報表采用直接編輯JasperDesign對象。

但是似乎jasperreport對動态報表的操作缺乏高效率的工具類,因而開發

起來特别的費勁。

經過多方研究,得到了2種解決方案:

1> 結合Velocity技術動态生成jrxml模闆檔案;

2> 采用第三方工具DynamicJasper:DynamicJasper是sourceforge上的一個

開源項目,把它與jasperreport內建,可以相對輕松的解決大多數動态報表問題,

并且為進一步開發使用者自定義報表提供了有效途徑。

我采用的是第二種方案。

 jasperreports是一個用來開發報表的元件,通常和ireport來配合使用,可以快速的建構出漂亮的報表。但是ireport畫出的報表模闆過于死闆,就是不支援動态的列。現在要自己實作一個報表模闆,先參考ireport工具畫出的模闆,然後改改,用java代碼自己實作一個。

       項目組目前就是這麼做的,自己去寫一個模闆,一個橫排的,一個豎排的,應為字段比較多,一般采用豎排的。我們項目組做動态報表沒有用DynamicJasper這個開源的動态報表的元件,原因是我覺得他用起來也不太友善。還有就是時間的問題。

做了兩個模闆,現在備份下來。首先是橫排的模闆

package cn.hzmc.dynamicreport.example7;

import java.awt.Color;

import java.sql.Connection;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

import net.sf.jasperreports.engine.JRAlignment;

import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JRReport;

import net.sf.jasperreports.engine.JasperCompileManager;

import net.sf.jasperreports.engine.JasperExportManager;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.base.JRBaseLine;

import net.sf.jasperreports.engine.base.JRBasePrintText;

import net.sf.jasperreports.engine.design.JRDesignBand;

import net.sf.jasperreports.engine.design.JRDesignExpression;

import net.sf.jasperreports.engine.design.JRDesignField;

import net.sf.jasperreports.engine.design.JRDesignLine;

import net.sf.jasperreports.engine.design.JRDesignQuery;

import net.sf.jasperreports.engine.design.JRDesignStaticText;

import net.sf.jasperreports.engine.design.JRDesignStyle;

import net.sf.jasperreports.engine.design.JRDesignTextField;

import net.sf.jasperreports.engine.design.JasperDesign;

import com.capaa.pipe.config.ReadConfig;

class Sample6 {

 @SuppressWarnings("deprecation")

 Sample6() throws Exception {

  Connection connection = getConnection();

  JasperDesign jasperDesign = new JasperDesign();

  JRDesignStyle normalStyle = setReportSytle(jasperDesign);

  JRDesignQuery query = new JRDesignQuery();

  query.setText("select userid,name,age,sex,password,department from person");

  jasperDesign.setQuery(query);  

  //addReportFiled(jasperDesign);

  // Title

  JRDesignBand band = new JRDesignBand();

  band.setHeight(20);

  JRDesignStaticText staticText = new JRDesignStaticText();

  staticText.setX(200);

  staticText.setY(0);

  staticText.setWidth(200);

  staticText.setHeight(15);

  staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT);  //設定文本的對齊方式

  staticText.setStyle(normalStyle);

  staticText.setText("杭州美創科技有限公司審計報表 ");

  band.addElement(staticText);  

  JRDesignLine line = new JRDesignLine();  

  line.setX(0);

  line.setY(19);

  line.setWidth(500);

  line.setHeight(1);

  line.setForecolor(new Color(0x99,0xFF,0xFF));

  band.addElement(line);

  jasperDesign.setTitle(band);

  // Page header

  band = new JRDesignBand();

  //band.setHeight(20);

  band.setHeight(0);

  jasperDesign.setPageHeader(band);

  // Column header

  band = new JRDesignBand();

  band.setHeight(20);

   // 開始添加列字段

  String[] headers = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};

  String[] alias = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};

   int X = 80;

   int columnHeaderfontSize = 10;

   int fontSize = 8;

   int textHeight = 20;

   int textWidth = 80;

   int detailHeight = 20;

   JRDesignBand detail = new JRDesignBand();

   detail.setHeight(detailHeight);

  for(int i = 0;i<headers.length;i++){

   JRDesignStaticText jrstaticText = new JRDesignStaticText(); 

   jrstaticText.setText(headers[i]);

   jrstaticText.setFontSize(columnHeaderfontSize); 

   jrstaticText.setHeight(textHeight); 

   jrstaticText.setWidth(textWidth);

   if(i==0){

    X=0;

   }else{

    X = 80;

   }

   jrstaticText.setX(X * i); 

   jrstaticText.setPdfFontName("STSong-Light"); 

   jrstaticText.setPdfEmbedded(true); 

   jrstaticText.setPdfEncoding("UniGB-UCS2-H"); 

//   jrstaticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER); 

//   jrstaticText.setLeftBorder(JRBaseLine.PEN_1_POINT); 

//   jrstaticText.setTopBorder(JRBaseLine.PEN_1_POINT); 

//   jrstaticText.setRightBorder(JRBaseLine.PEN_1_POINT); 

//   jrstaticText.setBottomBorder(JRBaseLine.PEN_1_POINT); 

   jrstaticText.setForecolor(Color.blue);

  // jrstaticText.setStretchType((byte)0);

   band.addElement(jrstaticText); 

   // 定義字段,注冊字段

   JRDesignField field = new JRDesignField();

   field.setName(alias[i]);

   field.setValueClass(String.class);

   jasperDesign.addField(field);

   // add text fields for displaying fields

   JRDesignTextField textField = new JRDesignTextField();

   JRDesignExpression expression = new JRDesignExpression();

   expression.setText("$F{" + alias[i] + "}");

   expression.setValueClass(String.class);

   textField.setExpression(expression);

   textField.setFontSize(fontSize);

   textField.setHeight(textHeight);

   textField.setWidth(textWidth);

   textField.setX(X * i);

   textField.setPdfFontName("STSong-Light");

   textField.setPdfEmbedded(true);

   textField.setPdfEncoding("UniGB-UCS2-H"); 

   textField.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);

   textField.setLeftBorder(JRBaseLine.PEN_1_POINT);

   textField.setTopBorder(JRBaseLine.PEN_1_POINT);

   textField.setRightBorder(JRBaseLine.PEN_1_POINT);

   textField.setBottomBorder(JRBaseLine.PEN_1_POINT);

   //textField.setForecolor(new Color(0x99,0xFF,0xFF));

   textField.setForecolor(Color.blue);

   textField.setStretchWithOverflow(true);

   detail.addElement(textField);

  }

  jasperDesign.setColumnHeader(band);

  //detail

  jasperDesign.setDetail(detail);

  // Column footer

  band = new JRDesignBand();

  band.setHeight(10);

  jasperDesign.setColumnFooter(band);

  // Page footer

  band = new JRDesignBand();

  band.setHeight(80);

  staticText = new JRDesignStaticText();

  staticText.setX(0);

  staticText.setY(0);

  staticText.setWidth(100);

  staticText.setHeight(20);

  staticText.setPdfFontName("STSong-Light");  

  staticText.setPdfEmbedded(true);  

  staticText.setPdfEncoding("UniGB-UCS2-H"); 

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

  staticText.setText(sdf.format(new Date()));

  band.addElement(staticText);

  JRDesignTextField textField = new JRDesignTextField();

  textField.setX(450);

  textField.setY(0);

  textField.setWidth(100);

  textField.setHeight(20);

  textField.setPdfFontName("STSong-Light");  

  textField.setPdfEmbedded(true);  

  textField.setPdfEncoding("UniGB-UCS2-H"); 

  JRDesignExpression expression = new JRDesignExpression();

   expression = new JRDesignExpression();

   expression.setValueClass(java.lang.Integer.class);  

   expression.setText("$V{PAGE_NUMBER}");

  textField.setExpression(expression);

  band.addElement(textField);

  jasperDesign.setPageFooter(band);

  System.out.println(expression.getText());

  // Summary

  band = new JRDesignBand();

  band.setHeight(0);

  // band.addElement(chart1);

  jasperDesign.setSummary(band);

  System.out.println("After Connection");

  JasperReport jasperReport = JasperCompileManager

    .compileReport(jasperDesign);

  Map parameters = new HashMap();

  System.out.println("After Parameter");

  JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,

    parameters, connection);

  System.out.println("After Print");

  JasperExportManager.exportReportToHtmlFile(jasperPrint, "D://test2.html");

  JasperExportManager.exportReportToPdfFile(jasperPrint, "D://test2.pdf");

  JasperExportManager.exportReportToXmlFile(jasperPrint, "D://test2.xml", false);

  System.out.println("After Export");

 }

 private void addReportFiled(JasperDesign jasperDesign) throws JRException {

  JRDesignField field;

  field=new JRDesignField();

  field.setName("USERID");

  field.setValueClass(java.math.BigDecimal.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("NAME");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("AGE");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("SEX");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("PASSWORD");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("DEPARTMENT");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

 }

 private JRDesignStyle setReportSytle(JasperDesign jasperDesign)

   throws JRException {

  jasperDesign.setName("SampleReport");

  jasperDesign.setPageWidth(595);

  jasperDesign.setPageHeight(842);

  jasperDesign.setColumnWidth(535);

  jasperDesign.setColumnSpacing(0);

  jasperDesign.setLeftMargin(30);

  jasperDesign.setRightMargin(30);

  jasperDesign.setTopMargin(20);

  jasperDesign.setBottomMargin(20);

  // whenNoDataType="NoPages"

  jasperDesign.setWhenNoDataType(JRReport.WHEN_NO_DATA_TYPE_BLANK_PAGE);

  // isTitleNewPage="false"

  jasperDesign.setTitleNewPage(false);

  // isSummaryNewPage="false"

  jasperDesign.setSummaryNewPage(false);

 // jasperDesign.setOrientation(JRReport.ORIENTATION_PORTRAIT);

 // jasperDesign.setPrintOrder(JRReport.PRINT_ORDER_VERTICAL);

  JRDesignStyle normalStyle = new JRDesignStyle();

  normalStyle.setName("Arial_Normal");

  normalStyle.setDefault(true);

  normalStyle.setFontName("Arial");

  normalStyle.setFontSize(12);

  normalStyle.setPdfFontName("STSong-Light");

  normalStyle.setPdfEncoding("UniGB-UCS2-H");

  normalStyle.setPdfEmbedded(true);

  jasperDesign.addStyle(normalStyle);

  JRDesignStyle boldStyle = new JRDesignStyle();

  boldStyle.setName("Arial_Bold");

  boldStyle.setFontName("Arial");

  boldStyle.setFontSize(12);

  boldStyle.setBold(true);

  boldStyle.setPdfFontName("STSong-Light");

  boldStyle.setPdfEncoding("UniGB-UCS2-H");

  boldStyle.setPdfEmbedded(true);

  jasperDesign.addStyle(boldStyle);

  JRDesignStyle italicStyle = new JRDesignStyle();

  italicStyle.setName("Arial_Italic");

  italicStyle.setFontName("Arial");

  italicStyle.setFontSize(12);

  italicStyle.setItalic(true);

  italicStyle.setPdfFontName("STSong-Light");

  italicStyle.setPdfEncoding("UniGB-UCS2-H");

  italicStyle.setPdfEmbedded(true);

  jasperDesign.addStyle(italicStyle);

  return normalStyle;

 }

 private Connection getConnection() throws SQLException {

  Connection connection = ReadConfig.getProduceInstance().getDataSource()

    .getConnection();

  return connection;

 }

}

 class Sample {

 public static void main(String args[]) throws Exception {

  Sample6 obj = new Sample6();

 }

}

 然後是豎排的模闆

package cn.hzmc.dynamicreport.example8;

import java.awt.Color;

import java.sql.Connection;

import java.sql.SQLException;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.HashMap;

import java.util.Map;

import net.sf.jasperreports.engine.JRAlignment;

import net.sf.jasperreports.engine.JRException;

import net.sf.jasperreports.engine.JRReport;

import net.sf.jasperreports.engine.JasperCompileManager;

import net.sf.jasperreports.engine.JasperExportManager;

import net.sf.jasperreports.engine.JasperFillManager;

import net.sf.jasperreports.engine.JasperPrint;

import net.sf.jasperreports.engine.JasperReport;

import net.sf.jasperreports.engine.base.JRBaseLineBox;

import net.sf.jasperreports.engine.base.JRBasePrintText;

import net.sf.jasperreports.engine.design.JRDesignBand;

import net.sf.jasperreports.engine.design.JRDesignExpression;

import net.sf.jasperreports.engine.design.JRDesignField;

import net.sf.jasperreports.engine.design.JRDesignLine;

import net.sf.jasperreports.engine.design.JRDesignQuery;

import net.sf.jasperreports.engine.design.JRDesignStaticText;

import net.sf.jasperreports.engine.design.JRDesignStyle;

import net.sf.jasperreports.engine.design.JRDesignTextField;

import net.sf.jasperreports.engine.design.JasperDesign;

import com.capaa.pipe.config.ReadConfig;

class Sample {

 @SuppressWarnings("deprecation")

 Sample() throws Exception {

  Connection connection = getConnection();

  JasperDesign jasperDesign = new JasperDesign();

  JRDesignStyle normalStyle = setReportSytle(jasperDesign);

  JRDesignQuery query = new JRDesignQuery();

  query.setText("select userid,name,age,sex,password,department from person");

  jasperDesign.setQuery(query);  

  //addReportFiled(jasperDesign);

  // Title

  JRDesignBand band = new JRDesignBand();

  band.setHeight(20);

  JRDesignStaticText staticText = new JRDesignStaticText();

  staticText.setX(200);

  staticText.setY(0);

  staticText.setWidth(200);

  staticText.setHeight(15);

  staticText.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_RIGHT);  //設定文本的對齊方式

  staticText.setStyle(normalStyle);

  staticText.setText("杭州美創科技有限公司審計報表 ");

  band.addElement(staticText);  

  JRDesignLine line = new JRDesignLine();  

  line.setX(0);

  line.setY(19);

  line.setWidth(500);

  line.setHeight(1);

  line.setForecolor(new Color(0x99,0xFF,0xFF));

  band.addElement(line);

  jasperDesign.setTitle(band);

  // Page header

  band = new JRDesignBand();

  //band.setHeight(20);

  band.setHeight(0);

  jasperDesign.setPageHeader(band);

  // Column header

  band = new JRDesignBand();

  band.setHeight(0);

  jasperDesign.setColumnHeader(band);

  //detail

   // 開始添加列字段

  String[] headers = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};

  String[] alias = {"USERID","NAME","AGE","SEX","PASSWORD","DEPARTMENT"};

   int Y = 20;

   int columnHeaderfontSize = 10;

   int fontSize = 8;

   int textHeight = 19;

   int textWidth = 180;

   int detailHeight = 130;

   JRDesignBand detail = new JRDesignBand();

   detail.setHeight(detailHeight);

   for(int i=0;i<headers.length;i++){

   }

  for(int i = 0;i<headers.length;i++){

   JRDesignStaticText jrstaticText = new JRDesignStaticText(); 

   jrstaticText.setText(headers[i]);

   jrstaticText.setFontSize(columnHeaderfontSize); 

   jrstaticText.setHeight(textHeight); 

   jrstaticText.setWidth(textWidth);

   jrstaticText.setY(Y * i); 

   jrstaticText.setPdfFontName("STSong-Light"); 

   jrstaticText.setPdfEmbedded(true); 

   jrstaticText.setPdfEncoding("UniGB-UCS2-H"); 

  // jrstaticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER); 

   jrstaticText.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_LEFT); 

   jrstaticText.setForecolor(Color.black);

  // jrstaticText.setStretchType((byte)0);

  // band.addElement(jrstaticText); 

   detail.addElement(jrstaticText);

   // 定義字段,注冊字段

   JRDesignField field = new JRDesignField();

   field.setName(alias[i]);

   field.setValueClass(String.class);

   jasperDesign.addField(field);

   // add text fields for displaying fields

   JRDesignTextField textField = new JRDesignTextField();

   JRDesignExpression expression = new JRDesignExpression();

   expression.setText("$F{" + alias[i] + "}");

   expression.setValueClass(String.class);

   textField.setExpression(expression);

   textField.setFontSize(fontSize);

   textField.setHeight(textHeight);

   textField.setWidth(textWidth);

   textField.setX(textWidth);

   textField.setY(Y*i);

   textField.setPdfFontName("STSong-Light");

   textField.setPdfEmbedded(true);

   textField.setPdfEncoding("UniGB-UCS2-H"); 

   //textField.setTextAlignment(JRBasePrintText.HORIZONTAL_ALIGN_CENTER);

   textField.setHorizontalAlignment(JRAlignment.HORIZONTAL_ALIGN_LEFT);

   //textField.setForecolor(new Color(0x99,0xFF,0xFF));

   textField.setForecolor(Color.black);

   textField.setStretchWithOverflow(true);

   detail.addElement(textField);

  }

 // jasperDesign.setColumnHeader(band);

  //detail

  jasperDesign.setDetail(detail);

  // Column footer

  band = new JRDesignBand();

  band.setHeight(0);

  jasperDesign.setColumnFooter(band);

  // Page footer

  band = new JRDesignBand();

  band.setHeight(20);

  JRDesignLine line2 = new JRDesignLine();  

  line2.setX(0);

  line2.setY(-10);

  line2.setWidth(450);

  line2.setHeight(0);

  line2.setForecolor(new Color(0x99,0xFF,0xFF));

  band.addElement(line2);

  staticText = new JRDesignStaticText();

  staticText.setX(0);

  staticText.setY(0);

  staticText.setWidth(100);

  staticText.setHeight(20);

  staticText.setPdfFontName("STSong-Light");  

  staticText.setPdfEmbedded(true);  

  staticText.setPdfEncoding("UniGB-UCS2-H"); 

  SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");

  staticText.setText(sdf.format(new Date()));

  band.addElement(staticText);

  JRDesignTextField textField = new JRDesignTextField();

  textField.setX(450);

  textField.setY(0);

  textField.setWidth(100);

  textField.setHeight(20);

  textField.setPdfFontName("STSong-Light");  

  textField.setPdfEmbedded(true);  

  textField.setPdfEncoding("UniGB-UCS2-H"); 

  JRDesignExpression expression = new JRDesignExpression();

   expression = new JRDesignExpression();

   expression.setValueClass(java.lang.Integer.class);  

   expression.setText("$V{PAGE_NUMBER}");

  textField.setExpression(expression);

  band.addElement(textField);

  jasperDesign.setPageFooter(band);

  System.out.println(expression.getText());

  // Summary

  band = new JRDesignBand();

  band.setHeight(0);

  jasperDesign.setSummary(band);

  System.out.println("After Connection");

  JasperReport jasperReport = JasperCompileManager

    .compileReport(jasperDesign);

  Map parameters = new HashMap();

  System.out.println("After Parameter");

  JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport,

    parameters, connection);

  System.out.println("After Print");

  JasperExportManager.exportReportToHtmlFile(jasperPrint, "D://test3.html");

  JasperExportManager.exportReportToPdfFile(jasperPrint, "D://test3.pdf");

  JasperExportManager.exportReportToXmlFile(jasperPrint, "D://test3.xml", false);

  System.out.println("After Export");

 }

 private void addReportFiled(JasperDesign jasperDesign) throws JRException {

  JRDesignField field;

  field=new JRDesignField();

  field.setName("USERID");

  field.setValueClass(java.math.BigDecimal.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("NAME");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("AGE");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("SEX");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("PASSWORD");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

  field = new JRDesignField();

  field.setName("DEPARTMENT");

  field.setValueClass(java.lang.String.class);

  jasperDesign.addField(field);

 }

 private JRDesignStyle setReportSytle(JasperDesign jasperDesign)

   throws JRException {

  jasperDesign.setName("SampleReport");

  jasperDesign.setPageWidth(595);

  jasperDesign.setPageHeight(842);

  jasperDesign.setColumnWidth(335);

  jasperDesign.setColumnSpacing(0);

  jasperDesign.setLeftMargin(30);

  jasperDesign.setRightMargin(30);

  jasperDesign.setTopMargin(20);

  jasperDesign.setBottomMargin(20);

  // whenNoDataType="NoPages"

  jasperDesign.setWhenNoDataType(JRReport.WHEN_NO_DATA_TYPE_BLANK_PAGE);

  // isTitleNewPage="false"

  jasperDesign.setTitleNewPage(false);

  // isSummaryNewPage="false"

  jasperDesign.setSummaryNewPage(false);

 // jasperDesign.setOrientation(JRReport.ORIENTATION_PORTRAIT);

 // jasperDesign.setPrintOrder(JRReport.PRINT_ORDER_VERTICAL);

  JRDesignStyle normalStyle = new JRDesignStyle();

  normalStyle.setName("Arial_Normal");

  normalStyle.setDefault(true);

  normalStyle.setFontName("Arial");

  normalStyle.setFontSize(12);

  normalStyle.setPdfFontName("STSong-Light");

  normalStyle.setPdfEncoding("UniGB-UCS2-H");

  normalStyle.setPdfEmbedded(true);

  jasperDesign.addStyle(normalStyle);

  JRDesignStyle boldStyle = new JRDesignStyle();

  boldStyle.setName("Arial_Bold");

  boldStyle.setFontName("Arial");

  boldStyle.setFontSize(12);

  boldStyle.setBold(true);

  boldStyle.setPdfFontName("STSong-Light");

  boldStyle.setPdfEncoding("UniGB-UCS2-H");

  boldStyle.setPdfEmbedded(true);

  jasperDesign.addStyle(boldStyle);

  JRDesignStyle italicStyle = new JRDesignStyle();

  italicStyle.setName("Arial_Italic");

  italicStyle.setFontName("Arial");

  italicStyle.setFontSize(12);

  italicStyle.setItalic(true);

  italicStyle.setPdfFontName("STSong-Light");

  italicStyle.setPdfEncoding("UniGB-UCS2-H");

  italicStyle.setPdfEmbedded(true);

  jasperDesign.addStyle(italicStyle);

  return normalStyle;

 }

 private Connection getConnection() throws SQLException {

  Connection connection = ReadConfig.getProduceInstance().getDataSource().getConnection();

  return connection;

 }

}

 class Vertical {

 public static void main(String args[]) throws Exception {

  Sample obj = new Sample();

 }

}