`
jkxydp
  • 浏览: 2816 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论
阅读更多
package com.dp.util;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
 * Excel通用处理器
 * @author jkxydp
 *
 */
public class AllPurposeExcelProcesser {
	/**
	 * 通过调用POI读Excel的较为通用的方式,其中约定:excel的第一行中每列的内容为字符串,并且与你定义的model中的字段相对应,你的类遵循JavaBean标准
	 * @param <T> 你希望读取后组装的数据结构定义
	 * @param excel	你要读取的文件
	 * @param modelType 你希望组装的数据的定义的字节码,该字节码描述中必须包含一个无参构造器
	 * @param sheetName 你要读取的文件中的工作表的名称
	 * @return	一个装载了读取后获得对象的List
	 * @throws FileNotFoundException
	 * @throws IOException
	 * @throws IllegalArgumentException
	 * @throws SecurityException
	 * @throws InstantiationException
	 * @throws IllegalAccessException
	 * @throws InvocationTargetException
	 * @throws NoSuchMethodException
	 */
	public static <T> List<T> read(File excel,Class<T> modelType,String sheetName) throws FileNotFoundException, IOException, IllegalArgumentException, SecurityException, InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException{
		Method[] methods = modelType.getMethods();
		Workbook wb = getWorkBook(excel);
		if(wb == null)
			return null;
		List<T> models = new ArrayList<T>();	//创建容器,用于装置所有读取出来的model
		Sheet sheet = wb.getSheet(sheetName);	//根据提供的sheet名称拿到整张表
		int rows = sheet.getPhysicalNumberOfRows();
		Row zeroRow = sheet.getRow(0);	//拿到第零行表格,解析列与字段之间的对应关系
		Map<Integer,Method> colMark = new HashMap<Integer, Method>();	//存储方法与字段的对应关系
		for(short i = 0; i < zeroRow.getLastCellNum(); i ++){
			Cell tip = zeroRow.getCell(i);
			if(null != tip && tip.getCellType() == Cell.CELL_TYPE_STRING) {
				String curTipName = tip.getStringCellValue();
				for(int j = 0; j < methods.length; j ++) {
					if(("set" + curTipName.toUpperCase().charAt(0) + curTipName.substring(1)).equals(methods[j].getName())) {
						colMark.put((int)i, methods[j]);
					}
				}
			}
		}
		Cell curCell = null;
		boolean flag = true;
		for(int i = 1; i < rows; i ++) {
			Row aModel = sheet.getRow(i);
			if(null != aModel) {
				T model = modelType.getConstructor().newInstance();
				for(int col = 0; col < colMark.size(); col ++) {
					curCell = aModel.getCell(col);
					if(null != curCell){
						switch (curCell.getCellType()) {
						case Cell.CELL_TYPE_STRING: 
						case Cell.CELL_TYPE_FORMULA:
						case Cell.CELL_TYPE_BLANK:
							  if(colMark.get(col).getParameterTypes()[0] == String.class) {
								  colMark.get(col).invoke(model, curCell.getStringCellValue());
							  } else {
									flag = false;
							  }
							  break;
						case Cell.CELL_TYPE_NUMERIC:
							if(colMark.get(col).getParameterTypes()[0] == int.class || colMark.get(col).getParameterTypes()[0] == Integer.class) {
							  colMark.get(col).invoke(model, (int)Math.round(curCell.getNumericCellValue()));
							} else if (colMark.get(col).getParameterTypes()[0] == Double.class || colMark.get(col).getParameterTypes()[0] == double.class) {
								colMark.get(col).invoke(model, curCell.getNumericCellValue());
							} else if(colMark.get(col).getParameterTypes()[0] == Float.class || colMark.get(col).getParameterTypes()[0] == float.class) {
								colMark.get(col).invoke(model, (float)curCell.getNumericCellValue());
							} else if(colMark.get(col).getParameterTypes()[0] == Long.class || colMark.get(col).getParameterTypes()[0] == long.class) {
								colMark.get(col).invoke(model, Math.round(curCell.getNumericCellValue()));
							} else if(colMark.get(col).getParameterTypes()[0] == Short.class || colMark.get(col).getParameterTypes()[0] == short.class) {
								colMark.get(col).invoke(model, (short)Math.round(curCell.getNumericCellValue()));
							} else if(colMark.get(col).getParameterTypes()[0] == Byte.class || colMark.get(col).getParameterTypes()[0] == byte.class) {
								colMark.get(col).invoke(model, (byte)Math.round(curCell.getNumericCellValue()));
							} else if(colMark.get(col).getParameterTypes()[0] == Date.class) {
								colMark.get(col).invoke(model, curCell.getDateCellValue());
							}else {
								flag = false;
							}
						  	break;
						case Cell.CELL_TYPE_BOOLEAN:
							if(colMark.get(col).getParameterTypes()[0] == Boolean.class || colMark.get(col).getParameterTypes()[0] == boolean.class) {
							  colMark.get(col).invoke(model, curCell.getBooleanCellValue());
							} else {
								flag = false;
							}
						  	break;
						default:
							break;
						}
						if(!flag) break;
					}
				}
				if(flag) models.add(model);
				flag = true;
			}
		}
		return models;
	}
	/**
	 *	Excel处理2003与2007差异
	 */
	private static Workbook getWorkBook(File excel) throws FileNotFoundException, IOException {
		return excel.getName().endsWith("xls") ? 
				new HSSFWorkbook(new BufferedInputStream(new FileInputStream(excel))) : 
					excel.getName().endsWith("xlsx") ? 
							new XSSFWorkbook(new BufferedInputStream(new FileInputStream(excel))):null;
	}
}

这是今天上班的时候工作做完了,无聊时写的一个相对通用的基于POI3.6的读取Excel的类,今后还会把它完善。
今后无聊就写点工具类,试着实现一个C/S模式分布式的MVC框架,希望我的理想不是梦!
分享到:
评论

相关推荐

    超实用的android自定义log日志输出工具类

    android自定义log日志输出工具,该工具类具有以下优点: 1 在LogUtlis方法的第一个参数中填this可以输出当前类的名称,特别是在匿名内部类使用也可以输出当前类名。 如 : LogUtils.i(this,”这是一个实用的日志...

    小程序源码 小工具类(带后台)

    小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带后台)小程序源码 小工具类(带...

    jaava和jsp工具类

    [工具类] 获得汉字拼音首字母的java工具类 .java [工具类] 获取绝对路径 .java [工具类] 记录log日志文件的工具类 .java [工具类] 连接数据库的工具类 .java [工具类] 使用Java程序来实现HTTP文件的队列下载 ....

    Java开发工具类

    Class类工具 \Cookie工具类 \excel读取 工具类\Java如何生成验证码图片和点击刷新验证码\java获取当前月第一天和最后一天,上个月第一天和最后一天\java实现ftp文件的上传与下载\Json工具类 - JsonUtils.java\JS...

    Java实体类字段生成工具类-将数据库表列字段转为Java实体类驼峰字段

    为了解决这个问题,开发了这个Java实体类字段生成工具类。 2、该工具类可以将数据库表列字段转化为对应的Java实体类字段。生成的实体类字段格式清晰易读,且符合Java命名规范。通过使用该工具类,可以大大提高开发...

    Android开发常用工具类合集

    本资源包括常用工具类,目前收录了数组工具类、异步工具类、base64工具类、bitmap工具类、缓存工具类、时间工具类、http连接、json、IO、Map、MD5、数据库、SD卡、UbbToHtml等工具类合集

    30个java工具类

    [工具类] CookieCounter .java.txt [工具类] 验证码img .jsp.txt [工具类] Java中计算任意两个日期之间的工作天数 .java.txt [工具类] java抓取网页 .java.txt [工具类] MD5 .java.txt [工具类] MD5强化版 .java.txt...

    java连接SqlServer完整代码,工具类,jdbc

    java连接SqlServer完整代码,工具类,jdbc JDBC工具类的构建 1.资源释放 见https://mp.csdn.net/postedit/86577443 2.驱动防二次注册 ``` Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); //...

    金蝶bos万能工具类和开发工具类代码.rar

    金蝶bos万能工具类和开发工具类代码,java源代码打包,金蝶给用户使用时需要二次开发,因此需要一些类的说明。金蝶BOS是一个开放的集成与应用平台,是金蝶ERP解决方案、合作伙伴解决方案以及客户定制应用的技术平台...

    常用的java工具类

    1.[工具类] 读取、打印输出、保存xml .java 2.[工具类] Java中计算任意两个日期之间的工作天数 .java 3.[工具类] MD5 .java 4.[工具类] 时间工具TimeUtil.java 5.[工具类] 通信服务端simpleServer 6.[工具类] 使用...

    【强2】30个java工具类

    使用java工具类可有效的提高开发效率! 没有CSDN积分的朋友到这里源头下载:http://www.javacs.cn/bbs/thread-382-1-1.html 感谢支持 [工具类] CookieCounter .java.txt [工具类] 验证码img .jsp.txt [工具类] Java中...

    Java文件工具类

    Java文件工具类

    微信公众号支付签名生成工具类和xml转换工具类和双向验证请求工具类

    微信公众号支付签名生成工具类和xml和map转换工具类和双向验证请求工具类

    我积攒的java工具类 基本满足开发需要的工具类

    D:\002 我的工具类\001 流 D:\002 我的工具类\001 流\文件操作整体 D:\002 我的工具类\001 流\文件操作整体\FileEncodingUtil.java D:\002 我的工具类\001 流\文件操作整体\FileReadImpl.java D:\002 我的工具类\001...

    SpringBoot中封装jdbc工具类

    现在的数据层的开发,大多会使用如MyBatis或...由于部分场景下MyBatis或JPA之类无法满足我的需求,所以我打算自己封装一套查数据库的工具类。 文章地址: https://blog.csdn.net/lxyoucan/article/details/124042295

    jedisUtil工具类java

    jedis的工具类,java代码写的,非常全面,jedis的工具类,java代码写的,非常全面jedis的工具类,java代码写的,非常全面jedis的工具类,java代码写的,非常全面jedis的工具类,java代码写的,非常全面jedis的工具类...

    Elasticsearch工具类

    Elasticsearch工具类,支持通过标签注释实体类并通过工具类实现对es的映射(把po的结构导入es),和对es的增删查改,包括分页,scroll读取,关联查询等。

    RabbitMQ工具类及测试类(完整版)

    RabbitMQClientUtil是MQ的测试工具类,他封装了fanout、direct、topic三种exchange模式,并包括发送数据和接收数据。 Test1、Test2是测试类 使用maven管理,在pom.xml文件中引入如下代码: &lt;!-- Rabbitmq工具包...

    Rabbitmq工具类,java工具类RabbitmqUtil

    1、java工具类RabbitmqUtil是本人封装好的直接使用 2、常用的方法都在里面 3、改一下初始化配置参数就行

    工具类_java_开发工具类_

    工具类

Global site tag (gtag.js) - Google Analytics