今天在构思一个能够读取任何Excel的java类,而不用做任何改变!只需要传入Model即可,今天写了一下,明天继续!
调用非常方便,简简单单两行代码就能读取你要的Excel数据,兼容性好03,07都兼容!我会写调用步骤,下面!
下面的内容可以略过了,到官网看文档
ExcelUtil文档官网http://likaixuan.top/excelUtil
【以下内容不推荐观看】
今天完成了,现在发布出来造福程序猿们!主要代码如下,需要源码的请到这里下载,想拿来直接用的,我也挺辛苦的就3分,下载的时候!
调用演示
现在不需要积分了,可以maven引入,不需要那么复杂了,下面的代码是最初版,现在已经改版了几次,最新代码已经在开源中国提交进行开源了,现在无需查看下面内容了,改版后的代码修复了几个bug点击这里跳转到
Excel格式如下
下面是主程序
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<String, String> getMap(String keyValue) {
Map<String, String> map = new HashMap<String, String>();
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
* <String,String>类型,第二个要反射的类的具体路径)
* 其中Map第一个为Excel列的名称,第二个为反射类的属性要求首字母大写,以便反射
*
* @author likaixuan
* @param filePath
* @param map
* @param classPath
* @return
* @throws Exception
* @since JDK 1.7
*/
public static List<Object> readXls(String filePath, Map map,
String classPath) throws Exception {
Set keySet = map.keySet();// 返回键的集合
/** 反射用 **/
Class<?> demo = null;
Object obj = null;
/** 反射用 **/
List<Object> list = new ArrayList<Object>();
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<String, Integer> cellmap = new HashMap<String, Integer>();// 存放每一个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 ;
}
}
本文介绍了一个能够读取任何Excel的Java类ExcelUtil,只需传入Model即可,兼容Excel 2003和2007。调用简单,两行代码即可完成数据读取。作者已发布源码并进行了多次改进,现已开源。

439

被折叠的 条评论
为什么被折叠?



