JAVA导出表格模板,利用反射条件自动填充List列表
/**
*
* @param response 请求流
* @param headers 列表头
* @param dataset list列表
* @param fileName 导出名称
* @param <T>
* @throws IOException
*/
public static <T> void exportExcel(HttpServletResponse response,String[] headers, List<T> dataset,String fileName) throws IOException{
// 声明一个工作薄
HSSFWorkbook workbook =new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet();
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth((short) 15);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("leno");
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (short i =0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text =new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index =0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t =(T) it.next();
// 利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (short i =0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName ="get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);
try {
//Class tCls = t.getClass();//原有的
Class<?> tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName);
Object value = getMethod.invoke(t);
// 判断值的类型后进行强制类型转换
String textValue =null;
if (valueinstanceof Integer) {
int intValue =(Integer) value;
cell.setCellValue(intValue);
}
if (valueinstanceof Float) {
float fValue =(Float) value;
textValue =new String(String.valueOf(fValue));
cell.setCellValue(textValue);
}
if (valueinstanceof Double) {
double dValue =(Double) value;
textValue =new String(String.valueOf(dValue));
cell.setCellValue(textValue);
}
if (valueinstanceof Long) {
long longValue =(Long) value;
cell.setCellValue(longValue);
}
if (valueinstanceof Boolean) {
boolean bValue =(Boolean) value;
textValue ="男";
if (!bValue) {
textValue ="女";
}
} else if (valueinstanceof Date) {
Date date =(Date) value;
SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
textValue = sdf.format(date);
} else if (valueinstanceof byte[]) {
// 有图片时,设置行高为60px;buffer
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(i, (short) (35.7 *80));
// sheet.autoSizeColumn(i);
byte[] bsValue =(byte[]) value;
HSSFClientAnchor anchor =new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6,
index);
anchor.setAnchorType(2);
patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
} else {
// 其它数据类型都当作字符串简单处理
textValue = value ==null || value =="" ?"" : value.toString();
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue !=null) {
Pattern p = Pattern.compile("^//d+(//.//d+)?$");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
HSSFRichTextString richString =new HSSFRichTextString(textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
} catch (SecurityException | NoSuchMethodException | IllegalArgumentException | IllegalAccessException | InvocationTargetException e) {
e.printStackTrace();
}
}
}
ByteArrayOutputStream os =new ByteArrayOutputStream();
workbook.write(os);
byte[] content = os.toByteArray();
InputStream is =new ByteArrayInputStream(content);
response.reset();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" +new String((fileName +".xls").getBytes(), "iso-8859-1"));
ServletOutputStream out = response.getOutputStream();
BufferedInputStream bis =null;
BufferedOutputStream bos =null;
try {
bis =new BufferedInputStream(is);
bos =new BufferedOutputStream(out);
byte[] buff =new byte[2048];
int bytesRead;
while (-1 !=(bytesRead = bis.read(buff, 0, buff.length))) {
bos.write(buff, 0, bytesRead);
}
bos.flush(); //不可少
response.flushBuffer();//不可少
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭流,不可少
if (bis !=null) {
bis.close();
}
if (bos !=null) {
bos.close();
}
}
}