导出Excel:导出所有字段(多字段)

这周写了导出Excel表格,要导出表的所有字段,大概一起有七八十个字段,而且要把必填字段写在最前面。刚开始很头疼,不知道怎么下手,刚开始想得是在SQL语句里面把所有字段按顺序,一个一个查出,后来太麻烦了。然后大神就写了一个很方便的方法。
1.写一个导出Excel的实体类,把字段名称直接写出来,并且按照顺序把字段写好,里面只需要写字段的setter方法。

public class BaseBargeExel {
	private static final Map<String, String> CARGOTYPE = CargoCache.getInstance().getItems(CargoItem.CARGO_TYPE.name());
	private static final  Map<String, String> CARGOVALUE = CargoCache.getInstance().getItems(CargoItem.CARGO_NAME.name());
	private static final  SimpleDateFormat FORMAT= new SimpleDateFormat("yyyy-MM-dd HH-mm");
	
	@ExcelTitle("船名")
	private String vesselName;     			// 船名   nvarchar(128) NULL ,
	@ExcelTitle("船主")
	private String shipOwner;     			// 船主   nvarchar(64) NULL ,
	@ExcelTitle("手机号码")
	private String phoneNumber;     		// 手机号码   nvarchar(32) NULL ,
	@ExcelTitle("载货类型")
	private String cargoType;     			// 载货类型   nvarchar(32) NULL ,
	@ExcelTitle("载货品种")
	private String cargoValue;     			// 载货品种   nvarchar(32) NULL ,
	@ExcelTitle("发证日期")
	private String issue_date;//发证日期
	@ExcelTitle("是否存在图片")
	private String isExistImg;				//是否存在图片(0无 1有)
	
	public void setVesselName(String vesselName) {
		this.vesselName = vesselName;
	}
	public void setShipOwner(String shipOwner) {
		this.shipOwner = shipOwner;
	}
	public void setPhoneNumber(String phoneNumber) {
		this.phoneNumber = phoneNumber;
	}
	public void setCargoType(String cargoType) {
		this.cargoType = CARGOTYPE.get(cargoType);
	}
	public void setCargoValue(String cargoValue) {
		this.cargoValue = CARGOVALUE.get(cargoValue);
	}
	public void setIssue_date(Date issue_date) {
		if(issue_date != null){
			this.issue_date = FORMAT.format(issue_date);
		}else{
			this.issue_date = "" ;
		}
	}
	public void setIsExistImg(Integer isExistImg) {
		this.isExistImg = (isExistImg == null || 0 == isExistImg) ? "无" : "有";
	}
	}

*2.在Dao层写SQL 语句,查询.会自动找到相应的字段,省了很多时间。

@SuppressWarnings("unchecked")
	public List<BaseBargeExel> queryBarge(Map<String, Object> map)
	{
		LOG.debug("导出驳船信息");
		StringBuilder builder = new StringBuilder();
		List<Object> list = new ArrayList<Object>();
		builder.append("SELECT b.*,bv.vesselName as fleetName FROM base_barge b "
				+ "LEFT JOIN base_vessel bv on b.fleetId  = bv.vesselId "
				+ "where 1=1 " );
		Object value = null;
		if(!CommonTool.isObjNullOrEmpty(value = map.get("vesselName")))
		{
			builder.append(" and b.vesselName like ? ");
			list.add("%" + value + "%");
		}
		builder.append(" order by b.regTime desc ");
		return jdbcTemplate.query(builder.toString(), list.toArray(),new BeanPropertyRowMapper<BaseBargeExel>(BaseBargeExel.class));
	}

3.Controller:这个方法很方便、通用的,用的时候只需要把实体类类名改一下,引用的方法改一下就可以用了。

@RequestMapping(value = "/bargeExcelDownload.action", method = RequestMethod.GET)
	@SuppressWarnings("unchecked")
	public void execlDownload(HttpServletRequest request, HttpServletResponse response, String data)
	{
		Map<String, Object> map = (Map<String, Object>)CommonTool.strToJson(data, Map.class);
		List<Object[]> vesselList = new ArrayList<Object[]>();
		List<String> title = new ArrayList<String>(); //标题
		List<BaseBargeExel> queryBarge = bargeDao.queryBarge(map);
		boolean addTitle = true; //第一次添加列标题
		for (BaseBargeExel BaseBargeExel : queryBarge) {
			List<Object>  rowdata= new ArrayList<Object>();
			try{
				 Field[] fields = BaseBargeExel.getClass().getDeclaredFields();  
		         for(int i=0; i<fields.length; i++){  
		             Field f = fields[i];  
		             if(addTitle){
		            	 getTitleList(f, title); //添加列标题
		             }
		             boolean isStatic = Modifier.isStatic(f.getModifiers()); //判断是不是静态方法
		             if(!isStatic){
		            	 f.setAccessible(true);  
		            	 try {
		            		 rowdata.add( f.get(BaseBargeExel));
		            	 } catch (IllegalArgumentException e) {
		            		 e.printStackTrace();
		            	 } catch (IllegalAccessException e) {
		            		 e.printStackTrace();
		            	 }  
		             }
		         }  
		        addTitle= false;
				vesselList.add(rowdata.toArray());
			}catch (Exception e) {
				e.printStackTrace();
			}
		}
		String execlName = "驳船注册信息";
		ExportExcel.getInstance().export(request, response, title.toArray(new String[title.size()]), vesselList, execlName);
	}
	
	/**
	 * 将注解上的名称放到 title 的 集合里
	 * @param field
	 * @param list
	 */
	private void getTitleList(Field field,List<String> list){
		boolean fieldHasAnno = field.isAnnotationPresent(ExcelTitle.class);  
        if(fieldHasAnno){  //判断是否有注解
			ExcelTitle title = field.getAnnotation(ExcelTitle.class); 
			list.add(title.value());
        }
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值