今天公司有一个新的功能需求,就是用导出excel,上网搜了一下,大部分都是推荐使用poi,于是研究了一下poi,并且整合成了一个工具类,方便以后使用
首先导入poi的jar包,是在网上下载的,导入到项目中就可以用了。
/**
*
*功能:
*@param excelHeader 表头内容数组
*@param list 需要显示的List数据
*@param model 显示的表头内容独立出一个model
*@param excelName excel sheet的名字
*@param cellName excel中的标题
*@return
*/
public static HSSFWorkbook export(String[] excelHeader,List list,Object model,String excelName,String cellName) {
HSSFWorkbook wb = new HSSFWorkbook();//创建一个EXCEL
HSSFSheet sheet = wb.createSheet(excelName); //创建一个Excel的Sheet
int[] excelHeaderWidth = { 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150 };
// 设置字体
HSSFFont headfont = wb.createFont();
headfont.setFontName("黑体");
headfont.setFontHeightInPoints((short) 10);// 字体大小
headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗
HSSFCellStyle headstyle = wb.createCellStyle();
headstyle.setFont(headfont);
headstyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
headstyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中
headstyle.setLocked(true);
headstyle.setWrapText(true);// 自动换行
// 创建第一行
HSSFRow row0 = sheet.createRow(0);
// 设置行高
row0.setHeight((short) 900);
// 创建第一列
HSSFCell cell0 = row0.createCell(0);
cell0.setCellValue(new HSSFRichTextString(cellName));
cell0.setCellStyle(headstyle);
/**
* 合并单元格
* 第一个参数:第一个单元格的行数(从0开始)
* 第二个参数:第二个单元格的行数(从0开始)
* 第三个参数:第一个单元格的列数(从0开始)
* 第四个参数:第二个单元格的列数(从0开始)
*/
CellRangeAddress range = new CellRangeAddress(0, 0, 0,15);
sheet.addMergedRegion(range);
HSSFRow row = sheet.createRow(1);
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
for (int i = 0; i < excelHeader.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(excelHeader[i]);
cell.setCellStyle(style);
sheet.autoSizeColumn(i);
}
sheet.autoSizeColumn(8);
for (int i = 0; i < excelHeaderWidth.length; i++) {
sheet.setColumnWidth(i, 32 * excelHeaderWidth[i]);
}
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i + 2);
model= list.get(i);
Object[] obj1=getFiledValues(model);
String str="";
for(int j = 0; j < obj1.length; j++){
Object obj2 = obj1[j];
if(Check.isNotNull(obj2)){
str = obj2.toString();
}
// System.out.println(str);
row.createCell(j).setCellValue(str);
}
}
return wb;
}
这个方法共有5个参数
excelHeader 是excel表头第一行显示,定义为数组,比如
String[] excelHeader= { "姓名","性别","年龄"};
list 是你需要显示的具体数据,放在一个list里面传进去
model 需要显示的数据自定义一个model出来,这样可以直接获取到对象属性名称和属性值,不需要一个一个get出来
private static Object getFieldValueByName(String fieldName, Object o) {
try {
String firstLetter = fieldName.substring(0, 1).toUpperCase();
String getter = "get" + firstLetter + fieldName.substring(1);
Method method = o.getClass().getMethod(getter, new Class[] {});
Object value = method.invoke(o, new Object[] {});
return value;
} catch (Exception e) {
System.out.println("属性不存在");
return null;
}
}
private static String[] getFiledName(Object o){
Field[] fields=o.getClass().getDeclaredFields();
String[] fieldNames=new String[fields.length];
for(int i=0;i<fields.length;i++){
fieldNames[i]=fields[i].getName();
}
return fieldNames;
}
public static Object[] getFiledValues(Object o){
String[] fieldNames=getFiledName(o);
Object[] value=new Object[fieldNames.length];
for(int i=0;i<fieldNames.length;i++){
value[i]=getFieldValueByName(fieldNames[i], o);
}
return value;
}
excelName 是excel sheet的名字
cellName 是excel的大标题
值传好后,excel就建好了,接下来只需要自动下载下来就行了
/**
*
*功能:
*@param name 浏览器下载显示的名字
*@param wb 创建的excel文件
*@param response 发送到浏览器
*/
public static void fileName(String name, HSSFWorkbook wb,HttpServletResponse response){
response.setContentType("application/vnd.ms-excel");
response.setCharacterEncoding("utf-8");
try {
response.setHeader("Content-disposition", "attachment;filename="+new String(name.getBytes("GBK"),"ISO-8859-1")+".xls");
OutputStream ouputStream = response.getOutputStream();
wb.write(ouputStream);
ouputStream.flush();
ouputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
这个只是简单的用poi导出excel,所以excel的样式并不是很丰富。追求样式美观,可以在研究研究。