java导出Excel的工具类代码实例



java导出Excel的工具类代码实例。介绍一下本工具的功能: 对于给定的java对象(List)生成一个excell文件。

 

在这个list里面的每个子对象带有特定的列注释(此注释写在set方法上,思考了下其实这个注释最好能写在get方法上),开发时需要导入POI相关包,

然后对List的对象写一个特定注释的类,比如Student.java,即可调用工具完成excell文件的生成。

 

 

  1. import java.util.Date;
  2. import Excel.annotation.Column;
  3. import XMLHandler.xmlopt.annotation.Node;
  4. import XMLHandler.xmlopt.annotation.Xml;
  5. import XMLHandler.xmlopt.annotation.Attr;
  6. @Xml(name=”Student”)
  7. public class Student {
  8.     private String id;
  9.     private String name;
  10.     private String bir;
  11.     private String  age;
  12.     public String getId() {
  13.         return id;
  14.     }
  15.     @Column(name=”学号”)
  16.     public void setId(String id) {
  17.         this.id = id;
  18.     }
  19.     public String getName() {
  20.         return name;
  21.     }
  22.     @Column(name=”姓名”)
  23.     public void setName(String name) {
  24.         this.name = name;
  25.     }
  26.     public String getBir() {
  27.         return bir;
  28.     }
  29.     @Column(name=”出生日期”)
  30.     public void setBir(String bir) {
  31.         this.bir = bir;
  32.     }
  33.     public String getAge() {
  34.         return age;
  35.     }
  36.     @Column(name=”年龄”)
  37.     public void setAge(String age) {
  38.         this.age = age;
  39.     }
  40. }

 

 

用到的注释类Column.java,

 

  1. import java.lang.annotation.Documented;
  2. import java.lang.annotation.ElementType;
  3. import java.lang.annotation.Inherited;
  4. import java.lang.annotation.Retention;
  5. import java.lang.annotation.RetentionPolicy;
  6. import java.lang.annotation.Target;
  7. /**
  8.  * @desc: 描述excell文件的列头信息  *
  9.  * @date-2011-1-10
  10.  * @author ziliang
  11.  */
  12. @Target(ElementType.METHOD)
  13. @Retention(RetentionPolicy.RUNTIME)
  14. @Documented
  15. @Inherited
  16. public @interface Column {
  17.     /**
  18.           * 列名注释
  19.      */
  20.     public String name() default ”";
  21. }

 

 

