基于注解的全自动POI导出excel

/**
 * @Application name:行政区划信息管理系统
 * @Copyright:Copyright 2011 北京人和创建信息技术
 * @Company:RHCJ
 */
package com.renhesoft.business.datasearch.countsearch.action;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;

/**
 * @ClassName: FileUtil.java
 * @Description: 文档处理类
 * @Author 李晓浩
 * @Date 2013-6-14
 * @Version V1.0(版本)
 */
public class FileInfoUtil {
 /**
  * 1: 属性存放在list当中循环读取 ,内容是Map对象。 map对象中英文名称对应字段,之对应要到出的
  *    Excel中的中文
  * 2:新建excel导出Model
  *   
  * 2:
  */
 private String excelName = null; // 文件名称
 
 private String excelPath = null ; //文件路径
 
 private Class<?> obj = null ; // VO类
 
 private HSSFWorkbook xssfWorkbook = null;
 
 private HSSFSheet   xssfSheet = null ;
 
 private String   num = "";  //
 
 private List<?> modelLs ; // model列表内容类
 
 private int booMerge = 0; //表头合并行数
 
 private List<ArrayList<String>> mergeRule ;
 
 
 /**
  * @author: 李晓浩
  * @param excelName 导出的Excel文件名称
  * @param excelPath 导出的Excel路径,如果路径为空,则直接数据流
  * @param sheetName 导出的Excel中sheet的名称
  * @param titleLs   导出的Excle中表头列表,存放map,map键对应Model中的字段,值对应Excel中的中文字符
  * @param modelLs   导出的Excel中内容
  * @param obj  导出的Excel中Model的表识
  */
 public FileInfoUtil(String excelName , String excelPath ,String sheetName ,List<?> modelLs,Class<?> obj){
  this.excelName = excelName ;
  this.excelPath = excelPath ;
  this.obj     = obj ;
  this.modelLs   = modelLs;
  xssfWorkbook   = new HSSFWorkbook();
  xssfSheet      = xssfWorkbook.createSheet(sheetName);
 }
 /**
  * @author: 李晓浩
  * @param excelName 导出的Excel文件名称
  * @param excelPath 导出的Excel路径,如果路径为空,则直接数据流
  * @param sheetName 导出的Excel中sheet的名称
  * @param titleLs   导出的Excle中表头列表,存放map,map键对应Model中的字段,值对应Excel中的中文字符
  * @param modelLs   导出的Excel中内容
  * @param obj  导出的Excel中Model的表识
  * @param booMerge  导出的Excel中表头合并行数
  */
 public FileInfoUtil(String excelName , String excelPath ,String sheetName ,List<?> modelLs,Class<?> obj,int titleBooMerge ,List<ArrayList<String>> mergeRule){
  xssfWorkbook   = new HSSFWorkbook();
  xssfSheet      = xssfWorkbook.createSheet(sheetName);
  this.excelName = excelName ;
  this.excelPath = excelPath ;
  this.obj     = obj ;
  this.modelLs   = modelLs;
  this.booMerge  = titleBooMerge;
  this.mergeRule = mergeRule ;
 }
 /**
  * @author: 李晓浩
  * @param sheetName 导出的Excel中sheet的名称
  * @param modelLs   导出的Excel中内容
  * @param obj  导出的Excel中Model的表识
  * @param num       很成代码的位数
  */
 public FileInfoUtil(String sheetName ,List<?> modelLs,Class<?> obj , String Num){
  this.obj     = obj ;
  this.modelLs   = modelLs;
  this.num     = Num ;
  xssfWorkbook   = new HSSFWorkbook();
  xssfSheet      = xssfWorkbook.createSheet(sheetName);
 }
 /**
  * @author: 李晓浩
  * @Title: exportExcel2007
  * @time : 2013-6-14上午09:41:37
  * @Description: 导出Excel到指定文件中
  */
 public void exportExcel2007(){
  File f = new File(excelPath+"\\"+this.excelName+".xlsx");
  try {
   FileOutputStream fos = new FileOutputStream(f);
   try {
    this.productTitle();
    this.loadExcelContents();
    xssfWorkbook.write(fos);
   } catch (IOException e) {
    e.printStackTrace();
   }
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
 }
 /**
  * @author: 李晓浩
  * @Title: exportExcel2007
  * @time : 2013-6-14上午09:41:37
  * @Description: 导出联合码Excel2007
  */
 public ByteArrayInputStream exportUnionExcel2007(){
  ByteArrayInputStream bas  = null ;
  try {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   try {
    this.productTitle();
    this.loadExcelContents();
    xssfWorkbook.write(bos);
    bos.flush();
    bos.close();
    byte[] btes  = bos.toByteArray();
    bas = new ByteArrayInputStream(btes);
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return bas;
 }
 /**
  * @author: 李晓浩
  * @Title: printExcel2007
  * @time : 2013-6-14下午09:32:34
  * @Description: 返回Excel流文件
  */
 public ByteArrayInputStream printExcel2007(){
  ByteArrayInputStream bas  = null ;
  try {
   ByteArrayOutputStream bos = new ByteArrayOutputStream();
   try {
    this.productTitle();
    this.loadExcelContents();
    xssfWorkbook.write(bos);
    bos.flush();
    bos.close();
    byte[] btes  = bos.toByteArray();
    bas = new ByteArrayInputStream(btes);
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return bas;
 }
 /**
  * @author: 李晓浩
  * @Title: specialProductTitle
  * @time : 2013-6-28上午10:38:51
  * @Description: 表头合并处理,暂时考虑到两行中多列的处理
  */
 public void specialProductTitle(List<ArrayList<String>> mergeRule){
  HSSFCellStyle style = this.getExcelTitleStyle();
  int mergeRow = 0;
  HSSFRow x1 = null ;
  for(ArrayList<String> tt : mergeRule){
   CellRangeAddress  cra = new CellRangeAddress(Integer.parseInt(tt.get(0)),Integer.parseInt(tt.get(1)),Integer.parseInt(tt.get(2)),Integer.parseInt(tt.get(3)));
   xssfSheet.addMergedRegion(cra);
   if(mergeRow == 0 ){
    x1 =  xssfSheet.createRow(Integer.parseInt(tt.get(0)));
   }
   HSSFCell sc = x1.createCell(Integer.parseInt(tt.get(2)));
   System.out.println(tt.get(4)+"==================");
   sc.setCellValue(tt.get(4));
   sc.setCellStyle(style);
   mergeRow ++;
  }
 }
 /**
  * @author: 李晓浩
  * @Title: productTitle
  * @time : 2013-6-14上午10:01:35
  * @param: 判断联合查询的一个参数,如果联合查询,此参数则不能为空
  * @Description: 生成Excel表头
  */
 public void  productTitle(){
  HSSFRow xssfRow  = null;
  for(int i = 0 ; i < booMerge ; i++){
   xssfRow = xssfSheet.createRow(i);
  }
  if(null == mergeRule || mergeRule.size() == 0){//是否进行合并处理
   
  }else{
   this.specialProductTitle(mergeRule);
  }
  HSSFCellStyle style = this.getExcelTitleStyle();
  boolean booComm = (boolean)obj.isAnnotationPresent(ClassAnnotation.class);
  if(booComm){
   ClassAnnotation claAna     =   (ClassAnnotation)obj.getAnnotation(ClassAnnotation.class);
   if(claAna.funKind()&&(num!=null&&!num.equals(""))){
    // 相同属性需要拼接的情况下
    Field[] fields = obj.getDeclaredFields();
    int i = 0 ;
    for(Field  fiett : fields){
     boolean  booCommA= (boolean)fiett.isAnnotationPresent(PropertyAnnotation.class);
     if(booCommA){
      PropertyAnnotation proAna     =   (PropertyAnnotation)fiett.getAnnotation(PropertyAnnotation.class);
      if(proAna.booTitle() == 1 && proAna.funType().equals("1")){
          String propertyInfoValue  =   proAna.titleName(); //中文标题
          HSSFCell xssfCell    =   xssfRow.createCell(i);
          xssfCell.setCellValue(propertyInfoValue);
          //设置每列的宽度
          xssfSheet.setColumnWidth(i, proAna.columnWidth()*256);
          //设置表格样式
          xssfCell.setCellStyle(style);
          i++;
      }
     }
    }
   }else{
    Field[] fields = obj.getDeclaredFields();
    int i = 0 ;
    for(Field  fiett : fields){
     boolean  booCommA= (boolean)fiett.isAnnotationPresent(PropertyAnnotation.class);
     if(booCommA){
      PropertyAnnotation proAna     =   (PropertyAnnotation)fiett.getAnnotation(PropertyAnnotation.class);
      if(proAna.booTitle() == 1&&proAna.reduceTitle() == 1){
          String propertyInfoValue  =   proAna.titleName(); //中文标题
          HSSFCell xssfCell    =   xssfRow.createCell(i);
          xssfCell.setCellValue(propertyInfoValue);
          //设置每列的宽度
          xssfSheet.setColumnWidth(i, proAna.columnWidth()*256);
          //设置表格样式
          xssfCell.setCellStyle(style);
       i++;
      }
     }
    }
   }
  }else{
   try {
    throw new Exception("export error.....");
   } catch (Exception e) {
    e.printStackTrace();
   }
  }
 }
 /**
  * @author: 李晓浩
  * @Title: loadExcelContents
  * @time : 2013-6-14上午11:36:09
  * @Description: 加载model内容到Excel
  */
 public  void loadExcelContents(){
  HSSFCellStyle hcs = getExcelContentStyle();
  for(int i = 0 ; i < modelLs.size() ; i++){
   HSSFRow  xssfRow = xssfSheet.createRow(i+booMerge);
   Field[] fields = obj.getDeclaredFields();
   String propertyInfoValue="";
   String propertyInfoValuea="";
   int j = 0 ;
   int b = 0 ;
   for(Field  fiett : fields){
    boolean booComm = (boolean)fiett.isAnnotationPresent(PropertyAnnotation.class);
    if(booComm){
     PropertyAnnotation proAna     =   (PropertyAnnotation)fiett.getAnnotation(PropertyAnnotation.class);
     if(num!=null&&!num.equals("")){ //
      if(proAna.booTitle() == 1 && proAna.funType().equals("2")){
       try {
        propertyInfoValue = propertyInfoValue+  (String)fiett.get(modelLs.get(i));
        j++;
       } catch (IllegalArgumentException e1) {
        e1.printStackTrace();
       } catch (IllegalAccessException e1) {
        e1.printStackTrace();
       }
       if(Integer.parseInt(num) == j){
        try {
         HSSFCell xssfCell =   xssfRow.createCell(0);
         xssfCell.setCellValue(propertyInfoValue);
         xssfCell.setCellStyle(hcs);
         b++;
        } catch (IllegalArgumentException e) {
         e.printStackTrace();
        }
       }
       
      }
      if(proAna.booTitle() == 1 && proAna.funType().equals("1") && proAna.loadContents().equals("1")){
        try {
         propertyInfoValuea = (String)fiett.get(modelLs.get(i));
        } catch (IllegalArgumentException e1) {
         e1.printStackTrace();
        } catch (IllegalAccessException e1) {
         e1.printStackTrace();
        }
        try {
         HSSFCell xssfCell =   xssfRow.createCell(b);
         xssfCell.setCellValue(propertyInfoValuea);
         xssfCell.setCellStyle(hcs);
         b++;
        } catch (IllegalArgumentException e) {
         e.printStackTrace();
        }
      }
     }else{
      if(proAna.booTitle() == 1 && proAna.reduceTitle() == 1){
       try {
        propertyInfoValue =  (String)(fiett.get(modelLs.get(i))+"");
        HSSFCell xssfCell =   xssfRow.createCell(j);
        xssfCell.setCellValue(propertyInfoValue);
        xssfCell.setCellStyle(hcs);
       } catch (IllegalArgumentException e) {
        e.printStackTrace();
       } catch (IllegalAccessException e) {
        e.printStackTrace();
       }
       j++;
      }
     }
    }
   }
  }
 }
 /**
  * @author: 李晓浩
  * @Title: getExcelTitleStyle
  * @time : 2013-6-15下午05:52:23
  * @Description: 设置标题样式
  */
 public HSSFCellStyle getExcelTitleStyle(){
  HSSFCellStyle style = xssfWorkbook.createCellStyle(); 
        style.setAlignment(HSSFCellStyle.VERTICAL_CENTER); 
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        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);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        HSSFFont font=xssfWorkbook.createFont();
        font.setFontHeightInPoints((short)11);
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        style.setFont(font);
  return style ;
 }
 /**
  * @author: 李晓浩
  * @Title: getExcelContentStyle
  * @time : 2013-6-15下午05:52:07
  * @Description:设置内容样式
  */
 public HSSFCellStyle getExcelContentStyle(){
  HSSFCellStyle style = xssfWorkbook.createCellStyle(); 
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style.setAlignment(HSSFCellStyle.VERTICAL_CENTER);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        return style ;
 }
}

相关推荐