首页>代码>使用jfreechart和itext实现导出报表和表格到pdf文档>/PdDFExportDemo/src/com/ptengine/web/datacenter/csv/ExportPDF.java
package com.ptengine.web.datacenter.csv;

import java.awt.Color;
import java.awt.Font;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.DateAxis;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeries;
import org.jfree.data.time.TimeSeriesCollection;
import org.jfree.data.xy.XYDataset;
import org.jfree.ui.RectangleInsets;

import com.itextpdf.text.BadElementException;
import com.itextpdf.text.Chunk;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Image;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.ptengine.conf.Configure;
import com.ptengine.data.Site;
import com.ptengine.factory.BeansFactory;
import com.ptengine.logic.SiteHandlerAction;
import com.ptengine.util.AES;
import com.ptengine.util.ComUtil;
import com.ptengine.util.StringTools;
import com.ptengine.util.UTFEncodingUtil;
import com.ptengine.web.datacenter.csv.ReportFontFactory.Font_Type;

public class ExportPDF extends HttpServlet{
	private static final long serialVersionUID = 1L;
	private String encoding="UTF-8";
	protected void service(HttpServletRequest request, HttpServletResponse response)  throws IOException{
		request.setCharacterEncoding(encoding);
		response.setContentType("text/html;charset=gb2312");
		
		List<List<String>> headList = ExportPDF.getHeadList(参数1,参数2,参数3,参数4,参数5,参数6);//获得头数据
		List<String[]> list=new ArrayList<String[]>();//获得body数据
		list=//获得body数据  大家可以写为死数据 不从数据库中取值  但要注意格式正确
		//设置文件响应信息
		String showFileName =URLEncoder.encode("导出实例.pdf", "UTF-8");
		showFileName = new String(showFileName.getBytes("iso8859-1"), "gb2312");
		//定义输出类型
		response.reset();
		response.setContentType("application/pdf"); 
		response.setHeader("Pragma", "public");
		response.setHeader("Cache-Control", "max-age=30");
		response.setHeader("Content-disposition", "attachment; filename="+ new String(showFileName.getBytes("gb2312"), "iso8859-1"));
		
		//生成PDF文档
        Document document=new Document(PageSize.A4, 50, 50, 50, 50);
		ByteArrayOutputStream bos= new ByteArrayOutputStream();
		try {
			PdfWriter.getInstance(document, bos);
		} catch (DocumentException e1) {
			e1.printStackTrace();
		}

		//打开doc
		document.open();
		//添加标题
		try {
			Paragraph paragraph=new Paragraph(tfilename,ReportFontFactory.getFontChinese(Font_Type.HEADER));
			paragraph.setAlignment(Paragraph.ALIGN_CENTER);
			document.add(paragraph);
			document.add(Chunk.NEWLINE);
		} catch (DocumentException e1) {
			e1.printStackTrace();
		}
		//构建一个表格
		PdfPTable table = new PdfPTable(2); 
  
        table.setWidthPercentage(100f);
        table.setSpacingBefore(3f);
        table.getDefaultCell().setBorder(0);//设置表格默认为无边框
		PdfPCell cell =null;
		//生成表头
    	if (headList != null && headList.size() > 0) {
    	for (int i =0;i<headList.size();i++) {
    		List<String> rowList = headList.get(i);
    		for(int j=0;j<rowList.size();j++){
	    			try {
						cell= new PdfPCell(new Paragraph(rowList.get(j),ReportFontFactory.getFontChinese(Font_Type.HEADER)));
					} catch (DocumentException e) {
						System.out.println("生成表头error");
						e.printStackTrace();
					}
	    			table.addCell(cell);
    		}
        }
    	}
   	 	PdfPTable table1 = new PdfPTable(11);
   	 	table1.setWidthPercentage(100f);
        table1.getDefaultCell().setBorder(0);//设置表格默认为无边框
		PdfPCell cell1 =null;
  	  if (list != null && list.size() > 0) {
      	   for(int i=0;i<list.size();i++){
  			String[] arr= list.get(i);
  			for(int j=0;j<arr.length;j++){
					try {
					    cell1= new PdfPCell(new Paragraph(""+arr[j],ReportFontFactory.getFontChinese(Font_Type.CONTENT)));
					} catch (DocumentException e) {
						System.out.println("生成体error");
						e.printStackTrace();
					}
					table1.addCell(cell1);
  			}
      	   }
         }
	   		//添加table到Document对象中
         //这儿是取值获取数据,这是传入报表的数据
  	  	List<String> list1=new ArrayList<String>();
  	  	List<String> list2=new ArrayList<String>();
  	  	for(int i=0;i<list.size();i++){
  	  		if(i==0){
  	  		}else{
  	  		list1.add(list.get(i)[1]);
  	  		list2.add(list.get(i)[3]);
  	  		}
  	  	}
  	  //这部分是用的jfreechart的画图
  	  JFreeChart chart = createChart(createDataset(list1,list2));
  	  BufferedImage bi = chart.createBufferedImage(600, 600);
  	  ByteArrayOutputStream out1 = new ByteArrayOutputStream();
  	  ImageIO.write(bi,"png", out1);
  	  byte[] data = out1.toByteArray();

			Image image;
			try {
				image = Image.getInstance(data);
			    image.scalePercent(90); 
			    image.setAlignment(Image.MIDDLE);  
			    // 图片位置  
			    PdfPTable imageTable = new PdfPTable(2);
			    imageTable.setWidthPercentage(60);  
				document.add(table);
				document.add(table1);
				document.add(image);  
				document.add(imageTable);
			} catch (BadElementException e) {
				System.out.println("添加图片error");
			} catch (DocumentException e) {
				System.out.println("ai");
			}
			//关闭document
		    document.close();
		    //生成pdf文档品并响应客户端
			response.setContentLength(bos.size());
			ServletOutputStream out = response.getOutputStream();
			response.setContentLength(bos.size());
			bos.writeTo(out);
			out.close();
			out.flush();
			bos.close();
			bos.flush();   	 
		
	}
	/**
	 * @author artisamSplit
	 * @return List<List<String>>
	 * @since 14.04.28
	 */
	public static List<List<String>> getHeadList(String csvname,String rangeparam,String filterparam,String rangetype,String starttime,String endtime){
		List<List<String>> headList = new ArrayList<List<String>>();
		List<String> secondList1 = new ArrayList<String>();
		secondList1.add("统计站点名称:");
		secondList1.add("飞鹤乳业");
		List<String> secondList2 = new ArrayList<String>();
		secondList2.add("统计站点范围:");
		secondList2.add("www.feihe.com");
		List<String> secondList3 = new ArrayList<String>();
		secondList3.add("过滤器类型:");
		secondList3.add(filterparam);
		List<String> secondList4 = new ArrayList<String>();
		secondList4.add("合参页面:");
		secondList4.add("www.feihe.com");
		List<String> secondList5 = new ArrayList<String>();
		secondList4.add("开始时间:");
		secondList4.add(starttime);
		List<String> secondList6 = new ArrayList<String>();
		secondList4.add("结束时间:");
		secondList4.add(endtime);
		
		headList.add(secondList1);
		headList.add(secondList2);
		headList.add(secondList3);
		headList.add(secondList4);
		headList.add(secondList5);
		headList.add(secondList6);
		return headList;
	}
	/**
	 * @author artisamSplit
	 * @param XYDataset
	 */
    private static XYDataset createDataset(List<String> list1,List<String> list2) {

        TimeSeries s1 = new TimeSeries("FW");
        for(int i=1;i<=12;i++){
        	if(i%12==0){
        	  s1.add(new Month(12, 2005+i/12-1), Integer.parseInt(list1.get(i-1)));	
        	}else{
        	  s1.add(new Month(i%12, 2005+i/12), Integer.parseInt(list1.get(i-1)));
        	}
        }
        TimeSeries s2 = new TimeSeries("PV");
        for(int i=1;i<=12;i++){
        	if(i%12==0){
        	  s2.add(new Month(12, 2005+i/12-1), Integer.parseInt(list2.get(i-1)));	
        	}else{
        	  s2.add(new Month(i%12, 2005+i/12), Integer.parseInt(list2.get(i-1)));
        	}
        }
        TimeSeriesCollection dataset = new TimeSeriesCollection();
        dataset.addSeries(s1);
        dataset.addSeries(s2);

        return dataset;

    }
	/**
	 * @author artisamSplit
	 * @param dataset
	 * @return chart
	 */
    private static JFreeChart createChart(XYDataset dataset) {
		StandardChartTheme sct = new StandardChartTheme("CN");
		sct.setExtraLargeFont(new Font("隶书", Font.BOLD, 8));
		sct.setRegularFont(new Font("隶书", Font.BOLD, 8));
		sct.setLargeFont(new Font("隶书", Font.BOLD, 8));
		ChartFactory.setChartTheme(sct);
        JFreeChart chart = ChartFactory.createTimeSeriesChart(
            "访问量对比曲线图",  	// title
            "PV",             	// x-axis label
            "访问量",   			// y-axis label
            dataset,            // data
            true,               // create legend?
            true,               // generate tooltips?
            false               // generate URLs?
        );
        try{
        chart.setBackgroundPaint(Color.white);

        XYPlot plot = (XYPlot) chart.getPlot();
        plot.setBackgroundPaint(Color.white);
        plot.setDomainGridlinePaint(Color.white);
        plot.setRangeGridlinePaint(Color.white);
        plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0));
        plot.setDomainCrosshairVisible(true);
        plot.setRangeCrosshairVisible(true);