下面看我们主要的工具类,

 

 

  1. import java.io.*;
  2. import java.lang.reflect.InvocationTargetException;
  3. import java.lang.reflect.Method;
  4. import java.util.*;
  5. import org.apache.poi.hssf.usermodel.HSSFCell;
  6. import org.apache.poi.hssf.usermodel.HSSFCellStyle;
  7. import org.apache.poi.hssf.usermodel.HSSFFont;
  8. import org.apache.poi.hssf.usermodel.HSSFRow;
  9. import org.apache.poi.hssf.usermodel.HSSFSheet;
  10. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  11. import Excel.annotation.Column;
  12. import XMLHandler.xmlopt.annotation.Ignore;
  13. import XMLHandler.xmlopt.annotation.Xml;
  14. /**
  15.  * @desc: excel操作工具
  16.  * @date-2011-1-10
  17.  * @author-ziliang
  18.  * */
  19. public class ExcelUtil {
  20.     /**
  21.      * 待创建的excel文件名,你可以写定名字
  22.      * */
  23.     private static  String filename=”";
  24.     /**
  25.      * @desc 根据list的数据生成excel文件
  26.      * @author ZILIANG
  27.      * @throws IOException
  28.      * */
  29.     public static void createExcelFile(List list) throws IOException{
  30.         FileOutputStream fileOut=null;
  31.         if(list.size()==0)return;
  32.         Object obj=list.get(0);
  33.         HSSFWorkbook wb=(HSSFWorkbook) getWorkbook(obj);
  34.         //构造excel头
  35.         getExcelHead(obj,0,wb);
  36.         // 产生唯一文件名称,    并关联文件流
  37.         String file_name=System.currentTimeMillis()+filename+”.xls”;
  38.         fileOut = new FileOutputStream(file_name);
  39.         //循环处理数据行:注意行序号
  40.         for(int i=1;i<=list.size();i++){
  41.             obj=list.get(i-1);
  42.             getExcelBody(obj,i,wb);
  43.         }
  44.         wb.write(fileOut);
  45.         fileOut.close();
  46.     }
  47.     /**
  48.      * 获取当前工作薄的每一行数据
  49.      * */
  50.     public static void getExcelBody(Object obj,int rowno,HSSFWorkbook wb ) throws IOException{
  51.         Class<?> targetClass = obj.getClass();
  52.         // 创建第一个工作表,命名filename
  53.         HSSFSheet sheet = wb.getSheet(filename);
  54.         Method methods[] = targetClass.getMethods();
  55.         int colno=0;
  56.         HSSFRow row = sheet.createRow(rowno);
  57.         for (Method method : methods) {
  58.             if (!isSetMethod(method))
  59.                 continue;
  60.             if (method.getAnnotation(Ignore.class) != null)
  61.                 continue;
  62.             //处理数据行
  63.             HSSFCell cell = row.createCell((short) colno);
  64.             String defaultNodeName = method.getName().substring(3);
  65.             Object value = invokeGet(obj, defaultNodeName);
  66.             if(value==null) value=”";
  67.             cell.setCellValue(value.toString());
  68.             colno++;
  69.         }
  70.     }
  71.     /**
  72.      * 获取当前工作薄的头
  73.      * */
  74.     public static void getExcelHead(Object obj,int rowno,HSSFWorkbook wb ) throws IOException{
  75.         Class<?> targetClass = obj.getClass();
  76.         // 创建第一个工作表,命名filename
  77.         HSSFSheet sheet = wb.getSheet(filename);
  78.         Method methods[] = targetClass.getMethods();
  79.         int colno=0;
  80.         HSSFRow row = sheet.createRow(rowno);
  81.         for (Method method : methods) {
  82.             if (!isSetMethod(method))
  83.                 continue;
  84.             if (method.getAnnotation(Ignore.class) != null)
  85.                 continue;
  86.             Column columnAnno = method.getAnnotation(Column.class);
  87.             String column=columnAnno.name();
  88.             if(isNotEmpty(column)&&rowno==0){
  89.                 //读取注释,处理头信息
  90.                 HSSFCell cell = row.createCell((short) colno);
  91.                 cell.setCellValue(column);
  92.                 cell.setCellStyle(setCellStyle(wb));
  93.                 colno++;
  94.             }
  95.         }
  96.     }
  97.     /**
  98.      * @param 带有特定注释的javabean
  99.      * @author ziliang
  100.      * @return HSSFWorkbook,返回创建了一个名为filename的sheet页的工作薄
  101.      * */
  102.     public static HSSFWorkbook getWorkbook(Object obj) throws FileNotFoundException{
  103.         Class<?> targetClass = obj.getClass();
  104.         // 取类注解
  105.         Xml docAnno = targetClass.getAnnotation(Xml.class);
  106.         if (docAnno == null) {
  107.             throw new RuntimeException(“被处理的类必须带有annotation的注解”);
  108.         }
  109.         //取类名字,如名字注释空则取默认类名为excel文件名
  110.         String file_name = docAnno.name();
  111.         if (file_name == null || file_name.length() == 0)
  112.             file_name = obj.getClass().getSimpleName();
  113.         filename=file_name;
  114.         HSSFWorkbook wb = new HSSFWorkbook();
  115.         // 创建一个工作表,命名filename
  116.         HSSFSheet sheet = wb.createSheet(filename);
  117.         return wb;
  118.     }
  119.     //设置单元样式
  120.     public static HSSFCellStyle setCellStyle(HSSFWorkbook wb){
  121.         HSSFFont font = wb.createFont();
  122.         font.setColor(HSSFFont.COLOR_NORMAL);
  123.         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
  124.         HSSFCellStyle cellStyle = wb.createCellStyle();
  125.         cellStyle.setFont(font);
  126.         return cellStyle;
  127.     }
  128.     /**
  129.      * 是否为符合javaBean规范的set方法
  130.      *
  131.      * @param methodName
  132.      * @return
  133.      */
  134.     public static boolean isSetMethod(Method method) {
  135.         String methodName = method.getName();
  136.         if (!methodName.startsWith(“set”)) {
  137.             return false;
  138.         }
  139.         Class<?>[] clazzes = method.getParameterTypes();
  140.         // 如果方法的参数>1 则不是设置属性的方法
  141.         if (clazzes.length != 1) {
  142.             return false;
  143.         }
  144.         return true;
  145.     }
  146.     //工具函数: 判断字符串不空
  147.     public static boolean isNotEmpty(String s){
  148.         return s!=null && !s.trim().equalsIgnoreCase(“”);
  149.     }
  150.      //取obj属性值
  151.     private static Object invokeGet(Object target, String name) {
  152.         name = name.substring(0, 1).toUpperCase() + name.substring(1);
  153.         String getMethodName = ”get” + name;
  154.         Object res = null;
  155.         try {
  156.             Method method = target.getClass().getMethod(getMethodName);
  157.             res = method.invoke(target);
  158.         } catch (SecurityException e) {
  159.             e.printStackTrace();
  160.         } catch (IllegalArgumentException e) {
  161.             e.printStackTrace();
  162.         } catch (NoSuchMethodException e) {
  163.             e.printStackTrace();
  164.         } catch (IllegalAccessException e) {
  165.             e.printStackTrace();
  166.         } catch (InvocationTargetException e) {
  167.             e.printStackTrace();
  168.         }
  169.         return res;
  170.     }
  171. }

 


