这周写了导出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());
}
}