一、关键的通用类
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. jQuery获取字符串中两个字符之间的字符

    //获取@和.之间的字符 var str1 = "laxe@ll.com"; var str2 = str1.substring(str1.indexOf('@')+1,str1. ...

  2. ng-class的用法

    最近在学习angular框架,ng-class是angular框架的一个指令,这里是ng-class指令的官方解释: ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类. ng ...

  3. *** missing separator. Stop.

    在make命令后出现这种错误提示,是提示第2行没有分隔符. 例如: 1 target:prerequisites 2 command -- 改为: 1 target:prerequisites 2   ...

  4. 详解wait和waitpid函数

    #include <sys/types.h> /* 提供类型pid_t的定义 */ #include <sys/wait.h> pid_t wait(int *status) ...

  5. 【以前弄的老东西】DLLspy超犀利后门 (源代码+程序+使用手册+二次开发文档)

    这个玩意儿是很久之前的整的.一直没有做完,但是基本功能和框架都做好了,现在发出来,希望有能力的家伙一起完成.DLLspy,绝对免杀,隐藏,HTTP请求劫持,居家旅行,杀人放火必备良药.有时间我会继续开 ...

  6. [UI]抽屉菜单DrawerLayout分析(一)

    本文转载于:http://www.cnblogs.com/avenwu/archive/2014/04/16/3669367.html 侧拉菜单作为常见的导航交互控件,最开始在没有没有android官 ...

  7. 井间数据polarization analysis 相关概念

    1. 垂直分量上记录到的数据,无法记录SH波?这个有待考证,先记录于此~ 两点需要注意:1.层状介质中,P波和深度方向(Z轴)组成入射面;2.SH的定义为垂直于入射面的S波分量. 2.VSP的观测方式 ...

  8. 安装Linux 16.04 时,选择好分区后,进到选择地点的界面后,总是闪退,退到最原始的界面

    这两天装 Linux 系统,总是遇到一个很蛋疼的问题: 当你累死累活把分区什么的都设置好了之后,在输入了系统名字,开机密码那几项之后,再选择地点的时候(如:选择 "上海"),然后就 ...

  9. oracle中TO_CHAR与TO_DATE

    TO_CHAR 是把日期或数字转换为字符串TO_DATE 是把字符串转换为数据库中得日期类型转换函数 TO_DATE格式(以时间:2016-07-25   11:45:25为例) Year: yy t ...

  10. InstallShield打包设置相对路径

    InstallShield打包设置相对路径 在使用Installshield 打包安装文件时,添加打包文件时默认使用绝对路径,但是工程文件转移时(复制到其它位置时)编译时就会找不到安装文件,这样很不方 ...