上面代码用到了另外2个特别注释类ignore.java和xml.java,参见我的另外文章:xml操作工具-实现篇

 

好了,有了上面完整的代码,下面来测试下student组成的List,生成的excell会是样子的?

 

 

  1. import java.io.*;
  2. import java.util.*;
  3. import org.junit.AfterClass;
  4. import org.junit.BeforeClass;
  5. import org.junit.Ignore;
  6. import org.junit.Test;
  7. import Excel.excelutil.ExcelUtil;
  8. import XMLHandler.xmlopt.util.XmlUtil;
  9. import XMLHandler.xmlutil.test.School;
  10. public class TestExcel {
  11.     @BeforeClass
  12.     public static void setUpBeforeClass() throws Exception {
  13.     }
  14.     @AfterClass
  15.     public static void tearDownAfterClass() throws Exception {
  16.     }
  17.     //@Ignore
  18.     @Test
  19.     public void testExcel2File() throws FileNotFoundException, IOException {
  20.         List list=new ArrayList();
  21.         Student s1=new Student();
  22.         s1.setAge(“22″);
  23.         s1.setName(“sname”);
  24.         list.add(s1);
  25.         Student s2=new Student();
  26.         s2.setAge(“22″);
  27.         s2.setBir(“2010-1-1″);
  28.         list.add(s2);
  29.         Student s3=new Student();
  30.         s3.setAge(“55″);
  31.         s3.setId(“001″);
  32.         list.add(s3);
  33.         ExcelUtil.createExcelFile(list);
  34.         System.out.println(“”);
  35.     }
  36. }

 

 

 

 

 

测试上述代码,生成的excell文件放在工程路径下,文件名为时间戳加上Student构成,例如:1294967658921Student.xls

 

本文主要是用POI包实现的,另外介绍一篇-jxl模板导出excel

http://blog.csdn.net/ziliang871118/archive/2011/02/25/6207641.aspx