Excel万能读取Util类初级版 ExcelUtil excel读取 Excel万能

今天在构思一个能够读取任何Excel的java类,而不用做任何改变!只需要传入Model即可,今天写了一下,明天继续!

调用非常方便,简简单单两行代码就能读取你要的Excel数据,兼容性好03,07都兼容!我会写调用步骤,下面!

下面的内容可以略过了,到官网看文档

ExcelUtil文档官网http://likaixuan.top/excelUtil

【以下内容不推荐观看】

今天完成了,现在发布出来造福程序猿们!主要代码如下,需要源码的请到这里下载,想拿来直接用的,我也挺辛苦的就3分,下载的时候!

调用演示

 

现在不需要积分了,可以maven引入,不需要那么复杂了,下面的代码是最初版,现在已经改版了几次,最新代码已经在开源中国提交进行开源了,现在无需查看下面内容了,改版后的代码修复了几个bug点击这里跳转到

Excel万能读取Util类初级版 ExcelUtil excel读取 Excel万能_第1张图片

Excel万能读取Util类初级版 ExcelUtil excel读取 Excel万能_第2张图片

Excel格式如下

Excel万能读取Util类初级版 ExcelUtil excel读取 Excel万能_第3张图片

 

下面是主程序

 

package com.lkx.excel;

import java.io.FileInputStream;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

/**
 * 
 * ClassName: ExcelUtil Function: Excel万能读取公共类兼容03/07版Excel Reason: date:
 * 2016年11月23日 上午11:06:28
 * 
 * @author likaixuan
 * @version v1.0
 * @since JDK 1.7
 */
public class ExcelUtil {

	public static void main(String[] args) {

	}

	public static Map getMap(String keyValue) {
		Map map = new HashMap();
		if (keyValue != null) {
			String[] str = keyValue.split(",");
			for (int i = 0; i < str.length; i++) {
				String[] str2 = str[i].split(":");
				map.put(str2[0], str2[1]);
			}
		}
		return map;
	}

	/**
	 * readXls:(根据传进来的map集合读取Excel) 传进来两个参数,第一个Map
	 * 类型,第二个要反射的类的具体路径)
	 * 其中Map第一个为Excel列的名称,第二个为反射类的属性要求首字母大写,以便反射
	 * 
	 * @author likaixuan
	 * @param filePath
	 * @param map
	 * @param classPath
	 * @return
	 * @throws Exception
	 * @since JDK 1.7
	 */
	public static List readXls(String filePath, Map map,
			String classPath) throws Exception {

		Set keySet = map.keySet();// 返回键的集合

		/** 反射用 **/
		Class demo = null;
		Object obj = null;
		/** 反射用 **/

		List list = new ArrayList();
		demo = Class.forName(classPath);
		String fileType = filePath.substring(filePath.lastIndexOf(".") + 1,
				filePath.length());
		InputStream is = new FileInputStream(filePath);
		Workbook wb = null;

		if (fileType.equals("xls")) {
			wb = new HSSFWorkbook(is);
		} else if (fileType.equals("xlsx")) {
			wb = new XSSFWorkbook(is);
		} else {
			System.out.println("[ExcelUtil Error Message]:您输入的excel格式不正确");
		}
		lableBreak: for (int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) {// 获取每个Sheet表

			int rowNum_x = -1;// 记录第x行为表头
			Map cellmap = new HashMap();// 存放每一个field字段对应所在的列的序号

			Sheet hssfSheet = wb.getSheetAt(sheetNum);

			// 循环行Row
			for (int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
				Row hssfRow = hssfSheet.getRow(rowNum);
				if (hssfRow == null) {
					continue;
				}
				boolean flag = false;
				for (int i = 0; i < hssfRow.getLastCellNum(); i++) {
					if (hssfRow.getCell(i) != null
							&& !("").equals(hssfRow.getCell(i).toString()
									.trim())) {
						flag = true;
					}
				}
				if (!flag)
					continue;

				if (rowNum_x == -1) {
					// 循环列Cell
					for (int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++) {

						Cell hssfCell = hssfRow.getCell(cellNum);
						if (hssfCell == null) {
							continue;
						}

						String tempCellValue = "";
						tempCellValue = hssfSheet.getRow(rowNum)
								.getCell(cellNum).getStringCellValue().trim();
						Iterator it = keySet.iterator();
						while (it.hasNext()) {
							Object key = it.next();
							if (!("").equals(tempCellValue)
									&& key.equals(tempCellValue)) {
								rowNum_x = rowNum;
								cellmap.put(map.get(key).toString(), cellNum);
							}
						}
						if (rowNum_x == -1) {
							System.out
									.println("[ExcelUtil Error Message]:没有找到对应的字段或者对应字段行上面含有不为空白的行字段");
							break lableBreak;
						}
					}
				} else {
					obj = demo.newInstance();
					Iterator it = keySet.iterator();
					while (it.hasNext()) {
						Object key = it.next();
						Integer cellNum_x = cellmap
								.get(map.get(key).toString());
						if (cellNum_x == null
								|| hssfRow.getCell(cellNum_x) == null) {
							continue;
						}
						String attr = map.get(key).toString();// 得到属性

						Class attrType = demo.getField(attr).getType();
			
						Cell cell = hssfRow.getCell(cellNum_x);
						getValue(cell, obj, attr,attrType);

					}
					list.add(obj);
				}

			}
		}
		// wb.close();
		return list;
	}