        XYItemRenderer r = plot.getRenderer();
        if (r instanceof XYLineAndShapeRenderer) {
            XYLineAndShapeRenderer renderer = (XYLineAndShapeRenderer) r;
            renderer.setBaseShapesVisible(true);
            renderer.setBaseShapesFilled(true);
            renderer.setDrawSeriesLineAsPath(true);
        }
        DateAxis axis = (DateAxis) plot.getDomainAxis();
        axis.setDateFormatOverride(new SimpleDateFormat("MMM-yyyy"));
        }catch(Exception e){
        	System.out.println("error");
        }
        return chart;
    }
}
最近下载更多
xxy007  LV1 2020年10月18日
sureivv  LV2 2020年6月11日
yaosiming  LV8 2020年4月14日
chinavbao  LV2 2020年3月2日
sssssssyy  LV10 2019年9月27日
yaoyahui  LV7 2019年6月28日
皮皮虾一月  LV8 2019年4月25日
zh11332  LV11 2019年3月5日
xiaomiao520  LV12 2018年10月10日
2359923694  LV2 2018年8月31日
最近浏览更多
3334004690  LV10 5月27日
fesfefe  LV13 2023年11月1日
1529860026  LV24 2023年7月6日
潇靓84 2023年4月14日
暂无贡献等级
东北人  LV12 2022年9月20日
543539666  LV7 2022年3月3日
来恬爸爸晋亚阳  LV3 2021年10月29日
陈永智 2021年10月8日
暂无贡献等级
dfaghrs  LV19 2021年9月21日
安安an  LV17 2021年9月10日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友