一、关键的通用类
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通用类的更多相关文章

  1. MVC NPOI Linq导出Excel通用类

    之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = , ...

  2. NPOI导入导出EXCEL通用类,供参考,可直接使用在WinForm项目中

    以下是NPOI导入导出EXCEL通用类,是在别人的代码上进行优化的,兼容xls与xlsx文件格式,供参考,可直接使用在WinForm项目中,由于XSSFWorkbook类型的Write方法限制,Wri ...

  3. 使用POI导出EXCEL工具类并解决导出数据量大的问题

    POI导出工具类 工作中常常会遇到一些图表需要导出的功能,在这里自己写了一个工具类方便以后使用(使用POI实现). 项目依赖 <dependency> <groupId>org ...

  4. NPOI MVC 模型导出Excel通用类

    通用类: public enum DataTypeEnum { Int = , Float = , Double = , String = , DateTime = , Date = } public ...

  5. NPOI导入导出EXCEL通用类,可直接使用在WinForm项目中

    由于XSSFWorkbook类型的Write方法限制,Write完成后就自动关闭流数据,所以无法很好的支持的Web模式,网上目前也未找到好的解决方案. 注意:若直接使用在WinForm项目中,必需先下 ...

  6. POI导出EXCEL经典实现

    1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则 ...

  7. Java POI 导出EXCEL经典实现 Java导出Excel

    转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者 ...

  8. java中使用poi导出excel表格数据并且可以手动修改导出路径

    在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下

  9. 重构:以Java POI 导出EXCEL为例

    重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的 ...

随机推荐

  1. 对C语言的知识与能力予以自评

    看到一个问卷不错,拟作为第三次作业的部分内容. 你对自己的未来有什么规划?做了哪些准备?我准备在将来成为一名合格的软件工作人员,我已经在平时有空的时间里着手代码的练习. 你认为什么是学习?学习有什么用 ...

  2. ASP.NET Core (Database First)

    CREATE DATABASE [EFCore_dbfirst] GO USE [EFCore_dbfirst] GO CREATE TABLE [Blog] ( [BlogId] int NOT N ...

  3. paramiko 登录linux主机后执行tail后返回数据不完整解决方法。

    def get_sql_log(host,port,user,password,key_words,out_put_filename): commond='cd crm-app/;./tailall. ...

  4. java验证码前台技术

    //下面是在前台jsp页面不用导工具的情况下制作的验证码的基本代码 $(function(){ //创建验证码 createCode(); jQuery.validator.addMethod( &q ...

  5. Qt自定义事件的实现(转)

    原文:http://blog.csdn.net/michealtx/article/details/6866094 初学Qt,用了Qt自带的事件,然后想怎么才能定义自己的事件呢?又如何使用自定义事件呢 ...

  6. pwnable echo2

    pwnable echo2 linux 32位程序 涉及FSB和UAF漏洞的利用,先%x泄露地址,然后利用UAF漏洞进行利用 code:

  7. 00 alv抬头等

    *&---------------------------------------------------------------------* *& Report ZHJ_TEST0 ...

  8. browser shell

    我一直坚信,做项目需要通过文档来总结.一来可以梳理自己的项目和思路,二来可以备忘,三则可以为有同样需求的朋友提供一些参考.如果一直不进行总结,真的很可能是写了多年的代码,却只有一年的经验.当学习一项新 ...

  9. WebAPI学习点滴(二)

    刚开始学习WebApi就遇到了问题,在同一个API控制器中,如果两个方法的签名相同,比如 [HttpGet] public string GetString() { return "Hell ...

  10. Mybatis与Hibernate的区别

    首先简单介绍下两者的概念: Hibernate :Hibernate 是当前最流行的ORM框架,对数据库结构提供了较为完整的封装. Mybatis:Mybatis同样也是非常流行的ORM框架,主要着力 ...