	/**
	 * setter:(反射的set方法给属性赋值)
	 * 
	 * @author likaixuan
	 * @param obj
	 *            具体的类
	 * @param att
	 *            类的属性@注意首字母记得大写
	 * @param value
	 *            赋予属性的值
	 * @param type
	 *            属性是哪种类型 比如:String double boolean等类型
	 * @since JDK 1.7
	 */
	public static void setter(Object obj, String att, Object value,
			Class type) {
		try {
			Method method = obj.getClass().getMethod("set" + toUpperCaseFirstOne(att), type);
			method.invoke(obj, value);
		} catch (Exception e) {
			e.printStackTrace();
		}

	}

	/**
	 * getValue:(得到Excel列的值)
	 * 
	 * @author likaixuan
	 * @param hssfCell
	 * @return
	 * @since JDK 1.7
	 */
	public static void getValue(Cell cell, Object obj, String attr,Class attrType) {
		Object val = null;
		if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
			val = cell.getBooleanCellValue();
			
		} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
			if (DateUtil.isCellDateFormatted(cell)) {
				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
				try {
					if(attrType==String.class){
						val = sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue()));
					}else{
						val = dateConvertFormat(sdf.format(DateUtil.getJavaDate(cell.getNumericCellValue())));	
					}
				} catch (ParseException e) {
					System.out.println("日期格式转换错误");
				}
			} else {
				if(attrType==String.class){
					val = Double.toString(cell.getNumericCellValue());
				}else if(attrType==Float.class){
					val = (float)cell.getNumericCellValue();
				}else if(attrType==int.class){
					val = (int)cell.getNumericCellValue();
				}else{
					val = cell.getNumericCellValue();
				}
			}

		} else if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
			val = cell.getStringCellValue();
		}
		
		setter(obj, attr, val, attrType);
	}

	/**
	 *  首字母转小写
	 * @param s
	 * @return
	 */
	public static String toLowerCaseFirstOne(String s) {
		if (Character.isLowerCase(s.charAt(0)))
			return s;
		else
			return (new StringBuilder())
					.append(Character.toLowerCase(s.charAt(0)))
					.append(s.substring(1)).toString();
	}

	/**
	 *  首字母转大写
	 * @param s
	 * @return
	 */
	public static String toUpperCaseFirstOne(String s) {
		if (Character.isUpperCase(s.charAt(0)))
			return s;
		else
			return (new StringBuilder())
					.append(Character.toUpperCase(s.charAt(0)))
					.append(s.substring(1)).toString();
	}
	/**
	 * String类型日期转为Date类型
	 * @param dateStr
	 * @return
	 * @throws ParseException 
	 * @throws Exception
	 */
	public static Date dateConvertFormat(String dateStr) throws ParseException{
		Date date = new Date();
		SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
		date = format.parse(dateStr);
		return date ;
	}

}
 
  

 

 

 

 

 

你可能感兴趣的:(java)