利用Java反照实现通用的Excel报表

利用Java反射实现通用的Excel报表
最近有很多客户报表需要提供客户下载,需要生成一个Excel的格式文件,所以写了
一个通用的Excel报表生成代码供各个地方使用:
	public <T> void createExcelReport(List<T> reports,Map<String,String> headerMap,OutputStream output) throws IOException {
		if(reports == null || reports.isEmpty()) return;
		
		Workbook wb = new HSSFWorkbook();
		HSSFSheet sheet = (HSSFSheet) wb.createSheet("报表");
		HSSFRow row = sheet.createRow(0);
		
		//create header
		Object report = reports.get(0);
		Field[] fields = report.getClass().getDeclaredFields();
		for(int i = 0; i < fields.length; i++){
			String headValue = headerMap.get(fields[i].getName());
			row.createCell(i).setCellValue(headValue);
			sheet.setColumnWidth(i, 20 * 256);
		}
		
		//fill the data
		for(int i = 0; i < reports.size(); i++){
			Object rp = reports.get(i);
			row = sheet.createRow(i+1);
			for(int j = 0; j < fields.length; j++){
				String getMethodName = "get" + StringUtils.capitalize(fields[j].getName());
				Method method = null;
				try {
					method = rp.getClass().getMethod(getMethodName, null);
				}catch(NoSuchMethodException e){//for boolean type isField
					getMethodName = "is" + StringUtils.capitalize(fields[j].getName());
					try {
						method = rp.getClass().getMethod(getMethodName, null);
					} catch (Exception ex){
						throw new RuntimeException("Create Report failed!",ex);
					}
				}
				if(method != null){
					Object value;
					try {
						value = method.invoke(rp);
						value = value == null ? "" : value;
						row.createCell(j).setCellValue(value.toString());
					} catch (Exception e) {
						throw new RuntimeException("Create Report failed!",e);
					}
				}
			}
		}
		wb.write(output);
	}