Javaは任意のクラスExcelのインポートとエクスポートを実現

9335 ワード

実際のアプリケーションでは、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, "    ","      

"); 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 list = new ArrayList(); for (i = 1; i < rows; i++) { Object entity = classz.newInstance(); for (j = 0; j < clos; j++) { Field field = classz.getDeclaredField(filedNames[j]); String data = rs.getCell(j, i).getContents().trim(); Excel excel = field.getAnnotation(Excel.class); if((null == data || data.isEmpty()) && field.getAnnotation(Excel.class).require()) return " "+(i+1)+" "+(j+1)+" "; if(" ".equals(excel.name().trim()) && !(" ".equals(data) || " ".equals(data))) return " , "; Object object = null; Method method = classz.getMethod("set"+SpellHelper.captureName(filedNames[j]),field.getType()); if(null != data && !data.isEmpty()){ // if(field.getType() == int.class || field.getType() == Integer.class) object = Integer.parseInt(data); else if(field.getType() == long.class || field.getType() == Long.class) object = Long.parseLong(data); else if(field.getType() == short.class || field.getType() == Short.class) object = Short.parseShort(data); else if(field.getType() == float.class || field.getType() == Float.class) object = Float.parseFloat(data); else if(field.getType() == double.class || field.getType() == Double.class) object = Double.parseDouble(data); // else if(filedNames[j].endsWith("date") && excel.require()){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); sdf.parse(data); object = data; } else object = data; method.invoke(entity, object); } } list.add(entity); } return list; } catch (Exception e) { e.printStackTrace(); return " "+(i+1)+" "+(j+1)+" "; } } /*** * Excel * @param file Excel * @param obj ( ) * @param sheetName(Excel Sheet ) * @param */ public static void out(Class> clazz,File file,Object obj,String sheetName,String str_intro){ try { List list; // if(obj instanceof List){ list = (List)obj; } else{ list = new ArrayList(); list.add(obj); } if (!file.exists()) { file.getParentFile().mkdirs(); file.createNewFile(); } WritableWorkbook wwb = Workbook.createWorkbook(file); // WritableSheet ws = wwb.createSheet(sheetName, 0); //Excel WritableFont blackFont = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.BLACK); WritableFont redFont = new WritableFont(WritableFont.ARIAL,12,WritableFont.NO_BOLD,false,UnderlineStyle.NO_UNDERLINE,Colour.RED); // WritableCellFormat blackFormat = new WritableCellFormat(NumberFormats.TEXT); WritableCellFormat redFormat = new WritableCellFormat(NumberFormats.TEXT); blackFormat.setFont(blackFont); redFormat.setFont(redFont); Field[] fields = clazz.getDeclaredFields(); // @excel StringBuffer fileNames = new StringBuffer(); //Excel ws.getSettings().setDefaultColumnWidth(15); ws.getSettings().setDefaultRowHeight(300); // int col=0; for(Field field : fields){ if (field.isAnnotationPresent(Excel.class)) { Excel excel = field.getAnnotation(Excel.class); fileNames.append("get"+SpellHelper.captureName(field.getName())+","); ws.addCell(new Label(col++,0,excel.name(),excel.require()?redFormat:blackFormat)); } } // for(int i=0;i
/***
   *      (  ASCII   )
   * @param name
   * @return
   */
  public static String captureName(String name) {
   char[] cs=name.toCharArray();
         cs[0]-=32;
         return String.valueOf(cs); 
  }