实际应用中,Excel导入导出很常见的操作,实例通过Java反射和注解的机制实现任意类Excel操作。
注解可理解为程序的标记语言,无任何语义,Java虚拟机不解释执行该行代码。编程人员可运用这一特性为特定的方法,属性,类加上自定义语义,在利用Java的反射机制field.getAnnotation实现自己的逻辑判断,比如本实例中@Excel注解标记类属性是否为Excel操作字段。
package annotate;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.ElementType;
import java.lang.annotation.RetentionPolicy;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
//excel表格注解
public @interface Excel {
//字段excel表头名称
public String name() default "";
//字段是否为必填项
public boolean require() default false;
}
package test;
import annotate.Excel;
public class Student {
@Excel(name="编码",require=true)
private int id;
@Excel(name="姓名",require=true)
private String name;
@Excel(name="性别",require=true)
private String sex;
@Excel(name="年龄")
private int age;
private int num;
public Student(){
}
public Student(int id, String name, String sex, int age) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
}
}
package test;
import java.io.File;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import annotate.Excel;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Colour;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import unity.SpellHelper;
@SuppressWarnings("unchecked")
public class excel {
public static void main(String[] args){
List students = new ArrayList();
for(int i=0;i<10;i++){
Student student = new Student(i, "测试"+i,i%2==0?"男":"女" , i*10);
students.add(student);
}
out(Student.class,new File("D:\\学生信息.xls"),students, "学生信息","红色为必填项\n编码为数字\n");
List list = (List)in(new File("D:\\学生信息.xls"),Student.class);
//JDK1.8 Lambda表达式
list.stream().forEach(student -> System.out.println(student.toString()));
}
/***
* 导入Excel
* @param file Excel文件
* @param classz 实例类
* @return
*/
public static Object in(File file,Class> classz){
int i=0,j=0;
try {
Workbook rwb=Workbook.getWorkbook(file);
Sheet rs=rwb.getSheet(0);
int clos=rs.getColumns();//得到所有的列
int rows=rs.getRows();//得到所有的行
Map fieldMap = new HashMap();
StringBuffer fieldNames = new StringBuffer("");
for(Field field: classz.getDeclaredFields()){
if(field.isAnnotationPresent(Excel.class)){
Excel excel = field.getAnnotation(Excel.class);
fieldMap.put(excel.name(), field.getName());
}
}
for(j=0;j1)
fieldNames.setLength(fieldNames.length()-1);
String filedNames[] = fieldNames.toString().split(",");
List
/***
* 首字母大写(通过ASCII码实现)
* @param name
* @return
*/
public static String captureName(String name) {
char[] cs=name.toCharArray();
cs[0]-=32;
return String.valueOf(cs);
}