原创:JAVA对象生成EXCEL通用代码

注解:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AnnoExcel {
/**
*EXCEL的中文名称
* @return
*/
String name();

/**
* 排序
* @return
*/
int id();

/**
* 是否显示
* @return
*/
String show();
}


类:
public class ExcelUtil {
private Class clazz;//需要打印的对象
private String outputFileName;//打印的路径
private List<Object> infoList;//打印的数据
private int pageSize=30;//设置一页放多少行数据
private Field[] fields; //字段属性
/**
*
* @param outputFile 输出的目标EXCEL文件
* @param pageSize 每页显示的行数
* @param infoList 传入的输出对象
* @param clazz 传入对象的CLASS
*/
public ExcelUtil(String outputFile,int pageSize,List infoList,Class clazz) {
this.outputFileName=outputFile;
this.pageSize=pageSize;
this.infoList=infoList;
this.clazz=clazz;
fields=clazz.getDeclaredFields();//获取clazz中的所有属性
Field.setAccessible(fields, true);
}

/**
*
* @param outputFile 输出的目标EXCEL文件
* @param infoList 传入的输出对象
* @param clazz 传入对象的CLASS
*/
public ExcelUtil(String outputFile,List infoList,Class clazz) {
this.outputFileName=outputFile;
this.infoList=infoList;
this.clazz=clazz;
fields=clazz.getDeclaredFields();//获取clazz中的所有属性
Field.setAccessible(fields, true);
}

public void ListConverExcel()throws Exception
{
File f=new File(outputFileName);
//如果存在相同文件名称,则删除,并创建相同文件的空文件
if(f.exists())
{
f.delete();
}
f.createNewFile();
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new FileOutputStream(f));//制定文件路径
jxl.write.WritableSheet ws=null;//在后面利用pages写出需要的sheet的页数
jxl.write.Label labelC=null;
String tName=clazz.getName().substring(clazz.getName().lastIndexOf(".")+1);//根据拿到的名字,给sheet命名
int listSize=infoList.size();//判断list数据源中有多少条数据
int pages=1;//设置页面最少为一页
if(listSize>pageSize){//当数据条数大于每页显示的数据的情况下,计算出总页数
if(listSize%pageSize !=0){
pages=listSize/pageSize+1;
}else{
pages=listSize/pageSize;
}
}
Iterator iterator= infoList.listIterator();
//循环字段,并对ID进行排序,把不显示的字段去掉
List<Map.Entry> fieldList= idToField();
Object o=null;
//输出至Excel
for(int ml=1;ml<=pages;ml++)
{
ws=wwb.createSheet(tName+ml, ml+1);
//循环输出
int row=0;//表示行
for(int i=1;i<=pageSize;i++)
{
int col=0; //表示列
//判断是否还有对象
if(!iterator.hasNext())break;
o=iterator.next();
for(Map.Entry entry : fieldList)
{
//循环字段所有属性
for(int fi=0;fi<fields.length;fi++){
//如果相等
if(entry.getKey().equals(fields[fi].getName()))
{
if(row==0)//设置标题
{
AnnoExcel titName=fields[fi].getAnnotation(AnnoExcel.class);//获取属性上面的注解的值
labelC=new jxl.write.Label(col,row,titName.name());
ws.addCell(labelC);
col++;
break;
}

//设置内容
labelC=new jxl.write.Label(col,row,fields[fi].get(o).toString());
ws.addCell(labelC);
col++;
break;//跳此循环
}
}
}
row++;
}//每页的每行输出
}//每页

//写入Exel工作表
wwb.write();
//关闭Excel工作薄对象
wwb.close();
}

/**
*
* @return key 属性名称 value ID值
* @throws Exception
*/
private List<Map.Entry> idToField() throws Exception{
Map<String,Integer> feildMap=new HashMap<String, Integer>();

for(int i=0;i<fields.length;i++){
//如果字段类型属于此EXCEL注解
Field field= fields[i];
if(field.isAnnotationPresent(AnnoExcel.class)){
AnnoExcel idVal=fields[i].getAnnotation(AnnoExcel.class);
if(idVal.show().equals("false"))continue;
feildMap.put(field.getName(),idVal.id());
}
}
//进行排序
List<Map.Entry> arrayList = new ArrayList(feildMap.entrySet());
Collections.sort(arrayList, new Comparator() {
public int compare(Object o1, Object o2) {
Map.Entry obj1 = (Map.Entry ) o1;
Map.Entry obj2 = (Map.Entry) o2;
int i=0;
if((Integer)obj1.getValue()<(Integer)obj2.getValue())i=1;
return i;
}
});
return arrayList;
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值