poi excel导入工具类 -凯发k8国际

`
hbxflihua
  • 浏览: 653108 次
  • 性别:
  • 来自: 杭州
最近访客
博主相关
  • 博客
  • 微博
  • 相册
  • 收藏
  • 社区版块
    • ( 0)
    • ( 0)
    • ( 1)
    存档分类
    最新评论

    poi excel导入工具类

    poi excel导入工具类importutil

    import java.beans.beaninfo;
    import java.beans.introspector;
    import java.beans.propertydescriptor;
    import java.io.inputstream;
    import java.lang.reflect.method;
    import java.math.bigdecimal;
    import java.sql.date;
    import java.text.decimalformat;
    import java.text.parseexception;
    import java.text.simpledateformat;
    import java.util.arraylist;
    import java.util.hashmap;
    import java.util.list;
    import java.util.map;
    import org.apache.poi.hssf.usermodel.hssfworkbook;
    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.ss.usermodel.workbook;
    import org.apache.poi.xssf.usermodel.xssfworkbook;
    /**
     * excel导入工具类
     * 
     * @author lihua_java@163.com
     * @version 2.0
     * @since 2019-11-19
     *
     */
    public class importutil {
    	private final static string excel2003l = ".xls"; // 2003- 版本的excel
    	private final static string excel2007u = ".xlsx"; // 2007  版本的excel
    	private static final string date_format = "yyyy-mm-dd";
    	
    	/**
    	 * 获取io流中的数据,组装成list对象
    	 * @param in	输入流
    	 * @param filename	文件名称,根据后缀判断excel版本
    	 * @param fields	导入字段名称
    	 * @param fieldsclazz	导入字段类型,目前只支持基本类型
    	 * @param clazz		bean的class
    	 * @return	class对应的实例对象list集合
    	 * @throws exception
    	 */
    	public static  list getexcel(inputstream in, string filename, string[] fields, class[] fieldsclazz, class clazz) throws exception {
    		list list = new arraylist<>();
    		if(fields == null || fieldsclazz == null || fields.length != fieldsclazz.length){
    			throw new exception("需导入的列设置错误!");
    		}
    		map> fieldmap = new hashmap<>();
    		for (int i = 0, j = fields.length; i < j; i  ) {
    			fieldmap.put(fields[i], fieldsclazz[i]);
    		}
    		// 创建excel工作薄
    		workbook work = getworkbook(in, filename);
    		if (null == work) {
    			throw new exception("excel工作薄为空!");
    		}
    		sheet sheet = null;
    		row row = null;
    		cell cell = null;
    		sheet = work.getsheetat(0);
    		if (sheet == null) {
    			return list;
    		}
    		
    		// 遍历当前sheet中的所有行
    		for (int j = sheet.getfirstrownum(), y = sheet.getlastrownum(); j <= y; j  ) {
    			row = sheet.getrow(j);
    			if (row == null || row.getfirstcellnum() == j) {
    				continue;
    			}
    			
    			// 遍历所有的列
    			map fielddatas = new hashmap<>();
    			for (int k = row.getfirstcellnum(), z = row.getlastcellnum(); k < z; k  ) {
    				cell = row.getcell(k);
    				if(cell == null){
    					continue;
    				}
    				object value = getcellvalue(cell);
    				if(value == null){
    					continue;
    				}
    				fielddatas.put(fields[k], value);					
    			}
    			// bean添加到集合
    			list.add(cashtobean(fieldmap, fielddatas, clazz));			
    		}
    		return list;
    	}
    	
    	/**
    	 * 将读取的行数据转为实例对象
    	 * @param fieldsclazz	字段名称和字段类型集合
    	 * @param fielddatas	行数据
    	 * @param clazz			实例对象的class
    	 * @return
    	 * @throws exception
    	 */
    	private static  t cashtobean(map> fieldsclazz, map fielddatas, class clazz)
    		throws exception{
    		t entry = clazz.newinstance();
    		beaninfo beaninfo = introspector.getbeaninfo(clazz);
    		propertydescriptor[] propertydescriptors = beaninfo.getpropertydescriptors();
    		for (propertydescriptor property : propertydescriptors) {
    			string fieldname = property.getname();
    			if (fielddatas.containskey(fieldname)) {
    				method setter = property.getwritemethod();
    				object _value = cashfieldclass(fieldsclazz.get(fieldname), fielddatas.get(fieldname));
    				setter.invoke(entry, _value);
    			}
    		}
    		return entry;
    	}
    	/**
    	 * 属性类型转换
    	 * @param fieldsclazz	字段名称和字段类型集合
    	 * @param fielddata		行数据
    	 * @param fieldname		字段名称
    	 * @return
    	 * @throws parseexception
    	 */
    	private static object cashfieldclass(class fieldclazz, object value) throws parseexception {
    		object _value = value;
    		if(!fieldclazz.equals(value.getclass())){
    			string valuestr = value.tostring();
    			if(fieldclazz.equals(long.class)){
    				_value = long.valueof(valuestr);
    			}else if(fieldclazz.equals(integer.class)){
    				_value = integer.valueof(valuestr);
    			}else if(fieldclazz.equals(date.class)){
    				_value = new simpledateformat(date_format).parse(valuestr);
    			}else if(fieldclazz.equals(bigdecimal.class)){
    				_value = new bigdecimal(valuestr);
    			}else if(fieldclazz.equals(boolean.class)){
    				_value = boolean.valueof(valuestr);
    			}else if(fieldclazz.equals(double.class)){
    				_value = double.valueof(valuestr);
    			}else if(fieldclazz.equals(float.class)){
    				_value = float.valueof(valuestr);
    			}
    		}
    		return _value;
    	}
    	/**
    	 * 根据文件后缀,自适应上传文件的版本
    	 * 
    	 * @param instr
    	 * @param filename
    	 * @return
    	 * @throws exception
    	 */
    	public static workbook getworkbook(inputstream instr, string filename) throws exception {
    		workbook wb = null;
    		string filetype = filename.substring(filename.lastindexof(".")).tolowercase();
    		if (excel2003l.equals(filetype)) {
    			wb = new hssfworkbook(instr); // 2003-
    		} else if (excel2007u.equals(filetype)) {
    			wb = new xssfworkbook(instr); // 2007 
    		} else {
    			throw new exception("解析的文件格式有误!");
    		}
    		return wb;
    	}
    	/**
    	 * 对表格中数值进行格式化
    	 * 
    	 * @param cell
    	 * @return
    	 */
    	public static object getcellvalue(cell cell) {
    		object value = null;
    		decimalformat df = new decimalformat("0"); // 格式化number string字符
    		simpledateformat sdf = new simpledateformat(date_format); // 日期格式化
    		decimalformat df2 = new decimalformat("0.000"); // 格式化数字
    		
    		switch (cell.getcelltype()) {
    		case cell.cell_type_string:
    			value = cell.getrichstringcellvalue().getstring();
    			break;
    		case cell.cell_type_numeric:
    			if ("general".equals(cell.getcellstyle().getdataformatstring())) {
    				value = df.format(cell.getnumericcellvalue());
    			} else if ("m/d/yy".equals(cell.getcellstyle().getdataformatstring())) {
    				value = sdf.format(cell.getdatecellvalue());
    			} else {
    				value = df2.format(cell.getnumericcellvalue());
    			}
    			break;
    		case cell.cell_type_boolean:
    			value = cell.getbooleancellvalue();
    			break;
    		case cell.cell_type_blank:
    			value = "";
    			break;
    		default:
    			break;
    		}
    		return value;
    	}
    	
    }
    

     

     示例代码如下:

        /**
         * 持仓划转导入
         * @param upload
         * @param request
         * @param response
         */
        @requestmapping("/modules/manage/artpos/import.htm")
        public void importpos(@requestparam(value = "upload") multipartfile upload,
        		httpservletrequest request , httpservletresponse response)throws exception{
        	string[] fields = {"fromphone", "tophone", "artcode", "transfernumber", "transferprice", "remark"};
        	class[] fieldsclazz = {string.class, string.class, string.class, integer.class, bigdecimal.class, string.class};
        	list list = importutil.getexcel(upload.getinputstream(), 
        			upload.getoriginalfilename(), fields, fieldsclazz, artpositiontransfermodel.class);
        	artpositiontransferservice.savebatch(list);
        	servletutils.success(response);
        }

     

    分享到:
    评论

    相关推荐

      基于poi的excel导入导出封装,poi版本 <groupid>org.apache.poi <artifactid>poi <version>4.1.0 <groupid>org.apache.poi <artifactid>poi-ooxml <version>4.1.0 </dependency>

      java导入excel的工具类。支持单个对象的赋值,列表对象的赋值,指定坐标的赋值。主要利用的是poi的技术,java反射和自定义注解

      poi excel 工具类poi excel 工具类poi excel 工具类poi excel 工具类poi excel 工具类

      poi导出excel工具类 支持大数据量 多sheet页方式 已经封装好,直接拿来调用里面的方法传入参数就行 很简单

      概述:java poi导入导出excel工具类(兼容各版本) 一、功能说明 允许同时导入或导出多个sheet,同一sheet可同时存在多个数据块,按数据块划分处理数据。 二、配置文件示例及详细说明 1、导入xml配置示例如下(见...

      java导入excel的工具类。支持单个对象的赋值,列表对象的赋值,指定坐标的赋值。主要利用的是poi的技术,java反射和自定义注解。 20170915,解决了不能导入带有公式字段的excel的问题

      支持excel2003、2007,导入的直接传入multipartfile.getinputstream(),返回list,string>>,再做处理。 导出的数据直接生成excel文档存在本地,返回路径。

      基于反射的excel操作工具类,可以灵活设置表头以及内容,可根据数据类型匹配成pojo,支持正则表达式等

      java的poi的导入工具类,只需要传入两个arraylist,一个是execl的标题,一个是ececl的数据,就可以直接导出到execl里面,支持最新的execl,全新封装的,让每一个人都会使用poi导出execl!

      java poi excel 模板导入通用工具类,支持 2003/2007 版excel 详细看里面的readme.md

      利用poi导入导出excel xls,xlsx

      excel导入导出 jxl及poi 工具类:jxl 实现 及 poi实现 非常实用

      java 导入导出excel工具类,别人3积分,我1积分,嘿嘿

      excel导入导出(poi工具类)

      excel poi工具类 导入 导出 合并单元格 计算公式

      poi千万级导入导出excel工具

      poi 3.10 excel导入导出工具包 , 含详细文档 ,自己常用,需要可下

      excel java导入导出,示例代码,修改下就可以作为自己的工具类。使用的是poi jar包,压缩包里包含有用到的 poi jar包。

      poi导入,导出封装工具类,支持多sheet,将excel数据读取放入泛型集合中,由于excel对数据的判断比较麻烦,此工具类可以只读取正确的excel数据,错误的数据会在excel数据列后一列,提示错误信息,当然错误信息需要自己...

    global site tag (gtag.js) - google analytics
    网站地图