一、关键的通用类
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. linux下如何安装webbench

    1.上传webbench,解压 2.make&&make install进行安装 如果报没有man1目录,则要用 mkdir -p /usr/local/man/man1 然后 mak ...

  2. HDU 3342 Legal or Not(判断是否存在环)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3342 Legal or Not Time Limit: 2000/1000 MS (Java/Othe ...

  3. 【 D3.js 入门系列 --- 6 】 如何让图表动起来

    [5.1]节中制作了一个比较完善的图表,但它是静态的,想做出它的动态效果吗?在D3中只需要短短的几行代码即可. 这一节将涉及4个函数的使用. 1.transition() 启动转变效果只需要添加这个即 ...

  4. 深入理解Bindler

    Binder模型

  5. [SimHash] find the percentage of similarity between two given data

    SimHash algorithm, introduced by Charikarand is patented by Google. Simhash 5 steps: Tokenize, Hash, ...

  6. ubuntu 16.04 启用root用户方法

    引用:http://blog.csdn.net/sunxiaoju/article/details/51993091 1.使用:sudo passwd root设置root的密码,如下图所示: 2.使 ...

  7. 总是弹出visual studio 实时调试器 三种解决办法

    最近服务器老是弹出visual studio 实时调试器很是郁闷呀.关还关不掉.怎么解决呢 ,现像如下图所示: 下面我们一起来分析一下这种情况的原因: 弹出应用程序: Visual Studio 实时 ...

  8. jquery之css操作

    HTML示例代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  9. [转]PHP如何关闭notice级别的错误提示

    1.在php.ini文件中改动error_reporting改为: error_reporting=E_ALL & ~E_NOTICE 2.如果你不能操作php.ini文件,你可以使用如下方法 ...

  10. 转载:scala中:: , +:, :+, :::, ++的区别

    原文链接:https://segmentfault.com/a/1190000005083578 初学Scala的人都会被Seq的各种操作符所confuse.下面简单列举一下各个Seq操作符的区别. ...