精华内容
下载资源
问答
  • java生成pdf报表

    千次阅读 2016-10-12 16:11:21
     前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。  二、iText简介  iText是著名的开放源码的站点sourceforge一个...

    一、前言

      前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。

      二、iText简介

      iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

      iText的安装非常方便,在http://itextpdf.com/ 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

      三、建立第一个PDF文档

      用iText生成PDF文档需要5个步骤:

      ①建立com.lowagie.text.Document对象的实例。
      Document document = new Document(); 

      ②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
      PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF")); 

      ③打开文档。
      document.open(); 

      ④向文档中添加内容。
      document.add(new Paragraph("Hello World")); 

      ⑤关闭文档。
      document.close(); 

      通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。

      建立com.lowagie.text.Document对象的实例

      com.lowagie.text.Document对象的构建函数有三个,分别是:
      public Document();
      public Document(Rectangle pageSize);
      public Document(Rectangle pageSize,
      int marginLeft,
      int marginRight,
      int marginTop,
      int marginBottom); 

      构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。

      通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。

      书写器(Writer)对象

      一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。

      设定文档属性

      在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:
      public boolean addTitle(String title)
      public boolean addSubject(String subject)
      public boolean addKeywords(String keywords)
      public boolean addAuthor(String author)
      public boolean addCreator(String creator)
      public boolean addProducer()
      public boolean addCreationDate()
      public boolean addHeader(String name, String content) 

      其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。
    当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:
      public boolean setPageSize(Rectangle pageSize)
      public boolean add(Watermark watermark)
      public void removeWatermark()
      public void setHeader(HeaderFooter header)
      public void resetHeader()
      public void setFooter(HeaderFooter footer)
      public void resetFooter()
      public void resetPageCount()
      public void setPageCount(int pageN) 

      如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。

      对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。

      另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。

      添加文档内容

      所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。
    四、文本处理

      iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
    文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
    Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); 

      短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);

      段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。

      五、表格处理

      iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。

      类com.lowagie.text.Table的构造函数有三个:

      ①Table (int columns)
      ②Table(int columns, int rows)
      ③Table(Properties attributes)

      参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定。

      建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。下面通过一个简单的例子说明如何使用表格,代码如下:

      

    复制代码
     1 Table table = new Table(3);
     2 table.setBorderWidth(1);
     3 table.setBorderColor(new Color(0, 0, 255));
     4 table.setPadding(5);
     5 table.setSpacing(5);
     6 Cell cell = new Cell("header");
     7 cell.setHeader(true);
     8 cell.setColspan(3);
     9 table.addCell(cell);
    10 table.endHeaders();
    11 cell = new Cell("example cell with colspan 1 and rowspan 2");
    12 cell.setRowspan(2);
    13 cell.setBorderColor(new Color(255, 0, 0));
    14 table.addCell(cell);
    15 table.addCell("1.1");
    16 table.addCell("2.1");
    17 table.addCell("1.2");
    18 table.addCell("2.2");
    19 table.addCell("cell test1");
    20 cell = new Cell("big cell");
    21 cell.setRowspan(2);
    22 cell.setColspan(2);
    23 table.addCell(cell);
    24 table.addCell("cell test2");  
    复制代码

      运行结果如下:
      header cell test2 

      代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。

      代码6-10行用于设定表格的表头,第7行cell.setHeader(true);是将该单元格作为表头信息显示;第8行cell.setColspan(3);指定了该单元格占3列;为表格添加表头信息时,要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,如第10行,否则当表格跨页后,表头信息不会再显示。

      代码11-14行是向表格中添加一个宽度占一列,长度占二行的单元格。

      往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。如执行完11行代码后,表格的右下方出现2行2列的空白,这是再往表格添加单元格时,先填满这个空白,然后再另起一行,15-24行代码说明了这种添加顺序。

      六、图像处理

      iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。
      Image gif = Image.getInstance("vonnegut.gif");
      Image jpeg = Image.getInstance("myKids.jpg");
      Image png = Image.getInstance("hitchcock.png"); 

      图像的位置

      图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示。

      图像的尺寸和旋转

      如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:
      public void scaleAbsolute(int newWidth, int newHeight)
      public void scalePercent(int percent)
      public void scalePercent(int percentX, int percentY) 

      函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。

      如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。

      七、中文处理

      默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:
      BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
      com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
      Paragraph pragraph=new Paragraph("你好", FontChinese); 

      八、分页处理

      如果只是简单的显示当前页码,使用以下代码即可(设定了页面的大小后,会自动分页)。

    1 HeaderFooter footer = new HeaderFooter(new Phrase("页码:",keyfont), true);  
    2 footer.setBorder(Rectangle.NO_BORDER);  
    3 document.setHeader(footer);

      如果要显示当前页码以及总页码。

      则需要计算总页数,设定每页大小,使用pdf.newPage( )手动分页。

      详见一下代码:

    复制代码
      1 package com.foster;
      2 
      3 import java.io.File;
      4 import java.io.FileOutputStream;
      5 import java.util.ArrayList;
      6 import java.util.List;
      7 
      8 import com.lowagie.text.Cell;
      9 import com.lowagie.text.Document;
     10 import com.lowagie.text.DocumentException;
     11 import com.lowagie.text.Font;
     12 import com.lowagie.text.HeaderFooter;
     13 import com.lowagie.text.Image;
     14 import com.lowagie.text.Paragraph;
     15 import com.lowagie.text.Table;
     16 import com.lowagie.text.pdf.BaseFont;
     17 import com.lowagie.text.pdf.PdfPCell;
     18 import com.lowagie.text.pdf.PdfWriter;
     19 
     20 public class PDFReport {
     21 
     22     
     23     public static void main(String[] args) throws Exception, DocumentException {
     24         
     25         List<String> ponum=new ArrayList<String>();
     26         add(ponum, 26);
     27         List<String> line=new ArrayList<String>();
     28         add(line, 26);
     29         List<String> part=new ArrayList<String>();
     30         add(part, 26);
     31         List<String> description=new ArrayList<String>();
     32         add(description, 26);
     33         List<String> origin=new ArrayList<String>();
     34         add(origin, 26);
     35         
     36         //Create Document Instance
     37         Document document=new Document();
     38         
     39         //add Chinese font
     40         BaseFont bfChinese=BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
     41         
     42         //Font headfont=new Font(bfChinese,10,Font.BOLD);
     43         Font keyfont=new Font(bfChinese,8,Font.BOLD);
     44         Font textfont=new Font(bfChinese,8,Font.NORMAL);
     45         
     46         //Create Writer associated with document
     47         PdfWriter.getInstance(document, new FileOutputStream(new File("D:\\POReceiveReport.pdf")));
     48         
     49         document.open();
     50         
     51         //Seperate Page controller
     52         int recordPerPage=10;
     53         int fullPageRequired=ponum.size()/recordPerPage;
     54         int remainPage=ponum.size()%recordPerPage>1?1:0;
     55         int totalPage=fullPageRequired+remainPage;
     56         
     57         for(int j=0;j<totalPage;j++){
     58             document.newPage();
     59             
     60             //create page number
     61             String pageNo=leftPad("页码: "+(j+1)+" / "+totalPage,615);
     62             Paragraph pageNumber=new Paragraph(pageNo, keyfont) ;
     63             document.add(pageNumber);
     64             
     65             //create title image
     66             Image jpeg=Image.getInstance("D:\\title.JPG");
     67             jpeg.setAlignment(Image.ALIGN_CENTER);
     68             jpeg.scaleAbsolute(530, 37);
     69             document.add(jpeg);
     70             
     71             //header information
     72             Table tHeader=new Table(2);
     73             float[] widthsHeader={2f,3f};
     74             tHeader.setWidths(widthsHeader);
     75             tHeader.setWidth(100);
     76             tHeader.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
     77             
     78             
     79             String compAdd="河源市高新技术开发区兴业大道中66号";
     80             String company="丰达音响(河源)有限公司";
     81             String vendor="V006";
     82             String vendorName="中山市卢氏五金有限公司";
     83             String ccn="FHH";
     84             String mas_loc="FHH";
     85             String delivery_note="20130718001";
     86             String receive_date="20130718";
     87             String dept="H11";
     88             String asn="0123456789";
     89             
     90             
     91             Cell c1Header=new Cell(new Paragraph("地址:"+compAdd,keyfont));
     92             tHeader.addCell(c1Header);
     93             c1Header=new Cell(new Paragraph("供应商:"+vendor,keyfont));
     94             tHeader.addCell(c1Header);
     95             c1Header=new Cell(new Paragraph("公司:"+company,keyfont));
     96             tHeader.addCell(c1Header);
     97             c1Header=new Cell(new Paragraph("供应商工厂:"+vendorName,keyfont));
     98             tHeader.addCell(c1Header);
     99             c1Header = new Cell(new Paragraph("CCN:   "+ccn+"    Master Loc:   "+mas_loc,keyfont));
    100             tHeader.addCell(c1Header);
    101             c1Header = new Cell(new Paragraph("送货编号: "+delivery_note+"                             送货日期: "+receive_date,keyfont));
    102             tHeader.addCell(c1Header);
    103             c1Header=new Cell(new Paragraph("Dept:"+dept,keyfont));
    104             tHeader.addCell(c1Header);
    105             c1Header=new Cell(new Paragraph("ASN#:"+asn,keyfont));
    106             tHeader.addCell(c1Header);
    107             document.add(tHeader);
    108             
    109             //record header field
    110             Table t=new Table(5);
    111             float[] widths={1.5f,1f,1f,1.5f,1f};
    112             t.setWidths(widths);
    113             t.setWidth(100);
    114             t.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
    115             Cell c1 = new Cell(new Paragraph("PO#",keyfont));
    116             t.addCell(c1);
    117             c1 = new Cell(new Paragraph("Line",keyfont));
    118             t.addCell(c1);
    119             c1 = new Cell(new Paragraph("Part#",keyfont));
    120             t.addCell(c1);
    121             c1 = new Cell(new Paragraph("Description",keyfont));
    122             t.addCell(c1); 
    123             c1 = new Cell(new Paragraph("Origin",keyfont));
    124             t.addCell(c1); 
    125             
    126             //calculate the real records within a page ,to calculate the last record number of every page
    127             int maxRecordInPage= j+1 ==totalPage ? (remainPage==0?recordPerPage:(ponum.size()%recordPerPage)):recordPerPage;
    128             
    129             for(int i=j*recordPerPage;i<((j*recordPerPage)+maxRecordInPage);i++){
    130                 Cell c2=new Cell(new Paragraph(ponum.get(i), textfont));
    131                 t.addCell(c2);
    132                 c2=new Cell(new Paragraph(line.get(i), textfont));
    133                 t.addCell(c2);
    134                 c2=new Cell(new Paragraph(part.get(i), textfont));
    135                 t.addCell(c2);
    136                 c2=new Cell(new Paragraph(description.get(i), textfont));
    137                 t.addCell(c2);
    138                 c2=new Cell(new Paragraph(origin.get(i), textfont));
    139                 t.addCell(c2);
    140             }
    141             document.add(t);
    142             
    143             if(j+1==totalPage){
    144 
    145                 Paragraph foot11 = new Paragraph("文件只作  Foster 收貨用"+printBlank(150)+"__________________________",keyfont);
    146                 document.add(foot11);
    147                 Paragraph foot12 = new Paragraph("Printed from Foster supplier portal"+printBlank(134)+company+printBlank(40)+"版本: 1.0",keyfont);
    148                 document.add(foot12);
    149                 HeaderFooter footer11=new HeaderFooter(foot11, true);
    150                 footer11.setAlignment(HeaderFooter.ALIGN_BOTTOM);
    151                 HeaderFooter footer12=new HeaderFooter(foot12, true);
    152                 footer12.setAlignment(HeaderFooter.ALIGN_BOTTOM);
    153             }
    154         }
    155         document.close();
    156     }
    157     
    158     public static String leftPad(String str, int i) {
    159         int addSpaceNo = i-str.length();
    160         String space = ""; 
    161         for (int k=0; k<addSpaceNo; k++){
    162                 space= " "+space;
    163         };
    164         String result =space + str ;
    165         return result;
    166      }
    167     
    168     public static void add(List<String> list,int num){
    169         for(int i=0;i<num;i++){
    170             list.add("test"+i);
    171         }
    172     }
    173     
    174     public static String printBlank(int tmp){
    175           String space="";
    176           for(int m=0;m<tmp;m++){
    177               space=space+" ";
    178           }
    179           return space;
    180     }
    181 
    182 }
    复制代码

      为了使副标题严格对齐,使用了表格table进行控制,但是却没能找到去掉表格边框的方法..........郁闷.......

      九、总结 

      总的来说,iText是一套java环境下不错的制作PDF的组件。因为iText支持jsp/javabean下的开发,这使得B/S应用中的报表问题能得到很好的解决。由于iText毕竟不是专门为制作报表设计,所有报表中的内容、格式都需要通过写代码实现,相对于那些专业的支持可视化设计的报表软件来说,编程的工作量就有一定程度的增加。

    原文位置:http://www.cnblogs.com/crazyjava/p/3199936.html

    展开全文
  • Java生成PDF报表

    千次阅读 2017-10-16 13:25:43
    Java生成PDF报表  一、前言  前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。  二、iText简介  ...

    Java生成PDF报表

      一、前言

      前几天,做ASN条码收货模块,需要实现打印下载收货报表,经一番查找,选定iText--用于生成PDF文档的一个Java类库。废话不多说,进入正题。

      二、iText简介

      iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

      iText的安装非常方便,在http://itextpdf.com/ 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

      三、建立第一个PDF文档

      用iText生成PDF文档需要5个步骤:

      ①建立com.lowagie.text.Document对象的实例。
      Document document = new Document(); 

      ②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。
      PDFWriter.getInstance(document, new FileOutputStream("Helloworld.PDF")); 

      ③打开文档。
      document.open(); 

      ④向文档中添加内容。
      document.add(new Paragraph("Hello World")); 

      ⑤关闭文档。
      document.close(); 

      通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。

      建立com.lowagie.text.Document对象的实例

      com.lowagie.text.Document对象的构建函数有三个,分别是:
      public Document();
      public Document(Rectangle pageSize);
      public Document(Rectangle pageSize,
      int marginLeft,
      int marginRight,
      int marginTop,
      int marginBottom); 

      构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距。

      通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA 和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144, 720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。

      书写器(Writer)对象

      一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件。

      设定文档属性

      在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者、创建日期等属性,调用的方法分别是:
      public boolean addTitle(String title)
      public boolean addSubject(String subject)
      public boolean addKeywords(String keywords)
      public boolean addAuthor(String author)
      public boolean addCreator(String creator)
      public boolean addProducer()
      public boolean addCreationDate()
      public boolean addHeader(String name, String content) 

      其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。
    当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:
      public boolean setPageSize(Rectangle pageSize)
      public boolean add(Watermark watermark)
      public void removeWatermark()
      public void setHeader(HeaderFooter header)
      public void resetHeader()
      public void setFooter(HeaderFooter footer)
      public void resetFooter()
      public void resetPageCount()
      public void setPageCount(int pageN) 

      如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。

      对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。

      另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。

      添加文档内容

      所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。
    四、文本处理

      iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
    文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:
    Chunk chunk1 = new Chunk("This text is underlined", FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); 

      短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);

      段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。

      五、表格处理

      iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。

      类com.lowagie.text.Table的构造函数有三个:

      ①Table (int columns)
      ②Table(int columns, int rows)
      ③Table(Properties attributes)

      参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定。

      建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。下面通过一个简单的例子说明如何使用表格,代码如下:

      

    复制代码
     1 Table table = new Table(3);
     2 table.setBorderWidth(1);
     3 table.setBorderColor(new Color(0, 0, 255));
     4 table.setPadding(5);
     5 table.setSpacing(5);
     6 Cell cell = new Cell("header");
     7 cell.setHeader(true);
     8 cell.setColspan(3);
     9 table.addCell(cell);
    10 table.endHeaders();
    11 cell = new Cell("example cell with colspan 1 and rowspan 2");
    12 cell.setRowspan(2);
    13 cell.setBorderColor(new Color(255, 0, 0));
    14 table.addCell(cell);
    15 table.addCell("1.1");
    16 table.addCell("2.1");
    17 table.addCell("1.2");
    18 table.addCell("2.2");
    19 table.addCell("cell test1");
    20 cell = new Cell("big cell");
    21 cell.setRowspan(2);
    22 cell.setColspan(2);
    23 table.addCell(cell);
    24 table.addCell("cell test2");  
    复制代码

      运行结果如下:
      header cell test2 

      代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。

      代码6-10行用于设定表格的表头,第7行cell.setHeader(true);是将该单元格作为表头信息显示;第8行cell.setColspan(3);指定了该单元格占3列;为表格添加表头信息时,要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,如第10行,否则当表格跨页后,表头信息不会再显示。

      代码11-14行是向表格中添加一个宽度占一列,长度占二行的单元格。

      往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。如执行完11行代码后,表格的右下方出现2行2列的空白,这是再往表格添加单元格时,先填满这个空白,然后再另起一行,15-24行代码说明了这种添加顺序。

      六、图像处理

      iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。
      Image gif = Image.getInstance("vonnegut.gif");
      Image jpeg = Image.getInstance("myKids.jpg");
      Image png = Image.getInstance("hitchcock.png"); 

      图像的位置

      图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数public void setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示。

      图像的尺寸和旋转

      如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:
      public void scaleAbsolute(int newWidth, int newHeight)
      public void scalePercent(int percent)
      public void scalePercent(int percentX, int percentY) 

      函数public void scaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(int percentX, int percentY)则图像高宽的显示比例。

      如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r= Math.PI / 6。

      七、中文处理

      默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:
      BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
      com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12, com.lowagie.text.Font.NORMAL);
      Paragraph pragraph=new Paragraph("你好", FontChinese); 

      八、分页处理

      如果只是简单的显示当前页码,使用以下代码即可(设定了页面的大小后,会自动分页)。

    1 HeaderFooter footer = new HeaderFooter(new Phrase("页码:",keyfont), true);  
    2 footer.setBorder(Rectangle.NO_BORDER);  
    3 document.setHeader(footer);

      如果要显示当前页码以及总页码。

      则需要计算总页数,设定每页大小,使用pdf.newPage( )手动分页。

      详见一下代码:

    复制代码
      1 package com.foster;
      2 
      3 import java.io.File;
      4 import java.io.FileOutputStream;
      5 import java.util.ArrayList;
      6 import java.util.List;
      7 
      8 import com.lowagie.text.Cell;
      9 import com.lowagie.text.Document;
     10 import com.lowagie.text.DocumentException;
     11 import com.lowagie.text.Font;
     12 import com.lowagie.text.HeaderFooter;
     13 import com.lowagie.text.Image;
     14 import com.lowagie.text.Paragraph;
     15 import com.lowagie.text.Table;
     16 import com.lowagie.text.pdf.BaseFont;
     17 import com.lowagie.text.pdf.PdfPCell;
     18 import com.lowagie.text.pdf.PdfWriter;
     19 
     20 public class PDFReport {
     21 
     22     
     23     public static void main(String[] args) throws Exception, DocumentException {
     24         
     25         List<String> ponum=new ArrayList<String>();
     26         add(ponum, 26);
     27         List<String> line=new ArrayList<String>();
     28         add(line, 26);
     29         List<String> part=new ArrayList<String>();
     30         add(part, 26);
     31         List<String> description=new ArrayList<String>();
     32         add(description, 26);
     33         List<String> origin=new ArrayList<String>();
     34         add(origin, 26);
     35         
     36         //Create Document Instance
     37         Document document=new Document();
     38         
     39         //add Chinese font
     40         BaseFont bfChinese=BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
     41         
     42         //Font headfont=new Font(bfChinese,10,Font.BOLD);
     43         Font keyfont=new Font(bfChinese,8,Font.BOLD);
     44         Font textfont=new Font(bfChinese,8,Font.NORMAL);
     45         
     46         //Create Writer associated with document
     47         PdfWriter.getInstance(document, new FileOutputStream(new File("D:\\POReceiveReport.pdf")));
     48         
     49         document.open();
     50         
     51         //Seperate Page controller
     52         int recordPerPage=10;
     53         int fullPageRequired=ponum.size()/recordPerPage;
     54         int remainPage=ponum.size()%recordPerPage>1?1:0;
     55         int totalPage=fullPageRequired+remainPage;
     56         
     57         for(int j=0;j<totalPage;j++){
     58             document.newPage();
     59             
     60             //create page number
     61             String pageNo=leftPad("页码: "+(j+1)+" / "+totalPage,615);
     62             Paragraph pageNumber=new Paragraph(pageNo, keyfont) ;
     63             document.add(pageNumber);
     64             
     65             //create title image
     66             Image jpeg=Image.getInstance("D:\\title.JPG");
     67             jpeg.setAlignment(Image.ALIGN_CENTER);
     68             jpeg.scaleAbsolute(530, 37);
     69             document.add(jpeg);
     70             
     71             //header information
     72             Table tHeader=new Table(2);
     73             float[] widthsHeader={2f,3f};
     74             tHeader.setWidths(widthsHeader);
     75             tHeader.setWidth(100);
     76             tHeader.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
     77             
     78             
     79             String compAdd="河源市高新技术开发区兴业大道中66号";
     80             String company="丰达音响(河源)有限公司";
     81             String vendor="V006";
     82             String vendorName="中山市卢氏五金有限公司";
     83             String ccn="FHH";
     84             String mas_loc="FHH";
     85             String delivery_note="20130718001";
     86             String receive_date="20130718";
     87             String dept="H11";
     88             String asn="0123456789";
     89             
     90             
     91             Cell c1Header=new Cell(new Paragraph("地址:"+compAdd,keyfont));
     92             tHeader.addCell(c1Header);
     93             c1Header=new Cell(new Paragraph("供应商:"+vendor,keyfont));
     94             tHeader.addCell(c1Header);
     95             c1Header=new Cell(new Paragraph("公司:"+company,keyfont));
     96             tHeader.addCell(c1Header);
     97             c1Header=new Cell(new Paragraph("供应商工厂:"+vendorName,keyfont));
     98             tHeader.addCell(c1Header);
     99             c1Header = new Cell(new Paragraph("CCN:   "+ccn+"    Master Loc:   "+mas_loc,keyfont));
    100             tHeader.addCell(c1Header);
    101             c1Header = new Cell(new Paragraph("送货编号: "+delivery_note+"                             送货日期: "+receive_date,keyfont));
    102             tHeader.addCell(c1Header);
    103             c1Header=new Cell(new Paragraph("Dept:"+dept,keyfont));
    104             tHeader.addCell(c1Header);
    105             c1Header=new Cell(new Paragraph("ASN#:"+asn,keyfont));
    106             tHeader.addCell(c1Header);
    107             document.add(tHeader);
    108             
    109             //record header field
    110             Table t=new Table(5);
    111             float[] widths={1.5f,1f,1f,1.5f,1f};
    112             t.setWidths(widths);
    113             t.setWidth(100);
    114             t.getDefaultCell().setBorder(PdfPCell.NO_BORDER);
    115             Cell c1 = new Cell(new Paragraph("PO#",keyfont));
    116             t.addCell(c1);
    117             c1 = new Cell(new Paragraph("Line",keyfont));
    118             t.addCell(c1);
    119             c1 = new Cell(new Paragraph("Part#",keyfont));
    120             t.addCell(c1);
    121             c1 = new Cell(new Paragraph("Description",keyfont));
    122             t.addCell(c1); 
    123             c1 = new Cell(new Paragraph("Origin",keyfont));
    124             t.addCell(c1); 
    125             
    126             //calculate the real records within a page ,to calculate the last record number of every page
    127             int maxRecordInPage= j+1 ==totalPage ? (remainPage==0?recordPerPage:(ponum.size()%recordPerPage)):recordPerPage;
    128             
    129             for(int i=j*recordPerPage;i<((j*recordPerPage)+maxRecordInPage);i++){
    130                 Cell c2=new Cell(new Paragraph(ponum.get(i), textfont));
    131                 t.addCell(c2);
    132                 c2=new Cell(new Paragraph(line.get(i), textfont));
    133                 t.addCell(c2);
    134                 c2=new Cell(new Paragraph(part.get(i), textfont));
    135                 t.addCell(c2);
    136                 c2=new Cell(new Paragraph(description.get(i), textfont));
    137                 t.addCell(c2);
    138                 c2=new Cell(new Paragraph(origin.get(i), textfont));
    139                 t.addCell(c2);
    140             }
    141             document.add(t);
    142             
    143             if(j+1==totalPage){
    144 
    145                 Paragraph foot11 = new Paragraph("文件只作  Foster 收貨用"+printBlank(150)+"__________________________",keyfont);
    146                 document.add(foot11);
    147                 Paragraph foot12 = new Paragraph("Printed from Foster supplier portal"+printBlank(134)+company+printBlank(40)+"版本: 1.0",keyfont);
    148                 document.add(foot12);
    149                 HeaderFooter footer11=new HeaderFooter(foot11, true);
    150                 footer11.setAlignment(HeaderFooter.ALIGN_BOTTOM);
    151                 HeaderFooter footer12=new HeaderFooter(foot12, true);
    152                 footer12.setAlignment(HeaderFooter.ALIGN_BOTTOM);
    153             }
    154         }
    155         document.close();
    156     }
    157     
    158     public static String leftPad(String str, int i) {
    159         int addSpaceNo = i-str.length();
    160         String space = ""; 
    161         for (int k=0; k<addSpaceNo; k++){
    162                 space= " "+space;
    163         };
    164         String result =space + str ;
    165         return result;
    166      }
    167     
    168     public static void add(List<String> list,int num){
    169         for(int i=0;i<num;i++){
    170             list.add("test"+i);
    171         }
    172     }
    173     
    174     public static String printBlank(int tmp){
    175           String space="";
    176           for(int m=0;m<tmp;m++){
    177               space=space+" ";
    178           }
    179           return space;
    180     }
    181 
    182 }
    复制代码

      为了使副标题严格对齐,使用了表格table进行控制,但是却没能找到去掉表格边框的方法..........郁闷.......

      九、总结 

      总的来说,iText是一套java环境下不错的制作PDF的组件。因为iText支持jsp/javabean下的开发,这使得B/S应用中的报表问题能得到很好的解决。由于iText毕竟不是专门为制作报表设计,所有报表中的内容、格式都需要通过写代码实现,相对于那些专业的支持可视化设计的报表软件来说,编程的工作量就有一定程度的增加。

    展开全文
  • JAVA生成PDF报表

    千次阅读 2015-08-25 15:09:52
     在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成报表,这样就很好的解决...


    JAVA生成PDF报表

    一、前言

      在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表的Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成的报表,这样就很好的解决了B/S系统的报表处理问题。

      二、iText简介

      iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。

    iText的安装非常方便,在 http://www.lowagie.com/iText/download.html - download 网站上下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。

      三、建立第一个PDF文档

      用iText生成PDF文档需要5个步骤:

      ①建立com.lowagie.text.Document对象的实例。


    Document document = new Document();

      ②建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中。


    PDFWriter.getInstance(document, newFileOutputStream("Helloworld.PDF"));

      ③打开文档。


    document.open();

      ④向文档中添加内容。


    document.add(new Paragraph("Hello World"));

      ⑤关闭文档。


    document.close();

      通过上面的5个步骤,就能产生一个Helloworld.PDF的文件,文件内容为"Hello World"。

      建立com.lowagie.text.Document对象的实例

      com.lowagie.text.Document对象的构建函数有三个,分别是:


    public Document();
    public Document(Rectangle pageSize);
    public Document(Rectangle pageSize,
    int marginLeft,
    int marginRight,
    int marginTop,
    int marginBottom);

      构建函数的参数pageSize是文档页面的大小,对于第一个构建函数,页面的大小为A4,同Document(PageSize.A4)的效果一样;对 于第三个构建函数,参数marginLeft、marginRight、marginTop、marginBottom分别为左、右、上、下的页边距

      通过参数pageSize可以设定页面大小、面背景色、以及页面横向/纵向等属性。iText定义了A0-A10、AL、LETTER、HALFLETTER、_11x17、LEDGER、NOTE、B0-B5、ARCH_A-ARCH_E、FLSA和FLSE等纸张类型,也可以通过Rectangle pageSize = new Rectangle(144,720);自定义纸张。通过Rectangle方法rotate()可以将页面设置成横向。

      书写器(Writer)对象

      一旦文档(document)对象建立好之后,需要建立一个或多个书写器(Writer)对象与之关联。通过书写器(Writer)对象可以将具体文档存 盘成需要的格式,如com.lowagie.text.PDF.PDFWriter可以将文档存成PDF文 件,com.lowagie.text.html.HtmlWriter可以将文档存成html文件

      设定文档属性

      在文档打开之前,可以设定文档的标题、主题、作者、关键字、装订方式、创建者、生产者创建日期等属性,调用的方法分别是:


    public boolean addTitle(String title)
    public boolean addSubject(String subject)
    public boolean addKeywords(String keywords)
    public boolean addAuthor(String author)
    public boolean addCreator(String creator)
    public boolean addProducer()
    public boolean addCreationDate()
    public boolean addHeader(String name, String content)

      其中方法addHeader对于PDF文档无效,addHeader仅对html文档有效,用于添加文档的头信息。
    当新的页面产生之前,可以设定页面的大小、书签、脚注(HeaderFooter)等信息,调用的方法是:


    public boolean setPageSize(Rectangle pageSize)
    public boolean add(Watermark watermark)
    public void removeWatermark()
    public void setHeader(HeaderFooter header)
    public void resetHeader()
    public void setFooter(HeaderFooter footer)
    public void resetFooter()
    public void resetPageCount()
    public void setPageCount(int pageN) 

      如果要设定第一页的页面属性,这些方法必须在文档打开之前调用。

      对于PDF文档,iText还提供了文档的显示属性,通过调用书写器的setViewerPreferences方法可以控制文档打开时Acrobat Reader的显示属性,如是否单页显示、是否全屏显示、是否隐藏状态条等属性。

      另外,iText也提供了对PDF文件的安全保护,通过书写器(Writer)的setEncryption方法,可以设定文档的用户口令、只读、可打印等属性。

      添加文档内容

      所有向文档添加的内容都是以对象为单位的,如Phrase、Paragraph、Table、Graphic对象等。比较常用的是段落(Paragraph)对象,用于向文档中添加一段文字。

    四、文本处理

      iText中用文本块(Chunk)、短语(Phrase)和段落(paragraph)处理文本。
    文本块(Chunk)是处理文本的最小单位,有一串带格式(包括字体、颜色、大小)的字符串组成。如以下代码就是产生一个字体为HELVETICA、大小为10、带下划线的字符串:


    Chunk chunk1 = new Chunk("This text is underlined",FontFactory.getFont(FontFactory.HELVETICA, 12, Font.UNDERLINE)); 

      短语(Phrase)由一个或多个文本块(Chunk)组成,短语(Phrase)也可以设定字体,但对于其中以设定过字体的文本块(Chunk)无效。通过短语(Phrase)成员函数add可以将一个文本块(Chunk)加到短语(Phrase)中,如:phrase6.add(chunk);

      段落(paragraph)由一个或多个文本块(Chunk)或短语(Phrase)组成,相当于WORD文档中的段落概念,同样可以设定段落的字体大小、颜色等属性。另外也可以设定段落的首行缩进、对齐方式(左对齐、右对齐、居中对齐)。通过函数setAlignment可以设定段落的对齐方式,setAlignment的参数1为居中对齐、2为右对齐、3为左对齐,默认为左对齐。

      五、表格处理

      iText中处理表格的类为:com.lowagie.text.Table和com.lowagie.text.PDF.PDFPTable,对于比较 简单的表格处理可以用com.lowagie.text.Table,但是如果要处理复杂的表格,这就需要 com.lowagie.text.PDF.PDFPTable进行处理。这里就类com.lowagie.text.Table进行说明。

      类com.lowagie.text.Table的构造函数有三个:

       ①Table (int columns)
       ②Table(int columns, int rows)
       ③Table(Properties attributes)

      参数columns、rows、attributes分别为表格的列数、行数、表格属性。创建表格时必须指定表格的列数,而对于行数可以不用指定。

      建立表格之后,可以设定表格的属性,如:边框宽度、边框颜色、衬距(padding space 即单元格之间的间距)大小等属性。下面通过一个简单的例子说明如何使用表格,代码如下:


    1:Table table = new Table(3);
    2:table.setBorderWidth(1);
    3:table.setBorderColor(new Color(0, 0, 255));
    4:table.setPadding(5);
    5:table.setSpacing(5);
    6:Cell cell = new Cell("header");
    7:cell.setHeader(true);
    8:cell.setColspan(3);
    9:table.addCell(cell);
    10:table.endHeaders();
    11:cell = new Cell("example cell with colspan 1 and rowspan 2");
    12:cell.setRowspan(2);
    13:cell.setBorderColor(new Color(255, 0, 0));
    14:table.addCell(cell);
    15:table.addCell("1.1");
    16:table.addCell("2.1");
    17:table.addCell("1.2");
    18:table.addCell("2.2");
    19:table.addCell("cell test1");
    20:cell = new Cell("big cell");
    21:cell.setRowspan(2);
    22:cell.setColspan(2);
    23:table.addCell(cell);
    24:table.addCell("cell test2");

      运行结果如下:


    header 
    example cell with colspan 1 and rowspan 2  1.1 2.1 
    1.2 2.2 
    cell test1 big cell 
    cell test2 

      代码1-5行用于新建一个表格,如代码所示,建立了一个列数为3的表格,并将边框宽度设为1,颜色为蓝色,衬距为5。

      代码6-10行用于设定表格的表头, 第7行cell.setHeader(true);是将该单元格作为表头信息显示;第8行cell.setColspan(3);指定了该单元格占3列; 为表格添加表头信息时,要注意的是一旦表头信息添加完了之后,必须调用endHeaders()方法,如第10行,否则当表格跨页后,表头信息不会再显 示。

      代码11-14行是向表格中添加一个宽度占一列,长度占二行的单元格。

      往表格中添加单元格(cell)时,按自左向右、从上而下的次序添加。如执行完11行代码后,表格的右下方出现2行2列的空白,这是再往表格添加单元格时,先填满这个空白,然后再另起一行,15-24行代码说明了这种添加顺序。

      六、图像处理

      iText中处理表格的类为com.lowagie.text.Image,目前iText支持的图像格式有:GIF, Jpeg, PNG, wmf等格式,对于不同的图像格式,iText用同样的构造函数自动识别图像格式。通过下面的代码分别获得gif、jpg、png图像的实例。


    Image gif =Image.getInstance("vonnegut.gif");
    Image jpeg = Image.getInstance("myKids.jpg");
    Image png = Image.getInstance("hitchcock.png");

      图像的位置

      图像的位置主要是指图像在文档中的对齐方式、图像和文本的位置关系。IText中通过函数publicvoid setAlignment(int alignment)进行处理,参数alignment为Image.RIGHT、Image.MIDDLE、Image.LEFT分别指右对齐、居中、 左对齐;当参数alignment为Image.TEXTWRAP、Image.UNDERLYING分别指文字绕图形显示、图形作为文字的背景显示。这两种参数可以结合以达到预期的效果,如setAlignment(Image.RIGHT|Image.TEXTWRAP)显示的效果为图像右对齐,文字围绕图像显示

      图像的尺寸和旋转

      如果图像在文档中不按原尺寸显示,可以通过下面的函数进行设定:


    public void scaleAbsolute(int newWidth, int newHeight)
    public void scalePercent(int percent)
    public void scalePercent(int percentX, int percentY)

      函数public voidscaleAbsolute(int newWidth, int newHeight)直接设定显示尺寸;函数public void scalePercent(int percent)设定显示比例,如scalePercent(50)表示显示的大小为原尺寸的50%;而函数scalePercent(intpercentX, int percentY)则图像高宽的显示比例。

      如果图像需要旋转一定角度之后在文档中显示,可以通过函数public void setRotation(double r)设定,参数r为弧度,如果旋转角度为30度,则参数r=Math.PI / 6。

      七、中文处理

      默认的iText字体设置不支持中文字体,需要下载远东字体包iTextAsian.jar,否则不能往PDF文档中输出中文字体。通过下面的代码就可以在文档中使用中文了:


    BaseFont bfChinese = BaseFont.createFont("STSong-Light","UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    com.lowagie.text.Font FontChinese = new com.lowagie.text.Font(bfChinese, 12,com.lowagie.text.Font.NORMAL);
    Paragraph pragraph=new Paragraph("你好",FontChinese); 

     

     

     

     

     

     

     

     

     

     

     使用itext可以很容易实现PDF的生成,其中itext包中提供了很多的API,可以操作pdf,在这里我先用一个简单的例子介绍一下用itext生成PDF的方法,下面的代码是我抽空随便写了一个:

    程序调试前,必须先引用两个包,一个是itext的jar包:itext-2.0.4.jar,另一个是中文支持包:iTextAsian.jar

    importjava.io.FileOutputStream;
    import java.io.IOException;
    importcom.lowagie.text.Document;
    import com.lowagie.text.DocumentException;
    import com.lowagie.text.Element;
    import com.lowagie.text.Font;
    import com.lowagie.text.PageSize;
    import com.lowagie.text.Paragraph;
    import com.lowagie.text.pdf.BaseFont;
    import com.lowagie.text.pdf.PdfPCell;
    import com.lowagie.text.pdf.PdfPTable;
    import com.lowagie.text.pdf.PdfWriter;
    public class CreatPDF {
     
     private String mPdfPath;
     
     private CreatPDF(){
      
     }
     public void setPdfPath(String pdfPath)
     {
      mPdfPath=pdfPath;
     }
     /**
      * 生成PDF的方法
      * @return boolean
      */
     public boolean createPDF(){
        Document document = new Document();//建立一个Document对象
        document.setPageSize(PageSize.A4);//设置页面大小
        try{
         PdfWriter.getInstance(document,newFileOutputStream(mPdfPath+"taony125-test.pdf"));//建立一个PdfWriter对象
         document.open();  
         BaseFont bfChinese =BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);//设置中文字体
          Font headFont = new Font(bfChinese, 10,Font.BOLD);//设置字体大小 
          Font headFont1 = new Font(bfChinese, 8,Font.BOLD);//设置字体大小 
          Font headFont2 = new Font(bfChinese, 10,Font.NORMAL);//设置字体大小 
          float[] widths = {140f, 60f, 320f, 120f, 110f,110f, 190f};//设置表格的列宽
          PdfPTable table = new PdfPTable(widths);//建立一个pdf表格
         table.setSpacingBefore(130f);//设置表格上面空白宽度
       table.setTotalWidth(535);//设置表格的宽度             
       table.setLockedWidth(true);//设置表格的宽度固定
       //table.getDefaultCell().setBorder(0);//设置表格默认为无边框
       PdfPCell cell = new PdfPCell(new Paragraph("Taony125 testPdf 中文字体",headFont));//建立一个单元格
       //cell.setBorder(0);//设置单元格无边框
       cell.setColspan(7);//设置合并单元格的列数
       table.addCell(cell);//增加单元格
       cell = new PdfPCell(new Paragraph("Taony125 testPdf 中文字体",headFont));
          //cell.setBorder(0);
       cell.setFixedHeight(20);
       cell.setColspan(7);//设置合并单元格的列数
       cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置内容水平居中显示
       cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell);
       cell = new PdfPCell(new Paragraph("Taony125 testPdf 中文字体",headFont1));
          //cell.setBorder(0);
       cell.setFixedHeight(20);
       cell.setColspan(7);//设置合并单元格的列数
       cell.setHorizontalAlignment(Element.ALIGN_CENTER);//设置内容水平居中显示
       cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
       table.addCell(cell);
       table.addCell(new Paragraph("Taony125 testPdf 中文字体",headFont2));
       document.add(table);
         }catch (DocumentException de) {
         System.err.println(de.getMessage());
                return false;
         } 
         catch (IOException ioe) {
         System.err.println(ioe.getMessage());
                returnfalse;
          }
         document.close();
      return true;
     }
     /**
      * @param args
      */
     public static void main(String[] args) {
      // TODO 自动生成方法存根
      CreatPDF mCreatPDF=new CreatPDF();
      mCreatPDF.setPdfPath("D:/");
      mCreatPDF.createPDF();
     }
    }


     

     

    展开全文
  • JAVA生成报表(JFreeChart)

    千次阅读 2016-09-07 11:10:56
    JAVA生成报表 JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)...

    JAVA生成报表

    JFreeChart是JAVA平台上的一个开放的图表绘制类库。它完全使用JAVA语言编写,是为applications, applets, servlets 以及JSP等使用所设计。JFreeChart可生成饼图(pie charts)、柱状图(bar charts)、散点图(scatter plots)、时序图(time series)、甘特图(Gantt charts)等等多种图表,并且可以产生PNG和JPEG格式的输出,还可以与PDF和EXCEL关联。 ——–百度百科

    效果图

    这里写图片描述

    项目结构图

    这里写图片描述

    如果没有下载JFreeChart的 请点击—–> JFreeChart下载

    web.xml配置参数

     <servlet>
            <servlet-name>DisplayChart</servlet-name>
            <servlet-class>org.jfree.chart.servlet.DisplayChart</servlet-class>
        </servlet>
        <servlet-mapping>
            <servlet-name>DisplayChart</servlet-name>
            <url-pattern>/DisplayChart</url-pattern>
        </servlet-mapping>
    1. 生成柱状图
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.data.category.DefaultCategoryDataset;
    
    /**
     * 柱状图 bar 
     * 
     * @author Administrator
     * 
     */
    public class BarChart1 {
        public static String getBarChart(HttpSession session) throws Exception {
            DefaultCategoryDataset dataset = new DefaultCategoryDataset();
            dataset.addValue(510, "江西", "香蕉");
            dataset.addValue(320, "江西", "苹果");
            dataset.addValue(580, "江西", "橘子");
            dataset.addValue(400, "江西", "梨子");
            JFreeChart chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售",
                    dataset, PlotOrientation.VERTICAL, true, true, true);
            String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500,
                    null, session);
            return fileName;
        }
    }
    

    JSP中调用方法(测试Demo就没有和Struts2整合)

    <%
    //柱状图 S
        String fileName=BarChart1.getBarChart(session);//垂直
    %>
    <h1>柱状图</h1>
    <img src="DisplayChart?filename=<%=fileName %>" width="700" height="500" border="0"/>

    2.生成饼状图

    
    import java.awt.Font;
    import java.text.NumberFormat;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.chart.plot.PiePlot3D;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.general.DefaultPieDataset;
    import org.jfree.util.Rotation;
    
    public class PieChart3 {
    
        public static String getPieChart3(HttpSession session) throws Exception {
            DefaultPieDataset dataset = new DefaultPieDataset();
            dataset.setValue("QQ", 1000);
            dataset.setValue("微信", 1200);
            dataset.setValue("陌陌", 400);
            dataset.setValue("飞信", 100);
            dataset.setValue("其他", 29);
    
            JFreeChart chart = ChartFactory.createPieChart3D("社交软件下载量统计图", dataset,
                    true, true, true);
    
            // 副标题
            chart.addSubtitle(new TextTitle("2016年度(单位/万)"));
    
            PiePlot pieplot = (PiePlot) chart.getPlot();
            pieplot.setLabelFont(new Font("宋体", 0, 11));
            // 设置饼图是圆的(true),还是椭圆的(false);默认为true
            pieplot.setCircular(true);
            // 没有数据的时候显示的内容
            pieplot.setNoDataMessage("无数据显示");
            StandardPieSectionLabelGenerator standarPieIG = new StandardPieSectionLabelGenerator(
                    "{0}:({1}.{2})", NumberFormat.getNumberInstance(),
                    NumberFormat.getPercentInstance());
            pieplot.setLabelGenerator(standarPieIG);
            // 3D设置
            PiePlot3D pieplot3d = (PiePlot3D) chart.getPlot();
    
            // 设置开始角度
            pieplot3d.setStartAngle(120D);
            // 设置方向为”顺时针方向“
            pieplot3d.setDirection(Rotation.CLOCKWISE);
            // 设置透明度,0.5F为半透明,1为不透明,0为全透明
            pieplot3d.setForegroundAlpha(0.7F);
            String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500,
                    null, session);
    
            return fileName;
        }
    }
    

    3.生成折线图

    import java.awt.Font;
    
    import javax.servlet.http.HttpSession;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.axis.DateAxis;
    import org.jfree.chart.axis.DateTickUnit;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardXYItemLabelGenerator;
    import org.jfree.chart.plot.XYPlot;
    import org.jfree.chart.renderer.xy.XYItemRenderer;
    import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
    import org.jfree.chart.servlet.ServletUtilities;
    import org.jfree.chart.title.TextTitle;
    import org.jfree.data.time.Month;
    import org.jfree.data.time.TimeSeries;
    import org.jfree.data.time.TimeSeriesCollection;
    import org.jfree.ui.TextAnchor;
    
    public class LineChart2 {
    
        public static String getLineChart2(HttpSession session) throws Exception {
            // 访问量统计
            TimeSeries timeSeries = new TimeSeries("A网站访问量统计", Month.class);
            // 添加数据
            timeSeries.add(new Month(1, 2013), 100);
            timeSeries.add(new Month(2, 2013), 200);
            timeSeries.add(new Month(3, 2013), 300);
            timeSeries.add(new Month(4, 2013), 400);
            timeSeries.add(new Month(5, 2013), 560);
            timeSeries.add(new Month(6, 2013), 600);
            timeSeries.add(new Month(7, 2013), 750);
            timeSeries.add(new Month(8, 2013), 890);
            timeSeries.add(new Month(9, 2013), 120);
            timeSeries.add(new Month(10, 2013), 400);
            timeSeries.add(new Month(11, 2013), 1200);
            timeSeries.add(new Month(12, 2013), 1600);
    
            // 访问量统计
            TimeSeries timeSeries2 = new TimeSeries("B网站访问量统计", Month.class);
            // 添加数据
            timeSeries2.add(new Month(1, 2013), 50);
            timeSeries2.add(new Month(2, 2013), 100);
            timeSeries2.add(new Month(3, 2013), 150);
            timeSeries2.add(new Month(4, 2013), 200);
            timeSeries2.add(new Month(5, 2013), 220);
            timeSeries2.add(new Month(6, 2013), 300);
            timeSeries2.add(new Month(7, 2013), 340);
            timeSeries2.add(new Month(8, 2013), 400);
            timeSeries2.add(new Month(9, 2013), 450);
            timeSeries2.add(new Month(10, 2013), 500);
            timeSeries2.add(new Month(11, 2013), 70);
            timeSeries2.add(new Month(12, 2013), 800);
    
            // 定义时间序列的集合
            TimeSeriesCollection lineDataset = new TimeSeriesCollection();
            lineDataset.addSeries(timeSeries);
            lineDataset.addSeries(timeSeries2);
    
            JFreeChart chart = ChartFactory.createTimeSeriesChart("访问量统计时间折线图",
                    "月份", "访问量", lineDataset, true, true, true);
    
            // 设置主标题
            chart.setTitle(new TextTitle("A,B网站访问量统计对比图", new Font("隶书",
                    Font.ITALIC, 15)));
            // 设置子标题
            TextTitle subtitle = new TextTitle("2013年度", new Font("黑体", Font.BOLD,
                    12));
            chart.addSubtitle(subtitle);
            chart.setAntiAlias(true);
    
            // 设置时间轴的范围。
            XYPlot plot = (XYPlot) chart.getPlot();
            DateAxis dateaxis = (DateAxis) plot.getDomainAxis();
            dateaxis.setDateFormatOverride(new java.text.SimpleDateFormat("M月"));
            dateaxis.setTickUnit(new DateTickUnit(DateTickUnit.MONTH, 1));
    
            // 设置曲线是否显示数据点
            XYLineAndShapeRenderer xylinerenderer = (XYLineAndShapeRenderer) plot
                    .getRenderer();
            xylinerenderer.setBaseShapesVisible(true);
    
            // 设置曲线显示各数据点的值
            XYItemRenderer xyitem = plot.getRenderer();
            xyitem.setBaseItemLabelsVisible(true);
            xyitem.setBasePositiveItemLabelPosition(new ItemLabelPosition(
                    ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_CENTER));
            xyitem.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
            xyitem.setBaseItemLabelFont(new Font("Dialog", 1, 12));
            plot.setRenderer(xyitem);
    
            String fileName = ServletUtilities.saveChartAsPNG(chart, 700, 500,
                    session);
    
            return fileName;
        }
    }
    

    我的项目源码下载—->JAVA生成报表

    与Struts2的整合

    项目结构图

    这里写图片描述

    - 配置struts2的环境 (导入相关jar包)与JF整合

    web.xml参数配置

    <filter>
           <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
     <filter-mapping>
              <filter-name>StrutsPrepareAndExecuteFilter</filter-name>
              <url-pattern>/*</url-pattern>
      </filter-mapping>

    BarCharAction

    
    import java.awt.Color;
    
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.labels.ItemLabelAnchor;
    import org.jfree.chart.labels.ItemLabelPosition;
    import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
    import org.jfree.chart.plot.CategoryPlot;
    import org.jfree.chart.plot.PlotOrientation;
    import org.jfree.chart.renderer.category.BarRenderer3D;
    import org.jfree.data.category.CategoryDataset;
    import org.jfree.data.general.DatasetUtilities;
    import org.jfree.ui.TextAnchor;
    
    import com.opensymphony.xwork2.ActionSupport;
    
    public class BarCharAction extends ActionSupport {
        /**
         * 
         */
        private static final long serialVersionUID = 1L;
    
        private JFreeChart chart;
    
        public JFreeChart getChart() {
            return chart;
        }
    
        @Override
        public String execute() throws Exception {
            double[][] data = new double[][] { { 1320, 1110, 1123, 321 },
                    { 720, 210, 1423, 1321 }, { 830, 1310, 123, 521 },
                    { 400, 1110, 623, 321 } };
            String[] rowKeys = { "苹果", "香蕉", "橘子", "梨子" };
            String[] columnKeys = { "深圳", "北京", "上海", "南京" };
            CategoryDataset dataset = DatasetUtilities.createCategoryDataset(
                    rowKeys, columnKeys, data);
            chart = ChartFactory.createBarChart3D("水果销售统计图", "水果", "销售", dataset,
                    PlotOrientation.VERTICAL, true, true, true);
    
            CategoryPlot plot = chart.getCategoryPlot();
            // 设置网格背景颜色
            plot.setBackgroundPaint(Color.white);
            // 设置网格竖线颜色
            plot.setDomainGridlinePaint(Color.pink);
            // 设置网格横线颜色
            plot.setRangeGridlinePaint(Color.pink);
    
            // 显示每个柱的数值,并修改该数值的字体属性
            BarRenderer3D renderer = new BarRenderer3D();
            renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
            renderer.setBaseItemLabelsVisible(true);
    
            renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
                    ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
            renderer.setItemLabelAnchorOffset(10D);
    
            // 设置平行柱的之间距离
            renderer.setItemMargin(0.4);
    
            plot.setRenderer(renderer);
    
            return SUCCESS;
        }
    
    }
    

    struts.xml参数配置

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    
    <struts>
    
        <package name="jfreechart" extends="jfreechart-default">
            <action name="barChart" class="com.mist.chart.bar.BarCharAction">
                <result name="success" type="chart">
                   <param name="value">chart</param>
                   <param name="type">png</param>
                   <param name="width">700</param>
                   <param name="height">500</param>
                 </result>
            </action>
        </package>
    
    </struts>

    整合好之后调用就比上面没整合的方便多了

     <body>
        <img alt="" src="barChart">
      </body>

    效果图,还是和之前的一样

    这里写图片描述

    JAVA生成报表就写到这里了

    展开全文
  • Java使用itext生成PDF报表

    千次阅读 2015-06-18 11:45:32
    Java使用itext生成PDF报表
  • 使用java Apache poi 根据word模板生成word报表

    万次阅读 多人点赞 2018-03-24 16:19:37
    使用java Apache poi 根据word模板生成word报表 使用poi读取word模板,替换word中的{text}标签,并根据自定义标签循环生成表格或表格中的行。 代码示例下载:...
  • java实现PDF报表生成通用工具类

    千次阅读 2021-01-13 10:38:24
    java实现PDF报表生成通用工具类,实现添加水印,提供前端下载方法。 首先在maven中引入需用到的jar包: <!--引入PDF处理--> <dependency> <groupId>com.itextpdf</groupId> <...
  • 前2天后台系统需要生成报表,正好抽时间复习了一下之前做过的JAVA生成EXCEL,下面介绍POI 和JXL 生成报表的2种方式。 1.jxl 生成报表   Java代码 package excel; import java.io.FileOutputStream;...
  • Java报表小记之 JasperReports & iReport

    万次阅读 热门讨论 2016-05-09 09:22:36
    关于Java报表工具JasperReports以及iReport的详细介绍
  • Java报表制作

    2015-08-14 15:19:41
    Java报表制作(iReport+jaserReport+jFreeChart)  INTRODUCTION 目前开源报表中,本人觉得比较好的组合是iReport+jasperReport+jFreeChart,本文将对这三个工具做一些介绍,希望对你的报表开发有些帮助。 2 ...
  • 背景: 需求就是设计一个自定义报表...报表维护页面,添加报表数据源等基本信息,保存后自动报表模块生成报表链接及对应数据。 因为当前项目报表预期会比较简单,能展示,能搜索,能导出即可,再一个希望后期能比较
  • Java报表比较

    千次阅读 2007-05-09 10:40:00
    本文转自数巨报表的Max@X Analyser产品中心,“其它Java报表”是以国外著名的几款具有JAVA报表功能支持、OLAP分析功能支持等完整报表功能的高端产品为参照的,具体参照对象请咨询炎鼎软件。
  • Java报表概述

    2011-05-14 09:42:00
    JasperReport 2.1 简介 ...xml文件的内容包括对报表样式的定义,数据来源,参数等等,它可以支持的输出格 式:PDF,HTML,XML,XLS,CVS等。   在没有iReport之前,需要花费大量的时间去熟悉Jasper
  • 使用ITEXT与JAVA生成PDF报表

    千次阅读 2008-10-30 10:22:00
    /** * 生成PDF文件并调用相应的阅读器实现打印预览 * @param listAll 待生成文件的记录 * @param response */ public void createtable(List listAll, HttpServletResponse response) throws IOException { ...
  • 帆软Java报表软件

    千次阅读 2013-05-14 14:29:59
    帆软Java报表软件 百科名片   帆软Java报表软件 FineReport是由帆软自主研发的一款纯Java编写的报表软件产品,集数据展示(报表)和数据录入(表单)功能于一身,能够制作复杂的报表,操作简单...
  • java报表EXCEL解决方案

    千次阅读 2004-10-22 14:01:00
    java报表EXCEL解决方案 作者:周必奎 摘要:对于程序员特别是从事信息管理编程的程序员来说,报表打印是整个编程过程中最麻烦但又必须做的事情,本文结合自己项目经验对当前报表打印方案做简要分析,并重点讲叙如何...
  • 借助POI实现Java生成并打印报表(Excel)

    千次阅读 2013-12-21 17:41:36
     实际开发中,用到最多的是把数据库中数据导出生成报表,尤其是在生产管理或者财务系统中用的非常普遍。生成报表格式一般是EXCEL或者PDF 。利用Apache POI实现数据库中数据导出生成excel报表。在java众多数据导出...
  • 基于Excel文件格式的报表生成器介绍 下载:http://code.google.com/p/excelreport/downloads/list 最新版本:0.9.18 下载包中附带使用手册和example。 常见问题反馈: ...
  • Aspose.cells 用excel 模版 生成报表 Java

    千次阅读 2014-03-12 18:50:06
    我们经常在用jxl 生成Excel 报表的时候最郁闷的估计就是用代码画Excel 格式,碰到构造复杂的Excel要画好定义的格式还是得花些时间,前段时间因为项目需要用到了Aspose 组件,挺好用,标记一下. 先预览一下用 Aspose...
  • Java报表工具功能对比

    千次阅读 2007-08-03 15:18:00
    本文转自:Java报表工具功能对比这几年Java报表市场很是热闹了一阵,先是水晶报表、Brio、Style等海外产品相继杀入市场,而后是国内的华表、中创、数巨、和勤、润乾、杰表等揭竿而起(这中间有的是仅支持Java的,有...
  • Subreport子报表首先需要知道主子报表之间的关系,根据主表的ID作为条件来查找出子表中与主表相关的信息,并显示出来。难点一:父报表往子报表...在父报表中传参数:在子报表中接收参数时,需要先在子报表定义一...
  • java生成pdf和excel的方法

    千次阅读 2012-12-15 14:50:36
     在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到生成报表,这样就很好的解决...
  • JXls实现基于excel模板生成报表

    千次阅读 2019-01-22 19:58:23
    JXls实现基于excel模板生成报表 jxls是非常小巧方便生成excel报表的工具库。jxls在excel模板中使用特定标记,定义输出格式和数据布局。在很多应用中有报表功能需要生成excel。 java有很多开源或商业库可以创建...
  • java生成PDF

    万次阅读 2010-09-07 15:21:00
    一、前言 <br /> 在企业的信息系统中,报表处理一直占比较重要的作用,本文将介绍一种生成PDF报表Java组件--iText。通过在服务器端使用Jsp或JavaBean生成PDF报表,客户端采用超级连接显示或下载得到...
  • 这几年Java报表市场很是热闹了一阵,先是水晶报表、Brio、Style等海外产品相继杀入市场,而后是国内的华表、中创、数巨、和勤、润乾、杰表等揭竿而起(这中间有的是仅支持Java的,有的是支持所有WEB环境的),一时间...
  • 数据库与Excel报表的动态生成

    千次阅读 2014-09-20 14:00:08
    (1)读取数据库的数据动态生成Excel报表,这是JSP应用中常遇到的问题,本节采用的基本方法是: 在Excel工作薄中,将报表模板制作在第一张工作表中,从数据库中读取数据,利用POI组件复制模板工作表 而得到一张新...
  • java如何生成excel报表--jxl.jar操作

    千次阅读 2017-02-25 11:38:31
    JAVA EXCEL API:是一开放源码项目,通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。使用该API非Windows操作系统也可以通过纯Java应用来处理Excel数据表。因为它是使
  • Java开源报表制作

    2011-11-23 17:12:04
    OpenReports提供基于web的灵活报表解决方案,通过浏览器自动生成动态PDF,XLS,HTMLCSV和Chart报表。利用到的开源技术有Hibernate,Veloctiy,Webwork。  JFreeChart 点击次数:20352 JFreeChart它主要是用来...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 24,824
精华内容 9,929
关键字:

java报表系统的可定义自动生成方法

java 订阅