POI导出Excel表格

       在最近的工作中遇到需要把数据导出到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);
        }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值