JAVA导出报表 ExportExcel

      这是一个通过配置模板导出报表的JAR包,只适用于小数据量的报表导出,如果数据量超过Excel最大行数(65536)需要自行添加文件打包后下载的功能。 

    

  依赖 POI-3.0.jar

 

package com.goma.exportexcel;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
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.poifs.filesystem.POIFSFileSystem;

/**
 * DESC: 读取模板导出Excel报表<BR>
 * AUTHOR: GuoMM ( Goma ) [email protected]<BR>   
 * VERSION: 1.0<BR>
 * DATE:2011-11-7 14:23:51<BR>
 */
public class ExportExcel {
	private String fileUrl;
	/**
	 * 
	 * @param fileUrl 模板路径<br>
	 * DESC:创建实例,并初始化模板<br>
	 */
	public ExportExcel(String fileUrl){
		this.fileUrl = fileUrl;
	}
	
	/**
	 * 
	 * @param rows 模板内配置所占行数<br>
	 * @param cols 模板内配置所占列数<br>
	 * @param result 要导出报表的数据集<br>
	 * @return excel报表<br>
	 * 
	 */
	public InputStream export(int rows,int cols,List<?> result){
		try{
			File file = new File(fileUrl);   
			FileInputStream fint = new FileInputStream(file);   
			POIFSFileSystem poiFileSystem = new POIFSFileSystem(fint);   
			HSSFWorkbook wb = new HSSFWorkbook(poiFileSystem); 
		    HSSFSheet sheet = wb.getSheetAt(0);
		    GetProperty gp = new GetProperty();
		    HSSFRow namesRow = sheet.getRow(rows-2);
		    HSSFRow typeRow = sheet.getRow(rows-1);
		    
		    for(int i=0;i<result.size();i++){
		    	HSSFRow row = sheet.getRow(rows+i);
			    if(row==null){
			    	row = sheet.createRow(rows+i);
			    }
			    for(int j=0;j<cols;j++){
				    HSSFCell cell = row.getCell((short)j);
				    if (cell == null){
				        cell = row.createCell((short)j);
				    }
				    //获得方法名
				    HSSFCell nameCell = namesRow.getCell((short)j);
				    HSSFCell typeCell = typeRow.getCell((short)j);
				    String name = nameCell.getRichStringCellValue().getString();
				    String type = typeCell.getRichStringCellValue().getString();
				    //java反射机制获得方法值
				    Object obj = gp.getProperty(name, result.get(i).getClass(), result.get(i));
                    //写入Excel中
				    if("Number".equals(type)){
					    cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);
					    if(obj!=null&&!"".equals(obj)){
						    cell.setCellValue(Double.valueOf(String.valueOf(obj)));
					    }else{
						    cell.setCellValue(0);
					    }
				    }else{
				    	cell.setCellType(HSSFCell.CELL_TYPE_STRING);
				    	if(obj==null){
				    		cell.setCellValue(new HSSFRichTextString(""));
				    	}else{
				    		cell.setCellValue(new HSSFRichTextString(String.valueOf(obj)));
				    	}
				    }
			    }
		    }
		    
		    sheet.shiftRows(rows, result.size()+rows, -2);
		    System.out.println("WRITE EXCEL REPORT IS OK..");
		    ByteArrayOutputStream os = new ByteArrayOutputStream();
		    wb.write(os);
		    byte[] content = os.toByteArray();
		    InputStream is = new ByteArrayInputStream(content);
		    return is;
		    
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return null;
		}
	}
}

 

 

package com.goma.exportexcel;

import java.lang.reflect.Method;

/**
 * DESC:通过java反射机制执行类方法<BR>
 * author:GuoMM(Goma) [email protected]<BR>
 * version:1.0<BR>
 * Date:2011-11-7 14:22:21<BR> 
 */
public class GetProperty {

	/**
	 * 
	 * @param propertyName 方法名<br>
	 * @param cls 类Class<br>
	 * @param obj 对象<br>
	 * @return 返回对象obj.propertyName的执行结果<br>
	 */
	public Object getProperty(String propertyName,Class<?> cls,Object obj){
		try{
			if(propertyName!=null &&!"".equals(propertyName)){
				Method method = cls.getMethod(propertyName);
				return method.invoke(obj);
			}
			return null;
		}catch (Exception e) {
			// TODO: handle exception
			e.printStackTrace();
			return null;
		}
	}
	
}

 

 

 

List<TeamModelVO> ls = dao.getData(sql.toString(), TeamModelVO.class);
System.out.println(ls.size()+"::::Export:::::");
String fileUrl = request.getSession().getServletContext().getRealPath(
        "/console/Resources/platformat/型号盈利能力分析.xls");
ExportExcel ee = new ExportExcel(fileUrl);
InputStream is = ee.export(6, 53, ls);
response.addHeader("Content-Disposition","attachment;filename=Report.xls");
ServletOutputStream out = response.getOutputStream();
byte[] buffer=new byte[1024];
int count;
while((count=is.read(buffer))!=-1){
	out.write(buffer, 0, count);
}
return null;

 

 

你可能感兴趣的:(Export)