Java程序导入 .xls文件 优化

首先建立注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface ExcelAnnotation {
    // excel导出时标题显示的名字,如果没有设置Annotation属性,将不会被导出和导入
    public String exportName();
}

 

xls文件模板 下面以廉政建设导入为例

先建立Vo类

public class PartyOrganizationsVO {
 
  @Override
 public String toString() {
  return "PartyOrganizationsVO [orgName=" + orgName + ", orgType="
    + orgType + ", orgClerk=" + orgClerk + ", members=" + members
    + ", areaName=" + areaName + "]";
 }
  @ExcelAnnotation(exportName="党组织名称")
  private String orgName;//党组织名称
  @ExcelAnnotation(exportName = "党组织类别")
  private String orgType;//党组织类别
  @ExcelAnnotation(exportName = "党组织书记")
  private String orgClerk;//党组织书记
  @ExcelAnnotation(exportName = "委员")
  private String members;//委员
  @ExcelAnnotation(exportName = "所属辖区")
     private String areaName; //所属辖区
  private String importErrorRecord;//错误记录 
  
  public String getOrgName() {
   return orgName;
  }
  public void setOrgName(String orgName) {
   this.orgName = orgName;
  }
  public String getOrgType() {
   return orgType;
  }
  public void setOrgType(String orgType) {
   this.orgType = orgType;
  }
  public String getOrgClerk() {
   return orgClerk;
  }
  public void setOrgClerk(String orgClerk) {
   this.orgClerk = orgClerk;
  }
  public String getMembers() {
   return members;
  }
  public void setMembers(String members) {
   this.members = members;
  }
  public String getAreaName() {
   return areaName;
  }
  public void setAreaName(String areaName) {
   this.areaName = areaName;
  }
  public String getImportErrorRecord() {
   return importErrorRecord;
  }
  public void setImportErrorRecord(String importErrorRecord) {
   this.importErrorRecord = importErrorRecord;
  }
  
  
}
<pre class="java" name="code">import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFName;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

/**
 * 通用Excel导入
 *
 * @param <T>
 */
public class ExcelImport<T> {
    Class<T> clazz;

