码迷,mamicode.com
首页 > 其他好文 > 详细

poi导出excel通用类

时间:2015-04-28 22:14:50      阅读:236      评论:0      收藏:0      [点我收藏+]

标签:

一、关键的通用类
public class PoiExportUtils {
    private static HSSFWorkbook workBook;

    public PoiExportUtils(){
        workBook = new HSSFWorkbook();
    }
    
    /**
     * 创建sheet
     * @param sheetName
     * @param workBook
     * @return
     */
    public static HSSFSheet createHSSFSheet(String sheetName,HSSFWorkbook workBook){
         // 生成一个表格
        HSSFSheet sheet = workBook.createSheet(sheetName);
        sheet.setDefaultColumnWidth(20);
        return sheet;
    }
    
    /**
     * 根据头部名称产生表格标题行
     * @param sheet
     * @param headers
     * @return
     */
    public void  createHSSFSheetHeader(HSSFSheet sheet,String[] headers){
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            HSSFCell cell = row.createCell(i);
            HSSFRichTextString text = new HSSFRichTextString(headers[i]);
            cell.setCellValue(text);
            
            setHeaderStyle(cell);
        }
    }
    
    /**
     * 根据实体产生表格标题行
     * @param sheet
     * @param headers
     * @return
     */
    public <T> void createHSSFSheetHeader(HSSFSheet sheet,Collection<T> dataset,String ... excludes){
        
        Iterator<T> it = dataset.iterator();
        if(it.hasNext()){
            HSSFRow row = sheet.createRow(0);
            Field[] fields = it.next().getClass().getDeclaredFields();
            int cellIndex = 0;
            A:for(int i=0;i<fields.length;i++) {
                String fieldName = fields[i].getName();
                if(excludes != null){
                    for(String exclude : excludes){
                        if(exclude.equals(fieldName)){
                            continue A;
                        }
                    }
                }
                if(!fields[i].isAnnotationPresent(PoiCell.class)){
                    continue;
                }
                PoiCell poiCell = fields[i].getAnnotation(PoiCell.class);
                HSSFCell cell = row.createCell(cellIndex);
                HSSFRichTextString text = new HSSFRichTextString(poiCell.headerName());
                cell.setCellValue(text);
                setHeaderStyle(cell);
                cellIndex++;
            }
        }
    }

    /**
     *
     * @param sheetName,工作簿名称
     * @param headers,可选,
     *          如果有则以这个数组中的字符串为页眉,
     *          如果没有则去扫描实体类上的注解@PoiCell,以有注解的属性value为页眉。
     * @param dataset,需要导出的数据集合
     * @param pattern,如果日期,那么需要设置日期类型格式,
     * @param out,导出的流
     * @param excludes,排除的列,对应实体类属性名。
     */
    public <T> void exportExcel(String sheetName,String[] headers,Collection<T> dataset,String pattern, OutputStream out,String ... excludes) {
        try {
            HSSFSheet sheet = createHSSFSheet(sheetName, workBook);
            if(headers==null){
                createHSSFSheetHeader(sheet, dataset, excludes);
            }else{
                createHSSFSheetHeader(sheet, headers);
            }
            
            Iterator<T> it = dataset.iterator();
            int index = 1;
            while(it.hasNext()){
                HSSFRow row = sheet.createRow(index);
                T t = it.next();
                Field[] fields = t.getClass().getDeclaredFields();
                int cellIndex = 0;
                A:for(int i=0;i<fields.length;i++){
                    String fieldName = fields[i].getName();
                    if(excludes != null){
                        for(String exclude : excludes){
                            if(exclude.equals(fieldName)){
                                continue A;
                            }
                        }
                    }
                    
                    if(!fields[i].isAnnotationPresent(PoiCell.class)){
                        continue A;
                    }
                    
                    HSSFCell cell = row.createCell(cellIndex);
                    
                    String getMethodName = "get"
                            + fieldName.substring(0, 1).toUpperCase()
                            + fieldName.substring(1);
                    
                    Method getMethod = t.getClass().getMethod(getMethodName);
                    Object returnValue = getMethod.invoke(t);
                    
                    String textValue = null;
                    if(returnValue instanceof Date){
                        Date date = (Date) returnValue;
                        SimpleDateFormat sdf = new SimpleDateFormat(pattern);
                        textValue = sdf.format(date);
                    } else if (returnValue instanceof byte[]) {
                        // 有图片时,设置行高为60px;
                        row.setHeightInPoints(60);
                        // 设置图片所在列宽度为80px,注意这里单位的一个换算
                        sheet.setColumnWidth(cellIndex, (short) (35.7 * 80));
                        // sheet.autoSizeColumn(i);
                        byte[] bsValue = (byte[]) returnValue;
                        HSSFClientAnchor anchor = new HSSFClientAnchor(0,0,1023,255,
                                (short) cellIndex, index, (short) cellIndex, index);
                        anchor.setAnchorType(2);
                        HSSFPatriarch patri = sheet.createDrawingPatriarch();
                        patri.createPicture(anchor, workBook.addPicture(
                                bsValue, HSSFWorkbook.PICTURE_TYPE_PNG));
                    } else if(returnValue!=null){
                        // 其它数据类型都当作字符串简单处理
                        textValue = returnValue.toString();
                    }
                    
                    // 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
                    if (textValue != null) {
                        Pattern p = Pattern.compile("^//d+(//.//d+)?{1}");
                        Matcher matcher = p.matcher(textValue);
                        if (matcher.matches()) {
                            // 是数字当作double处理
                            cell.setCellValue(Double.parseDouble(textValue));
                        } else {
                            CellStyle style = workBook.createCellStyle();
                            style.setWrapText(true);//回绕文本
                            
                            cell.setCellStyle(style);
                            cell.setCellValue(textValue);
                        }
                    }
                    cellIndex++;
                }
                index++;
            }
            workBook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    
    /**
     * 给页眉添加样式
     * @param cell
     */
    private void setHeaderStyle(HSSFCell cell){
        // 生成一个样式
        HSSFCellStyle style = workBook.createCellStyle();
        // 设置这些样式
        style.setWrapText(true);//回绕文本
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);//设置单元格前景色,蓝色
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中
        // 生成一个字体
        HSSFFont font = workBook.createFont();
        font.setColor(HSSFColor.VIOLET.index);
        font.setFontHeightInPoints((short) 12);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 把字体应用到当前的样式
        style.setFont(font);
        
        cell.setCellStyle(style);
    }
    
    /**
     * 如果需要导出图片,那么需要在实体类中定义属性byte[] img 来存放图片数据
     * 这个方法,从url的路径获取图片字节数组
     * @param strUrl
     * @return
     */
//    private byte[] getImgByURL(String strUrl){
//        //"http://172.16.2.49/83/207/200/0db99469-d2b9-4b97-a1c2-497509c3f5f7.png"
//        byte[] byteArray = null;
//        try {
//            URL url = new URL(strUrl);
//            
//            InputStream input = url.openStream();
//   
//            ByteArrayOutputStream output = new ByteArrayOutputStream();
//            byte[] buffer = new byte[4096];
//            int n = 0;
//            while (-1 != (n = input.read(buffer))) {
//                output.write(buffer, 0, n);
//            }
//            byteArray = output.toByteArray();
//        } catch (MalformedURLException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return byteArray;
//    }
}

二、自定义注解类
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PoiCell {
    public String headerName() default "";
}

三、实体类

public class CarAlarmExportEntity{
    @PoiCell(headerName="车牌号")
    private String plateNo;
    @PoiCell(headerName="接收时间")
    private Date alarmTime;// 报警时间
    @PoiCell(headerName="海拔")
    private Double altitude;// 海拔
    private String alarmFromStr;//报警来源
    @PoiCell(headerName="图片路径")
    private String imgPath;
    @PoiCell(headerName="图片")
    private byte[] img;

  //get,set

}

 

四、测试

        List<CarAlarmExportEntity> list = new ArrayList<CarAlarmExportEntity>();
        PoiExportUtils poi = new PoiExportUtils();
//        String[] str = {"a","b","c"};自定义页眉
        poi.exportExcel("sheet01",null,list, "yyyy-MM-dd HH:mm:ss", new FileOutputStream("f:/poi.xls"), "alarmFromStr");
       

 

poi导出excel通用类

标签:

原文地址:http://www.cnblogs.com/zhuqh/p/4463997.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!