利用poi,iText导出excel,pdf

  先声明下,本人对poi,iText没有深入研究,只因网上实例很多,所以照葫芦画瓢,再加上自己进一步的重构,才有了下面的模型.只希望能帮助到大家。
//创建ExcelEntity
import java.io.OutputStream;
import java.util.List;

public class ExcelEntity<T> {
	
	private String title = "报表标题";
	private String[] headers;
	private List<T> dataset;
	private OutputStream os;
	private boolean hasComment = false;
	private String commentContent = "report";
	private String commentAuthor = "Galo";
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String[] getHeaders() {
		return headers;
	}
	public void setHeaders(String[] headers) {
		this.headers = headers;
	}
	public List<T> getDataset() {
		return dataset;
	}
	public void setDataset(List<T> dataset) {
		this.dataset = dataset;
	}
	public OutputStream getOs() {
		return os;
	}
	public void setOs(OutputStream os) {
		this.os = os;
	}
	public boolean isHasComment() {
		return hasComment;
	}
	public void setHasComment(boolean hasComment) {
		this.hasComment = hasComment;
	}
	public String getCommentContent() {
		return commentContent;
	}
	public void setCommentContent(String commentContent) {
		this.commentContent = commentContent;
	}
	public String getCommentAuthor() {
		return commentAuthor;
	}
	public void setCommentAuthor(String commentAuthor) {
		this.commentAuthor = commentAuthor;
	}
}

//创建PdfEntity
import java.io.OutputStream;
import java.util.List;

public class PdfEntity<T> {
	
	private String title; //标题
	private float margin_bottom = 50; //下边距
	private float margin_left = 50;
	private float margin_top = 50;
	private float margin_right = 50;
	private String pageSize = "A4";	//纸张大小
	private String fileName = "E://report.pdf"; //文件名称
	private String author = "Galo"; //作者
	private String subject = "Zhang";	//子项
	private boolean creationDate = true;	//创建时间
	private String creator = "Galo"; //创建者
	private String keywords = "报表"; //关键字
	private String pageHeader; //页眉
	private String pageFooter; //页脚
	
	private String[] headers;	//表头
	private List<T> dataset;	//数据集
	private OutputStream os;	//文件输出流
	
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public float getMargin_bottom() {
		return margin_bottom;
	}
	public void setMargin_bottom(float margin_bottom) {
		this.margin_bottom = margin_bottom;
	}
	public float getMargin_left() {
		return margin_left;
	}
	public void setMargin_left(float margin_left) {
		this.margin_left = margin_left;
	}
	public float getMargin_top() {
		return margin_top;
	}
	public void setMargin_top(float margin_top) {
		this.margin_top = margin_top;
	}
	public float getMargin_right() {
		return margin_right;
	}
	public void setMargin_right(float margin_right) {
		this.margin_right = margin_right;
	}
	public String getPageSize() {
		return pageSize;
	}
	public void setPageSize(String pageSize) {
		this.pageSize = pageSize;
	}
	public String getFileName() {
		return fileName;
	}
	public void setFileName(String fileName) {
		this.fileName = fileName;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public String getSubject() {
		return subject;
	}
	public void setSubject(String subject) {
		this.subject = subject;
	}
	public boolean isCreationDate() {
		return creationDate;
	}
	public void setCreationDate(boolean creationDate) {
		this.creationDate = creationDate;
	}
	public String getCreator() {
		return creator;
	}
	public void setCreator(String creator) {
		this.creator = creator;
	}
	public String getKeywords() {
		return keywords;
	}
	public void setKeywords(String keywords) {
		this.keywords = keywords;
	}
	public String getPageHeader() {
		return pageHeader;
	}
	public void setPageHeader(String pageHeader) {
		this.pageHeader = pageHeader;
	}
	public String getPageFooter() {
		return pageFooter;
	}
	public void setPageFooter(String pageFooter) {
		this.pageFooter = pageFooter;
	}
	public String[] getHeaders() {
		return headers;
	}
	public void setHeaders(String[] headers) {
		this.headers = headers;
	}
	public List<T> getDataset() {
		return dataset;
	}
	public void setDataset(List<T> dataset) {
		this.dataset = dataset;
	}
	public OutputStream getOs() {
		return os;
	}
	public void setOs(OutputStream os) {
		this.os = os;
	}
}

//下面是具体导出方法
import java.awt.Color;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Iterator;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;

import com.jd.report.entity.ExcelEntity;
import com.jd.report.entity.PdfEntity;
import com.jd.report.util.PdfParagraph;
import com.lowagie.text.Cell;
import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Element;
import com.lowagie.text.HeaderFooter;
import com.lowagie.text.PageSize;
import com.lowagie.text.Rectangle;
import com.lowagie.text.pdf.PdfPCell;
import com.lowagie.text.pdf.PdfPTable;
import com.lowagie.text.pdf.PdfWriter;

public class ExportUtils<T> {
	
