精华内容
下载资源
问答
  • NULL 博文链接:https://fsh430623.iteye.com/blog/1318545
  • java导入excel的工具类。支持单个对象的赋值,列表对象的赋值,指定坐标的赋值。主要利用的是poi的技术,java反射和自定义注解。 20170915,解决了不能导入带有公式字段的excel的问题
  • POI导入Excel,详细内容查看博客 POI导入Excel文件--form表单提交 内容
  • SpringMvc+POI 导入Excel

    2015-11-18 10:17:32
    SpringMvc+POI 导入Excel文件,采用简单的form表单提交方式和Jquery.form.js插件提供的异步表单方式导入Excel数据
  • 开发中经常会遇到excel的处理,导入导出解析等等,java中比较流行的用poi,但是每次都要写大段工具类来搞定这事儿,此处推荐一个别人造好的轮子,下面介绍下“轮子”的使用。
  • POI导入Excel并返回校验后的错误文件(原样数据文件,并添加批注,注:由于批注只能加1000条,会在Excel后面添加一栏错误信息)下载以及页面展示校验错误信息,同时添加导入进度条,提供页面js和css代码,后端...
  • 导入Excel相对麻烦点,一般情况下,导入的程序无法通用的主要原因是:对于不同的导入模板,字段field与单元格cellRef的映射关系是不相同的,这就导致对每一个导入模板都要去写一套相似的代码;我们应该想办法解决...
  • poi导入excel

    2017-06-30 15:56:25
    poi导入excel2003,2007通用
  • java导入excel的工具类。支持单个对象的赋值,列表对象的赋值,指定坐标的赋值。主要利用的是poi的技术,java反射和自定义注解
  • 使用poi导入excel详细代码

    千次阅读 2020-08-18 18:21:34
    使用poi导入excel详细代码 1.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-scratchpad</artifactId> <version>3.10.1</version> <...

    使用poi导入excel详细代码

    1.导入依赖

     <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>3.10.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.xmlbeans</groupId>
                <artifactId>xmlbeans</artifactId>
                <version>2.6.0</version>
            </dependency>
            <dependency>
                <groupId>fr.opensagres.xdocreport</groupId>
                <artifactId>org.apache.poi.xwpf.converter.core</artifactId>
                <version>1.0.6</version>
            </dependency>
            <dependency>
                <groupId>fr.opensagres.xdocreport</groupId>
                <artifactId>org.apache.poi.xwpf.converter.xhtml</artifactId>
                <version>1.0.6</version>
            </dependency>
    

    版本自己选择即可.


    2.编写导入工具类
    具体代码如下

     /**
         * 导入excel表格.返回的是List<Object> 的数据结构,使用反射去赋值.
         * @param file  导入的文件
         * @param clazz  存储数据的实体
         * @param <T>  表示这个方法是泛型方法.
         * @return
         */
       public static <T> List<T> readExcel(MultipartFile file, Class<T> clazz){
            try{
                //最终返回数据
                List<T> resultList = new ArrayList<T>();
    
                Workbook workbook = null;
                InputStream is = file.getInputStream();
                String name = file.getOriginalFilename().toLowerCase();
                // 创建excel操作对象
                if (name.contains(".xlsx") || name.contains(".xls")) {
                    //使用工厂方法创建.
                    workbook = WorkbookFactory.create(is);
                } 
                //得到一个工作表
                Sheet sheet = workbook.getSheetAt(0);
                //获得数据的总行数
                int totalRowNum = sheet.getLastRowNum();
                //获得总列数
                int cellLength = sheet.getRow(0).getPhysicalNumberOfCells();
                //获取表头
                Row firstRow = sheet.getRow(0);
                //获取反射类的所有字段
                Field [] fields =  clazz.getDeclaredFields();
                //创建一个字段数组,用于和excel行顺序一致.
                Field [] newFields = new Field[cellLength];
                //获取静态方法.该方法是用于把excel的表头映射成实体字段名.
                // convert方法是在反射的类中的静态方法.也防止Excel中的表头              
                //和反射的类的字段顺序不一致,导致数据读取在不正确的属性上
                   /** 
    			     public static String convert(String str){
    			         switch (str){
    			         case "身份证号码": return  "idNumber";
    			         case "名称":  return "employeeName";
    			         case "年龄":  return "age";
    			         case "出生日期":  return "birthDate";
    			         case "性别":  return "gender";
    			         default: return  str;
    			         }
    			     }
    			     */ 
                Method m = clazz.getDeclaredMethod("convert", String.class);
    			  Object ob = clazz.newInstance();
                for(int i=0;i<cellLength;i++) {
                    for (Field field:fields) {
                        Cell  cell = firstRow.getCell(i);
                        //按照excel中的存储存放数组,以便后面遍历excel表格,数据一一对应.
                        if(m.invoke(ob,getXCellVal(cell)).equals(field.getName())){
                            newFields[i] = field;
                            continue;
                        }
                    }
                }
    
                //从第x行开始获取
                for(int x = 1 ; x <= totalRowNum ; x++){
                    T object = clazz.newInstance();
                    //获得第i行对象
                    Row row = sheet.getRow(x);
                    //如果一行里的所有单元格都为空则不放进list里面
                    int a = 0;
                    for(int y=0;y<cellLength;y++){
                        if (!(row==null)) {
                            Cell cell = row.getCell(y);
                            if (cell == null) {
                                a++;
                            } else {
                                Field field = newFields[y];
                                String value =  getXCellVal(cell);
                                  if (value!=null && !value.equals("")){
                                    //给字段设置值.
                                    setValue(field,value,object);
                                }
                            }
                        }
                    }//for
                    if(a!=cellLength && row!=null){
                        resultList.add(object);
                    }
                }
                return  resultList;
            }catch (Exception e){
                e.printStackTrace();
            }
    
        }
       
    

    工具类中使用的方法如下:

     /**
         * 给字段赋值,判断值的类型,然后转化成实体需要的类型值.
         * @param field  字段
         * @param value  值
         * @param object  对象
         */
        private static void setValue(Field field, String value, Object object) {
            try {
                field.setAccessible(true);
                DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
                if (field.getGenericType().toString().contains("Integer")){
                    field.set(object,Integer.valueOf(value));
                }else if(field.getGenericType().toString().contains("String")){
                    field.set(object,value);
                }else 
                if (field.getGenericType().toString().contains("Date")){
                    field.set(object,fmt.parse(value));
                }
                field.setAccessible(false);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        /**
         * @param cell
         * @return String
         * 获取单元格中的值
         */
    
        private static String getXCellVal(Cell cell) {
            DateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
            DecimalFormat df = new DecimalFormat("0.0000");
            String val = "";
            switch (cell.getCellType()) {
                case XSSFCell.CELL_TYPE_NUMERIC:
                    if (DateUtil.isCellDateFormatted(cell)) {
                        val = fmt.format(cell.getDateCellValue()); //日期型
                    } else {
                        val = df.format(cell.getNumericCellValue()); //数字型
                        // 去掉多余的0,如最后一位是.则去掉
                        val = val.replaceAll("0+?$", "").replaceAll("[.]$","");
                    }
                    break;
                case XSSFCell.CELL_TYPE_STRING: //文本类型
                    val = cell.getStringCellValue();
                    break;
                case XSSFCell.CELL_TYPE_BOOLEAN: //布尔型
                    val = String.valueOf(cell.getBooleanCellValue());
                    break;
                case XSSFCell.CELL_TYPE_BLANK: //空白
                    val = cell.getStringCellValue();
                    break;
                case XSSFCell.CELL_TYPE_ERROR: //错误
                    val = "";
                    break;
                case XSSFCell.CELL_TYPE_FORMULA: //公式
                    try {
                        val = String.valueOf(cell.getStringCellValue());
                    } catch (IllegalStateException e) {
                        val = String.valueOf(cell.getNumericCellValue());
                    }
                    break;
                default:
                    val = cell.getRichStringCellValue() == null ? null : cell.getRichStringCellValue().toString();
            }
            return val;
        }
    

    3.以上是第一种导入的方法,第二种方法和第一种大致相同,只是返回的数据结构不同如下:

        /**  导入excel表格,返回的List<Map<Integer, String>>数据结构.
         * @param
         * @return 返回list集合
         * @throws Exception
         */
        public static List<Map<Integer, String>> read(MultipartFile file) {
            try{
                //最终返回数据
                List<Map<Integer, String>> list = new ArrayList<Map<Integer, String>>();
    
                Workbook workbook = null;
                InputStream is = file.getInputStream();
                String name = file.getOriginalFilename().toLowerCase();
                // 创建excel操作对象
                if (name.contains(".xlsx") || name.contains(".xls")) {
                   workbook = WorkbookFactory.create(is);
                } 
                //得到一个工作表
                Sheet sheet = workbook.getSheetAt(0);
                //获得数据的总行数
                int totalRowNum = sheet.getLastRowNum();
    
                //获得总列数
                int cellLength = sheet.getRow(0).getPhysicalNumberOfCells();
                Map<Integer, String> map = null;
                //获得所有数据
                //从第x行开始获取
                for(int x = 0 ; x <= totalRowNum ; x++){
                    map = new HashMap<Integer, String>();
                    //获得第i行对象
                    Row row = sheet.getRow(x);
                    //如果一行里的所有单元格都为空则不放进list里面
                    int a = 0;
                    for(int y=0;y<cellLength;y++){
                        if (!(row==null)) {
                            Cell cell = row.getCell(y);
                            if (cell == null) {
                                map.put(y, "");
                            } else {
                                map.put(y,   getXCellVal(cell));
                            }
                            if (map.get(y) == null || "".equals(map.get(y))) {
                                a++;
                            }
                        }
                    }//for
                    if(a!=cellLength && row!=null){
                        list.add(map);
                    }
                }
                return list;
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    

    4.测试用例直接上代码:

    controller

    @RequestMapping(value = "importExcel", method = RequestMethod.POST)
        @ApiOperation(value = "员工导入", notes = "员工导入")
        public Result employeeImport(@RequestParam("file") MultipartFile file) {
            try {
                employeeServer.employeeImport(file);
            } catch (ServiceException e) {
                e.printStackTrace();
                return Results.error(e.getCode(), e.getMessage(), null);
            }
            return  Results.success();
        }
    

    service

     @Override
        public void employeeImport(MultipartFile file) {
           List<EmployeeDO> employeeDOList =  ExcelUtils.readExcel(file, EmployeeDO.class);
           employeeBO.batchExcel(employeeDOList);
    
        }
    

    5.返回的数据结构如上代码,第一种方法readExcel的的好处是比第二种read方法少了实体转化,不需要进行转化,返回的结构本身就是一个数组DTO实体,直接可以使用进行校验等,然后进行对象值拷贝,批量入库即可.但是如果excel中数据入库存在多个实体则不适用


    6.read方法返回的则是一个数组Map结构,数据灵活,当excel表中导入入库多个实体,则可以转换这种结构,然后一一转化为对应入库的实体即可.


    7.两个方法均经过测试,可用,但是没有经过性能测试.

    展开全文
  • poi就是批量的操作文件或数据的导入以及导出。,poi导入excel表需要的jar
  • java_poi导入 excel

    2019-04-20 01:35:49
    NULL 博文链接:https://dengwenjun.iteye.com/blog/1903904
  • java运用poiexcel数据导入到oracle数据库中,上场内容未自己写的小demo,可下载查看,不清楚的可以联系我进行帮助。
  • poi apache-poi导入实例 导入excel 利用java的apache-poi读取每一行每一列,导入excel数据,两个for循环出来的[ ][ ] 承装数据
  • 这个是使用java语言 poi导入excel到数据库中,同时使用了xml对excel的每个单元格数据进行了非空验证。经测试,导入数据库成功。
  • poi版本3.17 这是一个针对于Excel进行操作的工具类,文档可生成 xsl与xlsx为后缀的Excel
  • Java使用poi实现excel导入导出,导入导出已做成通用方法,内附说明文档
  • poi导入excel数据思路

    千次阅读 2019-09-05 16:05:09
    1.实现思路 (1) 准备excel模板,减少... (2) 导入excel,返回错误Map,key是行数,value是对应的报错。 (3) 把错误列表生成excel,并返回url地址 (4) 前端通过返回的url地址,下载报错的excel 难点: 因没有...

    1.实现思路

               (1)  准备excel模板,减少用户非法输入,减少报错率。

               (2)  导入excel,返回错误Map,key是行数,value是对应的报错。

               (3)  把错误列表生成excel,并返回url地址

               (4) 前端通过返回的url地址,下载报错的excel

              难点: 因没有现成的集群文件存储环境,所以,机器返回下,返回url地址会有问题,会存在下载不到错误列表的问题。所以本博客,只是简单的返回成功和失败的条数,还有错误的map列表。

    2.代码篇

    2.1  后台代码

    pom.xml

    <!-- poi -->
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi</artifactId>
    			<version>3.8</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml</artifactId>
    			<version>3.8</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-scratchpad</artifactId>
    			<version>3.8</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.poi</groupId>
    			<artifactId>poi-ooxml-schemas</artifactId>
    			<version>3.8</version>
    		</dependency>

     

    package com.cloudtech.web.excel;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(value = {ElementType.FIELD,ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ExcelFiled {
    	/**
    	 * 列头名称
    	 * @return
    	 */
    	String colName() default "";
    	
    	/**
    	 * 数据精度,精确到后几位数
    	 * 默认0位
    	 * @return
    	 */
    	int precision() default 0;
    	
    	/**
    	 * 日期格式
    	 * 默认 “yyyy-MM-dd HH:mm:ss”
    	 * @return
    	 */
    	String dateFormat() default "";
    	
    	/**
    	 * 字段对应的列索引
    	 * @return
    	 */
    	int colIndex() default 0;
    	 /**
    	  * 忽略该字段  为true表示为选填字段,为false为必填字段,必须判断是否为非空
    	  * @return
    	  */
        boolean skip() default false;
    }
    
    package com.cloudtech.web.excel;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.Field;
    import java.math.BigDecimal;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.log4j.Logger;
    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.ss.usermodel.WorkbookFactory;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.springframework.web.multipart.MultipartFile;
    
    import com.cloudtech.web.util.ReflectUtil;
    
    public class ExcelPOIUtils {
    	final static String errormsg = "您好,第 [%s]行,第[%s]列%s,请重新输入!";
    	private static Logger logger = Logger.getLogger(ExcelPOIUtils.class);
    	private final static String xls = "xls";
    	private final static String xlsx = "xlsx";
    
    	static SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    
    	SimpleDateFormat createDateFormat(String pattern) {
    		return new SimpleDateFormat(pattern);
    	}
    
    	public static Workbook getWorkBook(MultipartFile file) throws Exception {
    		// 获得文件名
    		String fileName = file.getOriginalFilename();
    		// 创建Workbook工作薄对象,表示整个excel
    		Workbook workbook = null;
    		try {
    			// 获取excel文件的io流
    			InputStream is = file.getInputStream();
    			// 根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
    			if (fileName.endsWith(xls)) {
    				// 2003
    				workbook = new HSSFWorkbook(is);
    			} else if (fileName.endsWith(xlsx)) {
    				// 2007
    				workbook = new XSSFWorkbook(is);
    			}
    		} catch (IOException e) {
    			throw new Exception("解析报文出错!");
    		}
    		return workbook;
    	}
    
    	/**
    	 * 
    	 * @param file   文件
    	 * @param class1    实体类
    	 * @param errorMap  错误map   key 行号   value  具体报错信息
    	 * @param errors    错误列表
    	 * @param colCount  列数
    	 * @return
    	 * @throws Exception
    	 */
    	public static <T> List<T> readExc(MultipartFile file, Class<T> class1,Map<Integer, String> errorMap,List<T> errors,int colCount) throws Exception {
    		try {
    			Workbook workbook = getWorkBook(file);
    			return readExcel(class1, errorMap,errors, workbook,colCount);
    		} catch (Exception e) {
    			throw new Exception(e.getMessage());
    		}
    
    	}
    
    	public static <T> List<T> readExc(InputStream in, Class<T> class1,Map<Integer, String> errorMap,List<T> errors,int colCount) throws Exception {
    		try {
    			Workbook workbook = WorkbookFactory.create(in);
    			return readExcel(class1, errorMap,errors, workbook,colCount);
    		} catch (Exception e) {
    			e.printStackTrace();
    			throw new Exception(e.getMessage());
    		}
    	}
    
    	private static <T> List<T> readExcel(Class<T> class1, Map<Integer, String> errorMap,List<T> errors, Workbook workbook,int colCount)
    			throws Exception {
    		Sheet sheet = workbook.getSheetAt(0);
    		int rowCount = sheet.getPhysicalNumberOfRows(); // 获取总行数
    		if (rowCount == 1) { // 表格最小长度应为2
    			return null;
    		}
    		int coloumNum  =sheet.getRow(0).getPhysicalNumberOfCells();
    		if(coloumNum != colCount){
    			throw new Exception("excel格式跟模板格式不一致!");
    		}
    		
    		
    		List<T> list = new ArrayList<T>(rowCount - 1);
    		T obj;
    		// 遍历每一行
    		for (int r = 1; r < rowCount; r++) {
    			Row row = sheet.getRow(r);
    			obj = class1.newInstance();
    			Field[] fields = class1.getDeclaredFields();
    			Field field;
    			boolean flag = true;     //标识,确定该条数据是否通过第一轮判断
    			boolean errorFlag = false;  //标识是否有错误点
    			StringBuffer error = new StringBuffer();
    			for (int j = 0; j < fields.length; j++) {
    				field = fields[j];
    				ExcelFiled excelFiled = field.getAnnotation(ExcelFiled.class);
    				if(excelFiled == null){
    					continue;
    				}
    				Cell cell = row.getCell(excelFiled.colIndex());
    				try {
    					//序号为0,编号为空,则为无效行
    					if(excelFiled.colIndex() == 0 ){
    						if(cell == null || cell.toString().length() == 0){
    							flag  = false;  
    							break;
    						}
    					}
    					
    					if(!excelFiled.skip()){   //必填字段,需要判断是否非空
    						if (cell == null || cell.toString().length() == 0) {
    							//errogMsg(errorMap, r, j, excelFiled,"不能为空");
    							error.append(excelFiled.colName()+"不能为空"+"|");
    							flag = false;
    							errorFlag = true;
    							continue;
    						}
    					}
    					
    					if (field.getType().equals(Date.class)) {
    						if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), dateFormat.parse(cell.getStringCellValue()));
    						} else {
    							ReflectUtil.setValue(obj, field.getName(), new Date(cell.getDateCellValue().getTime()));
    						}
    					} else if (field.getType().equals(java.lang.Integer.class)) {
    						if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), (int) cell.getNumericCellValue());
    						} else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), Integer.parseInt(cell.getStringCellValue()));
    						}
    					} else if (field.getType().equals(java.math.BigDecimal.class)) {
    						if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), new BigDecimal(cell.getNumericCellValue()));
    						} else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), cell.getStringCellValue());
    						}
    					}else if (field.getType().equals(java.lang.Double.class)) {
    						if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    							if(excelFiled.precision() == 0){   //没有小数点
    								ReflectUtil.setValue(obj, field.getName(),Double.valueOf(new BigDecimal(cell.getNumericCellValue()).intValue()));
    							}else{
    								ReflectUtil.setValue(obj, field.getName(),new BigDecimal(cell.getNumericCellValue()).doubleValue());
    							}
    						} else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), new Double(cell.getStringCellValue()));
    						}
    					} else if (field.getType().equals(java.lang.String.class)) {
    						if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    							if(excelFiled.precision() == 0){   //没有小数点
    								ReflectUtil.setValue(obj, field.getName(),new BigDecimal(cell.getNumericCellValue()).intValue()+"");
    							}else{
    								ReflectUtil.setValue(obj, field.getName(),new BigDecimal(cell.getNumericCellValue()).doubleValue()+"");
    							}
    						} else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), cell.getStringCellValue());
    						}
    					}  else {
    						if (Cell.CELL_TYPE_NUMERIC == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), new BigDecimal(cell.getNumericCellValue()));
    						} else if (Cell.CELL_TYPE_STRING == cell.getCellType()) {
    							ReflectUtil.setValue(obj, field.getName(), cell.getStringCellValue());
    						}
    					}
    				} catch (Exception e) {
    					flag = false;
    					errorFlag = true;
    					error.append(excelFiled.colName()+"类型格式有误"+"|");
    				}
    			}
    			//录入行号
    			ReflectUtil.setValue(obj, "rowNum",(r+1));
    			if(flag){
    				list.add(obj);
    			}
    			if(errorFlag){
    				errorMap.put(r, error.toString());
    				errors.add(obj);
    			}
    		}
    		return list;
    	}
    
    
    }
    package com.cloudtech.web.excel;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    
    import com.cloudtech.web.vo.ImportStationInfoVo;
    
    public class Main {
    	public static void main(String[] args) {
    			try {
    				InputStream in = new FileInputStream(new File("D://stationInfo.xlsx"));
    				//错误列表
    				HashMap<Integer, String> errorMap = new HashMap<>();
    				List<ImportStationInfoVo> errors = new ArrayList<ImportStationInfoVo>();
    				List<ImportStationInfoVo> readExc = ExcelPOIUtils.readExc(in, ImportStationInfoVo.class,errorMap,errors,24);
    				//List<ExcelEntity> readExc = ExcelPOIUtils.readExc(in, ExcelEntity.class,errorMap,3);
    
    				System.out.println("数据----------------");
    				for (ImportStationInfoVo s : readExc) {
    					System.out.println(s.toString());
    				}
    				
    				System.out.println("错误maps----------------");
    				errorMap.forEach((k,v)-> System.out.println(v));
    				
    				System.out.println("错误列表----------------");
    				errors.forEach(k-> System.out.println(k.toString()));
    				
    				int success = readExc.size();
    				int error = errorMap.size();
    				System.out.println("总数"+(success+error)+",成功数:"+success+",失败数:"+errorMap.size());
    			}  catch (Exception e) {
    				e.printStackTrace();
    				System.out.println(e.getMessage());
    			}
    	}
    }
    
    package com.cloudtech.web.vo;
    
    import com.cloudtech.web.excel.ExcelFiled;
    
    /**
     * excel导入模板
     * 
     * @ClassName: ImportStationInfoVo
     * @Description:
     * @author wude
     * @date 2019年9月2日
     *
     */
    public class ImportStationInfoVo {
    	@ExcelFiled(colIndex=0,colName="有效行")
    	private String id;
    	@ExcelFiled(colIndex=1,colName="站点编号")
    	private String number;
    	@ExcelFiled(colIndex=2,colName="站点代码")
    	private String serialNo;
    	@ExcelFiled(colIndex=3,colName="站点名称")
    	private String name;
    	@ExcelFiled(colIndex=4,colName="维护公司")
    	private String operatorName;
    	@ExcelFiled(colIndex=5,colName="所在区域")
    	private String areaName;
    	@ExcelFiled(colIndex=6,colName="自动站类型")
    	private String sTypeName;
    	@ExcelFiled(colIndex=7,colName="海陆位置")
    	private String isLand;
    	@ExcelFiled(colIndex=8,colName="是否为秒级站")
    	private String isSecond;
    	@ExcelFiled(colIndex=9,colName="品牌类型",skip=true)
    	private String brandTypeName;
    	@ExcelFiled(colIndex=10,colName="联系人",skip=true)
    	private String linkman;
    	@ExcelFiled(colIndex=11,colName="联系座机",skip=true)
    	private String linkPhone;
    	@ExcelFiled(colIndex=12,colName="联系手机号",skip=true)
    	private String linkMobilePhone;
    	
    	
    	@ExcelFiled(colIndex=13,colName="具体地址",skip=true)
    	private String address;
    	@ExcelFiled(colIndex=14,colName="经度")
    	private Double longitde;
    	@ExcelFiled(colIndex=15,colName="纬度")
    	private Double latitude;
    	@ExcelFiled(colIndex=16,colName="海拔高度")
    	private Double altitude;
    	@ExcelFiled(colIndex=17,colName="安装位置",skip=true)
    	private String installSite;
    	@ExcelFiled(colIndex=18,colName="观测要素",skip=true)
    	private String observeElement;
    	
    	
    	@ExcelFiled(colIndex=19,colName="离地高度")
    	private Double terrainClearance;
    	@ExcelFiled(colIndex=20,colName="气压高度",skip=true)
    	private Double pressureHeight;
    	@ExcelFiled(colIndex=21,colName="供电来源",skip=true)
    	private String powerSupplyType;
    	@ExcelFiled(colIndex=22,colName="电池容量",skip=true)
    	private String batteryCapacity;
    	@ExcelFiled(colIndex=23,colName="占地面积",skip=true)
    	private String roomSize;
    	/** 行数 */
    	private Integer rowNum;
    	public String getNumber() {
    		return number;
    	}
    	public void setNumber(String number) {
    		this.number = number;
    	}
    	public String getSerialNo() {
    		return serialNo;
    	}
    	public void setSerialNo(String serialNo) {
    		this.serialNo = serialNo;
    	}
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getOperatorName() {
    		return operatorName;
    	}
    	public void setOperatorName(String operatorName) {
    		this.operatorName = operatorName;
    	}
    	public String getAreaName() {
    		return areaName;
    	}
    	public void setAreaName(String areaName) {
    		this.areaName = areaName;
    	}
    	public String getsTypeName() {
    		return sTypeName;
    	}
    	public void setsTypeName(String sTypeName) {
    		this.sTypeName = sTypeName;
    	}
    	public String getIsLand() {
    		return isLand;
    	}
    	public void setIsLand(String isLand) {
    		this.isLand = isLand;
    	}
    	public String getIsSecond() {
    		return isSecond;
    	}
    	public void setIsSecond(String isSecond) {
    		this.isSecond = isSecond;
    	}
    	public String getBrandTypeName() {
    		return brandTypeName;
    	}
    	public void setBrandTypeName(String brandTypeName) {
    		this.brandTypeName = brandTypeName;
    	}
    	public String getLinkman() {
    		return linkman;
    	}
    	public void setLinkman(String linkman) {
    		this.linkman = linkman;
    	}
    	public String getLinkPhone() {
    		return linkPhone;
    	}
    	public void setLinkPhone(String linkPhone) {
    		this.linkPhone = linkPhone;
    	}
    	public String getLinkMobilePhone() {
    		return linkMobilePhone;
    	}
    	public void setLinkMobilePhone(String linkMobilePhone) {
    		this.linkMobilePhone = linkMobilePhone;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	public Double getLongitde() {
    		return longitde;
    	}
    	public void setLongitde(Double longitde) {
    		this.longitde = longitde;
    	}
    	public Double getLatitude() {
    		return latitude;
    	}
    	public void setLatitude(Double latitude) {
    		this.latitude = latitude;
    	}
    	public Double getAltitude() {
    		return altitude;
    	}
    	public void setAltitude(Double altitude) {
    		this.altitude = altitude;
    	}
    	public String getInstallSite() {
    		return installSite;
    	}
    	public void setInstallSite(String installSite) {
    		this.installSite = installSite;
    	}
    	public String getObserveElement() {
    		return observeElement;
    	}
    	public void setObserveElement(String observeElement) {
    		this.observeElement = observeElement;
    	}
    	public Double getTerrainClearance() {
    		return terrainClearance;
    	}
    	public void setTerrainClearance(Double terrainClearance) {
    		this.terrainClearance = terrainClearance;
    	}
    	public Double getPressureHeight() {
    		return pressureHeight;
    	}
    	public void setPressureHeight(Double pressureHeight) {
    		this.pressureHeight = pressureHeight;
    	}
    	public String getPowerSupplyType() {
    		return powerSupplyType;
    	}
    	public void setPowerSupplyType(String powerSupplyType) {
    		this.powerSupplyType = powerSupplyType;
    	}
    	public String getBatteryCapacity() {
    		return batteryCapacity;
    	}
    	public void setBatteryCapacity(String batteryCapacity) {
    		this.batteryCapacity = batteryCapacity;
    	}
    	public String getRoomSize() {
    		return roomSize;
    	}
    	public void setRoomSize(String roomSize) {
    		this.roomSize = roomSize;
    	}
    	public Integer getRowNum() {
    		return rowNum;
    	}
    	public void setRowNum(Integer rowNum) {
    		this.rowNum = rowNum;
    	}
    	@Override
    	public String toString() {
    		return "ImportStationInfoVo [id=" + id + ", number=" + number + ", serialNo=" + serialNo + ", name=" + name
    				+ ", operatorName=" + operatorName + ", areaName=" + areaName + ", sTypeName=" + sTypeName + ", isLand="
    				+ isLand + ", isSecond=" + isSecond + ", brandTypeName=" + brandTypeName + ", linkman=" + linkman
    				+ ", linkPhone=" + linkPhone + ", linkMobilePhone=" + linkMobilePhone + ", address=" + address
    				+ ", longitde=" + longitde + ", latitude=" + latitude + ", altitude=" + altitude + ", installSite="
    				+ installSite + ", observeElement=" + observeElement + ", terrainClearance=" + terrainClearance
    				+ ", pressureHeight=" + pressureHeight + ", powerSupplyType=" + powerSupplyType + ", batteryCapacity="
    				+ batteryCapacity + ", roomSize=" + roomSize + ", rowNum=" + rowNum + "]";
    	}
    }
    

    反射类

    
    package com.cloudtech.web.util;
     
    import java.lang.reflect.Field;
    
    import com.cloudtech.web.entity.RuleCode;
     
    public class ReflectUtil {
     
        /**
         * 使用反射设置变量值
         *
         * @param target 被调用对象
         * @param fieldName 被调用对象的字段,一般是成员变量或静态变量,不可是常量!
         * @param value 值
         * @param <T> value类型,泛型
         */
        public static <T> void setValue(Object target,String fieldName,T value) {
            try {
                Class c = target.getClass();
                Field f = c.getDeclaredField(fieldName);
                f.setAccessible(true);
                f.set(target, value);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
     
        /**
         * 使用反射获取变量值
         *
         * @param target 被调用对象
         * @param fieldName 被调用对象的字段,一般是成员变量或静态变量,不可以是常量
         * @param <T> 返回类型,泛型
         * @return 值
         */
        public static <T> T getValue(Object target,String fieldName) {
            T value = null;
            try {
                Class c = target.getClass();
                Field f = c.getDeclaredField(fieldName);
                f.setAccessible(true);
                value = (T) f.get(target);
            } catch (NoSuchFieldException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            return value;
        }
        
        public static void main(String[] args) {
    		RuleCode code = new RuleCode();
    		code.setId(1234);
    		//Object value = ReflectUtil.getValue(code, "id");
    		System.out.println(code.getId());
        /*	String s ="avgSpd gt hThreeMaxSpd";
        	String replace = s.replace("gt", "");
        	String[] split = replace.split(" ");
        	System.out.println();*/
    	}
    }

     通过反射的方式获取值,在poi导出辅助类是调用反射类的方法,这样,导入导出的辅助类的就支持所有的实体类。

     

    controller类

     // 导入
        @RequestMapping(value = "importData")
        @ResponseBody
        public BaseDataResult importData(@RequestParam MultipartFile file) {
        	try {
        		//错误maps
        		Map<Integer, String> errorMap = new HashMap<>();
        		//错误列表
    			List<ImportStationInfoVo> errors = new ArrayList<ImportStationInfoVo>();
    			//站点数据列表
    			List<ImportStationInfoVo> stations = ExcelPOIUtils.readExc(file, ImportStationInfoVo.class,errorMap,errors,24);
    			HashMap<String, Object> maps = new HashMap<>();
    			maps.put("succ", stations);
    			maps.put("fail", errorMap);
    		    return new BaseDataResult(Constans.SUCCESS, "导入成功",maps);
    		} catch (Exception e) {
    			 return new BaseDataResult(Constans.FAILED, e.getMessage()); 
    		}
        }

    2.2前端代码layui

     <button id="importData" class="layui-btn">导入</button>
    <button class="layui-btn" onclick="downloadTemplate();">模板下载</button>

    导入layui相关依赖css和js 

    <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/assets/css/layui.css"/>
    <script src="${pageContext.request.contextPath}/assets/js/jquery-3.2.0.min.js"></script>
    <script src="${pageContext.request.contextPath}/assets/js/layui.js"></script>

    在script初始化如下代码,记得#importData是关键,跟导入按钮的id一样 

    layui.use([ "element", "laypage", "layer", "upload"], function() {
        var element = layui.element;
        var laypage = layui.laypage;
        var layer = layui.layer;
        var upload = layui.upload;//主要是这个
        layui.upload.render({
            elem: "#importData",//导入id
            url: "../station/importData",
            size: '3072',
            accept: "file",
            exts: 'xls|xlsx',
            done: function (result) {
                if (result.code == 1) {      //成功
                    $("#stationErro").html("");
                    var fail = result.data.fail;
                    var succ = result.data.succ;
                    
                    var failCount=0;
                    var failHtml="";  //失败的列表
                    for(var key in fail){
                    	failHtml+="<tr>"+
    							 	"<td colspan='3'>第"+(parseInt(key)+1)+"行,"+fail[key]+"</td>"+
    							  "</tr>";
                    	failCount++;
                    }
                    
                    var content="<tr>"+
    							 	"<td>"+(failCount+succ.length)+"</td>"+
    							 	"<td>"+succ.length+"</td>"+
    							 	"<td>"+failCount+"</td>"+
    							" </tr>";
                    if(failCount != 0){
                    	content+="<tr>"+
    							 	"<td colspan='3' style='color: red;'>导入失败原因如下:</td>"+
    							 "</tr>";
    					content+=failHtml;
                    }else{
                    	content+="<tr>"+
    						 		"<td colspan='3' style='color: green;'>您好,暂无错误信息!</td>"+
    							 "</tr>";
                    }
                    $(content).appendTo("#stationErro");
                    failTemplate();
                }else{     //失败
                	return layer.msg(result.error);
                }
            }
        });
    });

    效果图

    3注意

    下图是excel的模板,因保密问题,所以,只给一个效果图

    业务逻辑:

         1.判断有效行是否有值,没有值则认为该数据无效

         2、通过自定义的注解里面的skip,判断该字段是否不能为空,为false则认为一定要有值,不然会打印错误信息

        3.ImportStationInfoVo只是用来测试的一个实体类,行号和有效行这两个字段必须得有。实体类的类型也不是随便写的,根据实际的需求具体定义,假设站点编号在实体类中是int,表格录入的时候,输入字符串,工具会返回错误提示

       4.controller讲解   errorMap是错误列表  key是行号,value是具体的报错拼接起来的

                                   errors是错误的list

                                  stations是第一重简单的非空和类型判断

    5.  需要对stations列表进行各种判断,并返回成功的list和错误的集合map

    如果你热衷技术,喜欢交流,欢迎加入我们! 

     

    展开全文
  • 利用poi导入导出Excel xls,xlsx
  • //导入excel @RequestMapping(value = "/import", method=RequestMethod.POST) public JsonDto importExcel(@RequestParam(value="file",required = false) MultipartFile file, HttpServlet...

    1、Controller

    //导入excel
    	@RequestMapping(value = "/import", method=RequestMethod.POST)
    	public JsonDto importExcel(@RequestParam(value="file",required = false) MultipartFile file,
    							   HttpServletRequest request,
    							   HttpServletResponse response){
    		return  functionProjectRelationService.importExcelFile(file);
    	}
    

    2、Service

    public JsonDto importExcelFile(MultipartFile file) {
    		JsonDto jsonDto = new JsonDto();
    		try{
    			int successNum = 0;
    			int failureNum = 0;
    			ImportExcel ei = new ImportExcel(file, 0, 0);
    			List<User> list = ei.getDataList(User.class);
    			logger.info("导入" + list.size() + "条数据");
    			jsonDto.setSuccess(Boolean.TRUE);
    			jsonDto.setErrcode("200");
    			jsonDto.setErrmsg("上传成功");
    			jsonDto.setData(list);
    		}catch(Exception e){
    			e.printStackTrace();
    			jsonDto.setSuccess(Boolean.TRUE);
    			jsonDto.setErrcode("-1");
    			jsonDto.setErrmsg("上传异常"+e.getMessage());
    			jsonDto.setData(new JSONObject());
    			return jsonDto;
    		}
    		return  jsonDto;
    	}
    

    3、User.java

    package com.elink.estos.common.utils.excel;
    
    import com.elink.estos.common.utils.excel.annotation.ExcelField;
    
    /**
     * @Auther: yinzuomei
     * @Date: 2019/9/3 13:51
     * @Description:
     */
    public class User {
        private String name;
        private String sex;
        private String age;
        private String address;
        @ExcelField(title="姓名", align=1,sort = 1)
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
        @ExcelField(title="性别", align=1,sort = 2)
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
        @ExcelField(title="年龄", align=1,sort = 3)
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
        @ExcelField(title="地址", align=1,sort = 4)
        public String getAddress() {
            return address;
        }
    
        public void setAddress(String address) {
            this.address = address;
        }
    }
    
    

    4、工具类修改
    在这里插入图片描述

    展开全文
  • 主要给大家介绍了关于在java poi导入Excel通用工具类的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧。
  • Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2019,而Excel中输入的是 2019/10/12 或 2019-10-12poi处理excel时,当excel没有明确指明是哪个类型的数据时,poi很可能处理单元格的日期数据时就...
    Java 读取Excel表格日期类型数据的时候,读出来的是这样的 12-十月-2019,而Excel中输入的是 2019/10/12 或 2019-10-12poi处理excel时,当excel没有明确指明是哪个类型的数据时,poi很可能处理单元格的日期数据时就有可能是一串数字,而使用java程序基本无法转换。

    为了解决以上的问题,本人收集了各种资料,目前来总结一下,供碰到此类问题的你作参考。

    直接复制使用

    private String getCellValue(Cell cell) {
            Object result = "";
            if (cell != null) {
                switch (cell.getCellType()) {
                    case STRING:
                        result = cell.getStringCellValue();
                        break;
                    case NUMERIC:
                        if (DateUtil.isCellDateFormatted(cell)){
                            java.util.Date date = cell.getDateCellValue();
                            //格式转换
                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                            result = sdf.format(date);
                        }else {
                            System.out.println(cell.getNumericCellValue());
                        }
                        break;
                    case BOOLEAN:
                        result = cell.getBooleanCellValue();
                        break;
                    case FORMULA:
                        result = cell.getCellFormula();
                        break;
                    case ERROR:
                        result = cell.getErrorCellValue();
                        break;
                    case BLANK:
                        break;
                    default:
                        break;
                }
            }
            return result.toString();
        }
    
    展开全文
  • java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据量导入内存溢出问题,并提升效率
  • poi导入excel数据到数据库

    千次阅读 2019-06-20 20:34:05
    导入poi依赖 <properties> <poi.version>3.17</poi.version> </properties> <!-- POI --> <dependency> <groupId>org.apache.poi</gr...
  • 1、需要的maven依赖 <!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>p...
  • Java使用poi导入Excel文件

    千次阅读 2018-08-28 16:49:38
    前面说到下载模板后,对数据需要导入。 工具类 ImportExcelUtils :excel模板工具类 ...导入需要maven引入的jar包(这里用的是poi) &amp;amp;amp;amp;lt;!-- https://mvnrepository.com/ar...
  • 废话不多说, 直接上代码. ...poi.version&amp;amp;gt;3.14&amp;amp;lt;/poi.version&amp;amp;gt; &amp;amp;lt;/properties&amp;amp;gt; &amp;amp;lt;dependency&amp;amp;gt;
  • 1.上篇博文主要介绍了使用JXL,POI技术将数据库表数据导出为Excel; 2.本篇主要介绍导入功能的实现; 3.还是以POI技术为主,JXL这里只做代码展示,若有兴趣可以私下研究 4.使用JXL从Excel表格中读取数据代码示例: ...
  • POI导入excel,包括前端js代码

    千次阅读 2018-02-05 15:46:31
    已实现导入excel,包括前端js,ajax代码 js代码、 window.uploadRegisterTableRest = function () { //获取文件输入框对象 var fileInput = $('#getFile_registerTable');

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 18,843
精华内容 7,537
关键字:

poi导入excel