在最近的工作中遇到需要把数据导出到Excel表格的需求,随便在网上找了找,有很多选择可以用,但还是感觉POI比较合适。所以我来大概讲一下POI吧,POI有两个不同的版本吧。一个是org.apache.poi.hssf包下的,大部分类以HSSF开头的,它主要是适用于Excel2003之前得版本,扩展名是.xls;另外有一个升级版本在org.apache.poi.xssf包下,里面的大部分类以XSSF开头,主要用于操作Excel2007以后的版本,扩展名为.xlsx。两个版本在类的方法和作用上的差别不是很大,有一些细微的差别,因此想把HSSF升级成XSSF只需要把你的所以用到的类的第一个字母从H改成X就完成了,非常方便,但可能会有部分方法有改动,但是只要稍微查一下XSSF的API很快就能搞定。我这里就随便把用到的代码粘贴一下,以便后续的查阅和学习。
1、如果是使用的Maven来做项目依赖管理的话,只需加入下面的依赖即可,第一个是HSSF的依赖,第二个是 XSSF的依赖
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
2、下面是把一个List的数据导出到Excel表格的方法
public XSSFWorkbook export(List<biz_bandwidth_month_sum2> list) throws Exception{
try{
String[] excelHeader = { "编号", "业务类型", "机房名称","统计月份","带宽(Mbps)","峰值出现时间","设备数量","设备列表","备注"};
String[] fieldName = {"App_type","Idcname","Count_month","Bandwidth_sum","Peak_time","Num","Devices","Remark"};
XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("服务器");
XSSFRow row = sheet.createRow(0);
XSSFCellStyle columnTopStyle = biz_poi_util.getColumnHeaderStyle(wb);//获取列头样式对象
XSSFCellStyle style = biz_poi_util.getStyle(wb);
XSSFCellStyle formatStyle = biz_poi_util.getFormatStyle(wb,"#,#0");
for (int i = 0; i < excelHeader.length; i++) {
XSSFCell cell = row.createCell(i);
cell.setCellValue(excelHeader[i]);
cell.setCellStyle(columnTopStyle);
}
for (int i = 0; i < list.size(); i++) {
row = sheet.createRow(i+1);
biz_bandwidth_month_sum2 data = list.get(i);
int col = 0;
XSSFCell cell1 = row.createCell(col++);
cell1.setCellValue(i+1);
Class<?> clazz = data.getClass();
for(int j=0;j<fieldName.length;j++){
Method method = clazz.getDeclaredMethod("get"+fieldName[j]);
Object value = method.invoke(data);
XSSFCell cell = row.createCell(col++);
String dataStr = String.valueOf(value==null?"":value);
if(value instanceof Long){
cell.setCellValue(Long.valueOf(dataStr));
}else if(value instanceof Integer){
cell.setCellValue(Integer.valueOf(dataStr));
}else{
if(dataStr.length()>32767){
dataStr = dataStr.substring(0, 32767);
}
cell.setCellValue(dataStr);
}
if("Bandwidth_sum".equals(fieldName[j])){
dataStr = dataStr.replaceAll(",", "");
cell.setCellValue(Long.valueOf(dataStr));
cell.setCellStyle(formatStyle);//设置数字显示千位分隔符
}
//后两列单独设置样式
if("Devices".equals(fieldName[j]) || "Remark".equals(fieldName[j])){
cell.setCellStyle(style);
}
}
}
//除了最后两列其他的列的宽度自适应
for (int i = 0; i < excelHeader.length-2; i++) {
sheet.autoSizeColumn(i);
}
//给最后两列设置固定宽度
sheet.setColumnWidth(excelHeader.length-2, 20000);
sheet.setColumnWidth(excelHeader.length-1, 20000);
return wb;
}catch(Exception e){
e.printStackTrace();
log.error("导出服务器数据失败!");
return null;
}
3、一些简单设置单元格样式的工具方法
/*
* 列头单元格样式
*/
public static XSSFCellStyle getColumnHeaderStyle(XSSFWorkbook workbook) {
// 设置字体
XSSFFont font = workbook.createFont();
//设置字体大小
font.setFontHeightInPoints((short)11);
//字体加粗
font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
font.setFontName("Courier New");
//设置样式;
XSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
// style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
// style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//设置底边框颜色;
// style.setBottomBorderColor(new XSSFColor());
//设置左边框;
// style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
// style.setLeftBorderColor(new XSSFColor());
//设置右边框;
// style.setBorderRight(XSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
// style.setRightBorderColor(new XSSFColor());
//设置顶边框;
// style.setBorderTop(XSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
// style.setTopBorderColor(new XSSFColor());
//在样式用应用设置的字体;
style.setFont(font);
//设置自动换行;
style.setWrapText(false);
//设置水平对齐的样式为居中对齐;
style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
return style;
}
/*
* 列数据信息单元格样式
*/
public static XSSFCellStyle getStyle(XSSFWorkbook workbook) {
// 设置字体
// XSSFFont font = workbook.createFont();
//设置字体大小
//font.setFontHeightInPoints((short)10);
//字体加粗
//font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
//设置字体名字
// font.setFontName("Courier New");
//设置样式;
XSSFCellStyle style = workbook.createCellStyle();
//设置底边框;
// style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
//设置底边框颜色;
// style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
// style.setBottomBorderColor(new XSSFColor());
//设置左边框;
// style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
//设置左边框颜色;
// style.setLeftBorderColor(new XSSFColor());
//设置右边框;
// style.setBorderRight(XSSFCellStyle.BORDER_THIN);
//设置右边框颜色;
// style.setRightBorderColor(new XSSFColor());
//设置顶边框;
// style.setBorderTop(XSSFCellStyle.BORDER_THIN);
//设置顶边框颜色;
// style.setTopBorderColor(new XSSFColor());
//在样式用应用设置的字体;
// style.setFont(font);
//设置自动换行;
style.setWrapText(true);
//设置水平对齐的样式为居中对齐;
style.setAlignment(XSSFCellStyle.ALIGN_LEFT);
//设置垂直对齐的样式为居中对齐;
style.setVerticalAlignment(XSSFCellStyle.VERTICAL_TOP);
return style;
}
/**
* 设置execl单元格数字格式
* @param workbook
* @param formcat 如:#,#0 千位分隔符
* @return
*/
public static XSSFCellStyle getFormatStyle(XSSFWorkbook workbook,String formcat){
XSSFCellStyle cellStyle = workbook.createCellStyle();
XSSFDataFormat df = workbook.createDataFormat(); //此处设置数据格式
cellStyle.setDataFormat(df.getFormat(formcat)); //设置数字显示千位分隔符
return cellStyle;
}
4、最后以流的方式返回到客户端
XSSFWorkbook workbook = this.export(count_month);
if(workbook !=null){
String fileName = "交换机"+sdfMm.format(month)+sdfDd.format(date) + ".xlsx";
response.setContentType("application/vnd..ms-excel");
response.setHeader("content-Disposition","attachment;filename="+URLEncoder.encode(fileName,"utf-8"));
OutputStream out = response.getOutputStream();
workbook.write(out);
return jsonDataUtil.packageResultJsonString(0);
}