	@SuppressWarnings("unchecked")
	public void exportPdf(PdfEntity<T> pdfEntity){
		
		String pageSize = pdfEntity.getPageSize();
		
		Rectangle rectangle = new Rectangle(getPdfPageSize(pageSize));
		Document document = new Document(rectangle,pdfEntity.getMargin_bottom(),pdfEntity.getMargin_left(),pdfEntity.getMargin_right(),pdfEntity.getMargin_top());
		
		try {
			PdfWriter.getInstance(document, pdfEntity.getOs());
			//基本配置信息
			document.addTitle(pdfEntity.getTitle());
			document.addAuthor(pdfEntity.getAuthor());
			if(pdfEntity.isCreationDate()){
				
				document.addCreationDate();
			}
			document.addCreator(pdfEntity.getCreator());
			document.addKeywords(pdfEntity.getKeywords());
			document.addSubject(pdfEntity.getSubject());
			
			//定义页眉和页脚
			String pageHeader = pdfEntity.getPageHeader();
			String pageFooter = pdfEntity.getPageFooter();
			HeaderFooter header = null;
			HeaderFooter footer = null;
			if(pageHeader != null){
				
				header = new HeaderFooter(new PdfParagraph(pageHeader,14,true),false);
				header.setBorderWidth(0);
				header.setAlignment(Element.ALIGN_CENTER);
			}
			if(pageFooter != null){
				
				footer = new HeaderFooter(new PdfParagraph(pageFooter,14,true),false);
				footer.setBorderWidth(0);
				footer.setAlignment(Element.ALIGN_CENTER);
			}
			document.setHeader(header);
			document.setFooter(footer);
			//打开pdf文档
			document.open();
			
			String[] headers = pdfEntity.getHeaders();
			//创建多少列的表格
			PdfPTable table = new PdfPTable(headers.length);
			table.setHorizontalAlignment(Element.ALIGN_CENTER);
	        table.setWidthPercentage(16 * headers.length);
	        
	        //产生表格栏
	        PdfPCell cell = null;
	        for (int i = 0; i < headers.length; i++) {

	            cell = new PdfPCell(new PdfParagraph(headers[i], 14,true));
	            cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
	            cell.setVerticalAlignment(Cell.ALIGN_MIDDLE);
	            cell.setBackgroundColor(Color.cyan);
	            cell.setBorderColor(Color.green);
	            table.addCell(cell);
	         }
	        //装载数据行
	        Collection<T> dataset = pdfEntity.getDataset();
	        Iterator<T> it = dataset.iterator();
	        while(it.hasNext()){
	        	
	        	T t = it.next();
	        	Class tClass = t.getClass();
	        	Field[] fields = tClass.getDeclaredFields();
	        	for (int i = 0; i < fields.length; i++) {
					
	        		String fieldName = fields[i].getName();
	        		String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
	        		Method getMethod = tClass.getMethod(getMethodName, new Class[]{});
	        		Object value = getMethod.invoke(t, new Object[]{});
	        		value = value == null ? "" : value;
	        		if(value != null){
	        			
	        			cell = new PdfPCell(new PdfParagraph(value.toString(),12,false));
	        			cell.setHorizontalAlignment(Cell.ALIGN_CENTER);
	                    cell.setVerticalAlignment(Cell.ALIGN_MIDDLE);
	                    cell.setBorderColor(Color.green);
	                    table.addCell(cell);
	        		}
				}
	        }
	        document.add(table);
	        document.close();
			
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (SecurityException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (NoSuchMethodException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	@SuppressWarnings("unchecked")
	public void exportExcel(ExcelEntity excelEntity){
		
		String title = excelEntity.getTitle();
		HSSFWorkbook workbook = new HSSFWorkbook();
		//生成一个表格
		HSSFSheet sheet = workbook.createSheet(title);
		//设置默认列宽度为15个字节
		sheet.setDefaultColumnWidth(15);
		//生成一个标题样式
		HSSFCellStyle style = workbook.createCellStyle();
		//设置居中
		style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		//设置填充前景色和背景色
		style.setFillForegroundColor(HSSFColor.YELLOW.index);
		style.setFillBackgroundColor(HSSFColor.WHITE.index);
		style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		//设置线条宽度
		style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		style.setBorderRight(HSSFCellStyle.BORDER_THIN);
		style.setBorderTop(HSSFCellStyle.BORDER_THIN);
		//生成一个字体
		HSSFFont font = workbook.createFont();
		font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		font.setColor(HSSFColor.VIOLET.index);
		font.setFontHeightInPoints((short)12);
		//字体应用到样式
		style.setFont(font);
		
		//生成主体样式
		HSSFCellStyle bodyStyle = workbook.createCellStyle();
		//设置居中
		bodyStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		//设置填充前景色和背景色
		bodyStyle.setFillForegroundColor(HSSFColor.WHITE.index);
		bodyStyle.setFillBackgroundColor(HSSFColor.WHITE.index);
		bodyStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
		//设置线条宽度
		bodyStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
		bodyStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
		bodyStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
		bodyStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
		//生成一个字体
		HSSFFont bodyFont = workbook.createFont();
		bodyFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		bodyFont.setColor(HSSFColor.VIOLET.index);
		bodyFont.setFontHeightInPoints((short)12);
		//字体应用到样式
		bodyStyle.setFont(bodyFont);
		
		HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
		HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0,0,0,(short)4,2,(short)6,5));
		comment.setString(new HSSFRichTextString(excelEntity.getCommentContent()));
		comment.setAuthor(excelEntity.getCommentAuthor());
		
		//产生标题行
		String[] headers = excelEntity.getHeaders();
		int index = 0;
		HSSFRow row = sheet.createRow(index);
		HSSFCell cell = null;
	    for (short i = 0; i < headers.length; i++) {

	      cell = row.createCell(i);
	      cell.setCellStyle(style);
	      HSSFRichTextString text = new HSSFRichTextString(headers[i]);
	      cell.setCellValue(text);
	    }
	    //遍历集合,产生数据行
	    Collection<T> dataset = excelEntity.getDataset();
	    Iterator<T> it = dataset.iterator();
	    while(it.hasNext()){
	    	
	    	index++;
	    	row = sheet.createRow(index);
	    	T t = it.next();
	    	Class tClass = t.getClass();
	    	Field[] fields = tClass.getDeclaredFields();
	    	for (int i = 0; i < fields.length; i++) {
				
	    		cell = row.createCell(i);
	    		cell.setCellStyle(style);
	    		String fieldName = fields[i].getName();
	    		String getMethodName = "get" + fieldName.substring(0,1).toUpperCase() + fieldName.substring(1);
	    		try {
					Method getMethod = tClass.getMethod(getMethodName, new Class[]{});
					Object value = getMethod.invoke(t, new Object[]{});
					value = value == null ? "" : value;
					if(value != null){
						
						HSSFRichTextString textString = new HSSFRichTextString(value.toString());
						cell.setCellValue(textString);
						cell.setCellStyle(bodyStyle);
					}
				} catch (SecurityException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NoSuchMethodException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
	    }
	    try {
	    	//写出excel
			workbook.write(excelEntity.getOs());
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	public void exportWord(){
		
		
	}
	public Rectangle getPdfPageSize(String pageSize){
		
		Rectangle pSize = null;
		if("A4".equals(pageSize)){
			
			pSize = PageSize.A4;
		}else if("A3".equals(pageSize)){
			
			pSize = PageSize.A3;
		}else if("A2".equals(pageSize)){
			
			pSize = PageSize.A2;
		}else if("A1".equals(pageSize)){
			
			pSize = PageSize.A1;
		}else{
			
			pSize = PageSize.A4;
		}
		
		return pSize;
	}
}

//对于pdf中文乱码,有如下辅助类
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import com.lowagie.text.BadElementException;
import com.lowagie.text.Cell;
import com.lowagie.text.Chunk;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Font;
import com.lowagie.text.Paragraph;
import com.lowagie.text.Phrase;
import com.lowagie.text.pdf.BaseFont;

public class PdfParagraph extends Paragraph {

   private static final long serialVersionUID = -244970043180837974L;
   private static Properties pro ;
   private static InputStream is ;
   static{
		try {
           is =  PdfParagraph.class.getClassLoader().getResourceAsStream("fontSrc.properties");
			pro = new Properties();
			pro.load(is);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally{
			
			try {
				is.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	} 
   public static String getPlan(String source){
	   
	   return pro.getProperty(source);
   }
   
   public PdfParagraph(String content) {

      super(content, getChineseFont(12, false));
   }

   public PdfParagraph(String content, int fontSize, boolean isBold) {

      super(content, getChineseFont(fontSize, isBold));
   }

   // 设置字体-返回中文字体
   protected static Font getChineseFont(int nfontsize, boolean isBold) {

      BaseFont bfChinese;
      Font fontChinese = null;

      try {
    	  
         bfChinese = BaseFont.createFont(getPlan("fontSrc") + ":\\windows\\fonts\\simsun.ttc,1",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
         if (isBold) {

            fontChinese = new Font(bfChinese, nfontsize, Font.BOLD);
         } else {

            fontChinese = new Font(bfChinese, nfontsize, Font.NORMAL);
         }

      } catch (DocumentException e) {

         // TODO Auto-generated catch block
         e.printStackTrace();
      } catch (IOException e) {

         // TODO Auto-generated catch block
         e.printStackTrace();
      }
      return fontChinese;
   }

   // 转化中文
   protected Cell ChangeCell(String str, int nfontsize, boolean isBold) throws IOException, BadElementException, DocumentException {

      Phrase ph = ChangeChinese(str, nfontsize, isBold);
      Cell cell = new Cell(ph);
      // cell.setBorderWidth(3);
      return cell;
   }

   // 转化中文
   protected Chunk ChangeChunk(String str, int nfontsize, boolean isBold) throws IOException, BadElementException, DocumentException {

      Font FontChinese = getChineseFont(nfontsize, isBold);
      Chunk chunk = new Chunk(str, FontChinese);
      return chunk;
   }

   // 转化中文
   protected Phrase ChangeChinese(String str, int nfontsize, boolean isBold) throws IOException, BadElementException, DocumentException {

      Font FontChinese = getChineseFont(nfontsize, isBold);
      Phrase ph = new Phrase(str, FontChinese);
      return ph;
   }
   
   }
}



  代码写了很长时间了,现在也忘记结构了,大概应该能够帮助到需要的朋友.

你可能感兴趣的:(apache,数据结构,windows,Excel,OS)