poi导出excel通用类

一、关键的通用类
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");

时间: 2024-08-03 19:21:53

poi导出excel通用类的相关文章

MVC NPOI Linq导出Excel通用类

之前写了一个模型导出Excel通用类,但是在实际应用中,可能不是直接导出模型,而是通过Linq查询后获取到最终结果再导出 通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> publi

MVC AJAX导出Excel通用类

通用类: public enum DataTypeEnum { Int = 0, Float = 1, Double = 2, String = 3, DateTime = 4, Date = 5 } public class ExportFieldInfo { /// <summary> /// 字段名,用于反射获取值 /// </summary> public string FieldName { get; set; } /// <summary> /// 中文名,

POI导出EXCEL经典实现

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

POI导出EXCEL经典实现(转)

http://www.cnblogs.com/xwdreamer/archive/2011/07/20/2296975.html 1.Apache POI简介 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程式对Microsoft Office格式档案读和写的功能. .NET的开发人员则可以利用NPOI (POI for .NET) 来存取 POI 的功能. 2.POI结构 HSSF - 提供读写Microsoft Excel XLS格式档案的功能.XS

Java POI 导出EXCEL经典实现 Java导出Excel弹出下载框

在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有很多,用得比较多的就是Apache的POI及JExcelAPI.这里我们用Apache POI!我们先去Apach

POI导出EXCEL文档

package com.wiseweb.util.excel; import java.io.*; import java.util.*; import javax.swing.JOptionPane; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.hssf.util.HSSFColor; import com.wiseweb.pom.entity.BaiinfoPriceTime; public class Expo

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

在我们开发项目中,很多时候会提出这样的需求:将前端的某某数据以excel表格导出,今天就给大家写一个简单的模板. 这里我们选择使用poi导出excel: 第一步:导入需要的jar包到 lib 文件夹下 jar包下载路径:http://download.csdn.net/download/pumpkin09/7077011 第二步:添加poi导出工具类 1 package com.yjd.admin.util; 2 3 import java.io.IOException; 4 import ja

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

转自http://blog.csdn.net/evangel_z/article/details/7332535 在web开发中,有一个经典的功能,就是数据的导入导出.特别是数据的导出,在生产管理或者财务系统中用的非常普遍,因为这些系统经常要做一些报表打印的工作.而数据导出的格式一般是EXCEL或者PDF,我这里就用两篇文章分别给大家介绍下.(注意,我们这里说的数据导出可不是数据库中的数据导出!么误会啦^_^) 呵呵,首先我们来导出EXCEL格式的文件吧.现在主流的操作Excel文件的开源工具有

重构:以Java POI 导出EXCEL为例

重构 开头先抛出几个问题吧,这几个问题也是<重构:改善既有代码的设计>这本书第2章的问题. 什么是重构? 为什么要重构? 什么时候要重构? 接下来就从这几个问题出发,通过这几个问题来系统的了解重构的意义. 什么是重构? <重构:改善既有代码的设计>这本书中将重构以名词和动词形式进行解释,如下 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本. 重构(动词):使用一系列重构的手法,在不改变软件可观察行为的前提下,调整其结构.