JAVA WEB的Excel导出的通用型方法
下面是一个工具类, fillExcelDataWithTemplate()是生成EXCEL的方法, ConvertObjToMap()是将数据库取出的实体类对象转为List的方法
public class OutExcel {
public static HSSFWorkbook fillExcelDataWithTemplate(List<List> list, String[] titles, String sheetname) {
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(sheetname);//名称
Integer rownum = titles.length;
sheet.setDefaultColumnWidth(rownum + 4);
HSSFRow row0 = sheet.createRow(0);
int count = 0;
for (int i = 0; i < titles.length; i++) {
while (titles[i].equals("1")) {
i++;
count++;
if (i >= titles.length) {
break;
}
}
if (i >= titles.length) {
break;
}
row0.createCell(i - count).setCellValue(titles[i]);
}
int rowIndex = 1;
HSSFRow row;
for (List list1 : list) {
row = sheet.createRow(rowIndex);
rowIndex++;
int count1 = 0;
for (int i = 0; i < list1.size(); i++) {
while (titles[i].equals("1")) {
i++;
count1++;
if (i >= titles.length) {
break;
}
}
if (i >= titles.length) {
break;
}
row.createCell(i - count1).setCellValue((String) list1.get(i));
}
}
return wb;
}
public static ArrayList ConvertObjToMap(Object obj) {
ArrayList<String> list = new ArrayList<String>();
if (obj == null)
return null;
Field[] fields = obj.getClass().getDeclaredFields();
try {
for (int i = 0; i < fields.length; i++) {
try {
Field f = obj.getClass().getDeclaredField(fields[i].getName());
f.setAccessible(true);
Object o = f.get(obj);
if (o != "" && o != null) {
if (o instanceof Date) {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //时间格式化
list.add(sf.format(o));
} else {
list.add(o.toString());
}
} else {
list.add("");
}
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
} catch (SecurityException e) {
e.printStackTrace();
}
return list;
}
}
其中 ConvertObjToMap()方法是通过反射来实现的,其中做了日期的格式化和为空的操作。
List list, String[] titles, String sheetname list为需要导出转化后的数据,titles为需要输出的表头名称,sheetname为工作簿的名称。
下面是调用上面方法的程序片段:
List<List> list = standbyManagementService.getAbnormalStandbyExcel(request);
String sheetname = "异常备机列表";
String[] titles = {"设备号码","所属单位","1","日工作时间(单位:小时)","总工作时间(单位:小时)","统计信息上传时间","相对位置","1"};
HSSFWorkbook wb = OutExcel.fillExcelDataWithTemplate(list,titles,sheetname);
ExcelUtil.export(response,wb,"异常备机列表.xls");
上面为控制器中的一段代码,其中需要注意的是titles中的”1“表示实体类中该位置的字段不想显示在导出的excel表格中,因此在这里设为1,后面将会做判断。
List list1 = new ArrayList();
for (AbnormalStandbyModel testlist : list) {
ArrayList<String> list2 = new ArrayList<String>();
list2 = OutExcel.ConvertObjToMap(testlist);
list1.add(list2);
}
return list1;
上面一段代码就是业务层把实体类对象的数据一条一条的转换为List.