    public ExcelImport(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * 导入Excel
     *
     * @param titleIndex 表头索引
     * @param file       excel文件 路径
     * @param pattern
     * @return
     */
    public Collection<T> importExcel(int titleIndex, File file, String... pattern) {
        Collection<T> dist = new ArrayList();
        try {
            /**
             * 类反射得到调用方法
             */
            // 得到目标目标类的所有的字段列表
            Field filed[] = clazz.getDeclaredFields();
            // 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中
            Map fieldmap = new HashMap();
            // 循环读取所有字段
            for (int i = 0; i < filed.length; i++) {
                Field f = filed[i];
                // 得到单个字段上的Annotation
                ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
                // 如果标识了Annotationd的话
                if (exa != null) {
                    // 构造设置了Annotation的字段的Setter方法
                    String fieldname = f.getName();
                    String setMethodName = "set"
                            + fieldname.substring(0, 1).toUpperCase()
                            + fieldname.substring(1);
                    // 构造调用的method,
                    Method setMethod = clazz.getMethod(setMethodName,
                            new Class[]{f.getType()});
                    // 将这个method以Annotaion的名字为key来存入。
                    fieldmap.put(exa.exportName(), setMethod);
                }
            }
            /**
             * excel的解析开始
             */
            // 将传入的File构造为FileInputStream;
            FileInputStream in = new FileInputStream(file);
            // // 得到工作表
            HSSFWorkbook book = new HSSFWorkbook(in);
            // // 得到第一页
            HSSFSheet sheet = book.getSheetAt(0);
            // // 得到第一面的所有行
            Iterator<Row> row = sheet.rowIterator();

            /**
             * 标题解析
             */
            // 得到第一行,也就是标题行
            Row title = row.next();
            for (int i = 1; i < titleIndex; i++) {
                //获取表头
                title = row.next();
            }
            // 得到第一行的所有列
            Iterator<Cell> cellTitle = title.cellIterator();
            // 将标题的文字内容放入到一个map中。
            Map titlemap = new HashMap();
            // 从标题第一列开始

            // 循环标题所有的列的名称
            int i = 0;  // 从标题第一列开始
            // 循环标题所有的列
            while (cellTitle.hasNext()) {
                Cell cell = cellTitle.next();
                String value = cell.getStringCellValue();
                titlemap.put(i, value);
                i = i + 1;
            }
            /**
             * 解析内容行
             */
            //用来格式化日期的DateFormat
            SimpleDateFormat sf;
            if (pattern.length < 1) {
                sf = new SimpleDateFormat("yyyy-MM-dd");
            } else
                sf = new SimpleDateFormat(pattern[0]);
            while (row.hasNext()) {
                // 标题下的第一行
                Row rown = row.next();

                // 行的所有列
                Iterator<Cell> cellbody = rown.iterator();
                // 得到传入类的实例
                T tObject = clazz.newInstance();
                int k = 0;
                // 遍历一行的列
                int size=rown.getLastCellNum();//单元格数
                for(int j=0;j<size;j++){

                    Cell cell = rown.getCell(j, Row.CREATE_NULL_AS_BLANK);
                    // 这里得到此列的对应的标题
                    String titleString = (String) titlemap.get(k);
                    // 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
                    if (fieldmap.containsKey(titleString)) {
                        Method setMethod = (Method) fieldmap.get(titleString);
                        //得到setter方法的参数
                        Type[] ts = setMethod.getGenericParameterTypes();
                        //只要一个参数
                        String xclass = ts[0].toString();
                        //判断参数类型
                        try {
                            if (xclass.equals("class java.lang.String")) {
                                if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
                                    //如果是数字,转换成字符串
                                    cell.setCellType(Cell.CELL_TYPE_STRING);
                                    setMethod.invoke(tObject, cell.getStringCellValue());
                                } else {
                                    setMethod.invoke(tObject, cell.getStringCellValue());
                                }
                            } else if (xclass.equals("class java.util.Date")) {
                                setMethod.invoke(tObject, sf.parse(cell.getStringCellValue()));
                            } else if (xclass.equals("class java.lang.Boolean")) {
                                Boolean boolname = true;
                                if (cell.getStringCellValue().equals("否")) {
                                    boolname = false;
                                }
                                setMethod.invoke(tObject, boolname);
                            } else if (xclass.equals("class java.lang.Integer")) {
                                setMethod.invoke(tObject, new Integer(cell.getStringCellValue()));
                            } else if (xclass.equals("class java.lang.Long")) {
                                setMethod.invoke(tObject, new Long(cell.getStringCellValue()));
                            }
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            continue;
                        }
                    }
                    // 下一列
                    k = k + 1;
                }
                dist.add(tObject);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return dist;
    }

    /**
     * 根据Cell名称导入Excel
     *
     * @param titleIndex 表头索引
     * @param file       excel文件 路径
     * @param pattern
     * @return
     */
    public Collection<T> importExcelByCellName(int titleIndex, Map titlemap, File file, String... pattern) {
        Collection<T> dist = new ArrayList();
        try {
            /**
             * 类反射得到调用方法
             */
            // 得到目标目标类的所有的字段列表
            Field filed[] = clazz.getDeclaredFields();
            // 将所有标有Annotation的字段,也就是允许导入数据的字段,放入到一个map中
            Map fieldmap = new HashMap();
            // 循环读取所有字段
            for (int i = 0; i < filed.length; i++) {
                Field f = filed[i];
                // 得到单个字段上的Annotation
                ExcelAnnotation exa = f.getAnnotation(ExcelAnnotation.class);
                // 如果标识了Annotationd的话
                if (exa != null) {
                    // 构造设置了Annotation的字段的Setter方法
                    String fieldname = f.getName();
                    String setMethodName = "set"
                            + fieldname.substring(0, 1).toUpperCase()
                            + fieldname.substring(1);
                    // 构造调用的method,
                    Method setMethod = clazz.getMethod(setMethodName,
                            new Class[]{f.getType()});
                    // 将这个method以Annotaion的名字为key来存入。
                    fieldmap.put(exa.exportName(), setMethod);
                }
            }
            /**
             * excel的解析开始
             */
            // 将传入的File构造为FileInputStream;
            FileInputStream in = new FileInputStream(file);
            // // 得到工作表
            HSSFWorkbook book = new HSSFWorkbook(in);
            // // 得到第一页
            HSSFSheet sheet = book.getSheetAt(0);
            // // 得到第一面的所有行
            Iterator<Row> row = sheet.rowIterator();

            /**
             * 标题解析
             */
            // 得到第一行,也就是标题行
            Row title = row.next();
            for (int i = 1; i < titleIndex; i++) {
                //获取表头
                title = row.next();
            }
            // 得到第一行的所有列
            Iterator<Cell> cellTitle = title.cellIterator();

            /**
             * 解析内容行
             */
            //用来格式化日期的DateFormat
            SimpleDateFormat sf;
            if (pattern.length < 1) {
                sf = new SimpleDateFormat("yyyy-MM-dd");
            } else
                sf = new SimpleDateFormat(pattern[0]);
            while (row.hasNext()) {
                // 标题下的第一行
                Row rown = row.next();

                // 行的所有列
                Iterator<Cell> cellbody = rown.cellIterator();
                // 得到传入类的实例
                T tObject = clazz.newInstance();
                int k = 1;
                // 遍历一行的列
                int size=rown.getLastCellNum();//单元格数
                for(int j=0;j<size;j++){
                    Cell cell = rown.getCell(j, Row.CREATE_NULL_AS_BLANK);
                    // 这里得到此列的对应的标题
                    String titleString = (String) titlemap.get(k);
                    // 如果这一列的标题和类中的某一列的Annotation相同,那么则调用此类的的set方法,进行设值
                    if (fieldmap.containsKey(titleString)) {
                        Method setMethod = (Method) fieldmap.get(titleString);
                        //得到setter方法的参数
                        Type[] ts = setMethod.getGenericParameterTypes();
                        //只要一个参数
                        String xclass = ts[0].toString();
                        //判断参数类型
                        try {
                            if (xclass.equals("class java.lang.String")) {
                                if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {
                                    //如果是数字,转换成字符串
                                    cell.setCellType(Cell.CELL_TYPE_STRING);
                                    setMethod.invoke(tObject, cell.getStringCellValue());
                                } else {
                                    setMethod.invoke(tObject, cell.getStringCellValue());
                                }
                            } else if (xclass.equals("class java.util.Date")) {
                                setMethod.invoke(tObject, sf.parse(cell.getStringCellValue()));
                            } else if (xclass.equals("class java.lang.Boolean")) {
                                Boolean boolname = true;
                                if (cell.getStringCellValue().equals("否")) {
                                    boolname = false;
                                }
                                setMethod.invoke(tObject, boolname);
                            } else if (xclass.equals("class java.lang.Integer")) {
                                setMethod.invoke(tObject, new Integer(cell.getStringCellValue()));
                            } else if (xclass.equals("class java.lang.Long")) {
                                setMethod.invoke(tObject, new Long(cell.getStringCellValue()));
                            }
                        } catch (Exception ex) {
                            ex.printStackTrace();
                            continue;
                        }
                    }
                    // 下一列
                    k = k + 1;
                }
                dist.add(tObject);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return dist;
    }

    public static void main(String[] args) {

        //生成模板

        String[] headers = new String[3];
        headers[0] = "姓名";
        headers[1] = "手机";
        headers[2] = "职务";
        try {
            FileOutputStream fileOut = null;
            SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
            // fileOut = new FileOutputStream("E:/" + df.format(new Date()) + ".xls");
            // ExcelUtils.createTemplate(fileOut,headers);
            // fileOut.close();
        } catch (Exception ex) {
            ex.printStackTrace();
        }

    }

}

public class TestImportParty extends TestCase{
/**
 * 党组织信息导入测试
 */
	@Test
    public void testPartyImport()
    {
        ExcelImport<PartyOrganizationsVO> test = new ExcelImport(PartyOrganizationsVO.class);
        File file = new File("E:\\导入\\党组织信息导入模版.xls");
        Long befor = System.currentTimeMillis();
        List<PartyOrganizationsVO> result = (ArrayList) test.importExcel(2,file);

        Long after = System.currentTimeMillis();
        System.out.println("此次操作共耗时:" + (after - befor) + "毫秒");
        if(result!=null) {
            for (int i = 0; i < result.size(); i++) {
            	PartyOrganizationsVO stu = result.get(i);
                System.out.println(stu.toString());
            }
        }

        System.out.println("共转化为List的行数为:" + result.size());

    }
}

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值