精华内容
下载资源
问答
  • java 读取excel数据 poi导入excel 数据 java实现导入excel数据 一、说明 1、在实际开发中,可能有需求需要将excel导入到业务系统中,具体实现可以使用Apache poi 来实现。 2、依赖pom如下: <dependency>...

                 java 读取excel数据 poi导入excel 数据 java实现导入excel数据

    一、说明

    1、在实际开发中,可能有需求需要将excel导入到业务系统中,具体实现可以使用Apache poi 来实现。

    2、依赖pom如下:

         <dependency>
    	    <groupId>org.apache.poi</groupId>
    	    <artifactId>poi</artifactId>
    	    <version>3.15</version>
    	</dependency>
        
    	<dependency>
    	    <groupId>org.apache.poi</groupId>
    	    <artifactId>poi-ooxml</artifactId>
    	    <version>3.15</version>
    	</dependency>

    二、代码实现

    1、创建ExcelImport 类,实现excel数据导入

    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    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.xssf.usermodel.XSSFCell;
    import org.apache.poi.xssf.usermodel.XSSFRow;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.springframework.web.multipart.MultipartFile;
    
    /**
     * description: Excel 数据导入
     * @version v1.0
     * @author w
     * @date 2020年3月30日下午9:46:27
     **/
    public class ExcelImport {
    
    	private ExcelImport INSTANSE = new ExcelImport();
    	
    	/**
    	 * excel 2003 suffix
    	 */
    	private static final String EXCEL_XLS_SUFFIX = ".xls" ; 
    	
    	/**
    	 * excel 2007 或以上 suffix
    	 */
    	private static final String EXCEL_XLSX_SUFFIX = ".xlsx";
    	
    	/**
    	 * 分隔符 "."
    	 */
    	public static final String POINT = ".";  
    	
    	/**
    	 * description: 读取excel数据 
    	 * @param file
    	 * @return List<List<Object>>
    	 * @version v1.0
    	 * @author w
    	 * @date 2020年3月31日 下午3:36:39
    	 */
    	public static List<List<Object>> importFile (File file) throws Exception{
    		if(file == null) {
    			return null ;
    		}
    		if(file.getName().endsWith(EXCEL_XLS_SUFFIX)) {
    			return readXls(new FileInputStream(file));
    		}
    		if(file.getName().endsWith(EXCEL_XLSX_SUFFIX)) {
    			return readXlsx(new FileInputStream(file));
    		}
    		throw new RuntimeException("文件不对,必须是excel文件,后缀名以:"+EXCEL_XLS_SUFFIX + " 或者 "+ EXCEL_XLSX_SUFFIX);
    	}
    	
    	/**
    	 * description: 导入excel --- 支持web
    	 * @param fileName
    	 * @param inputStream
    	 * @throws Exception
    	 * @return List<List<Object>>
    	 * @version v1.0
    	 * @author w
    	 * @date 2020年3月31日 下午4:51:01
    	 */
    	public static List<List<Object>> importFile (MultipartFile multipartFile) throws Exception{
    		if(multipartFile == null) {
    			return null ;
    		}
    		if(multipartFile.getOriginalFilename().endsWith(EXCEL_XLS_SUFFIX)) {
    			return readXls(multipartFile.getInputStream());
    		}
    		if(multipartFile.getOriginalFilename().endsWith(EXCEL_XLSX_SUFFIX)) {
    			return readXlsx(multipartFile.getInputStream());
    		}
    		throw new RuntimeException("文件不对,必须是excel文件,后缀名以:"+EXCEL_XLS_SUFFIX + " 或者 "+ EXCEL_XLSX_SUFFIX);
    	}
    	
    	
    	/**
    	 * description: 读取03版excel
    	 * @param file
    	 * @return List<List<Object>>
    	 * @version v1.0
    	 * @author w
    	 * @date 2020年3月31日 下午3:38:44
    	 */
    	private static List<List<Object>> readXls(InputStream inputStream) throws Exception {
    		List<List<Object>> list = new ArrayList<>();
    		// 读取excel 
    		HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
    		// 获取sheet 页数量
    		int sheets = workbook.getNumberOfSheets();
    		for(int num = 0 ; num < sheets ; num++ ) {
    			HSSFSheet sheet = workbook.getSheetAt(num);
    			if(null == sheet) {
    				continue ;
    			}
    			// sheet 页的总行数
    			int rows = sheet.getLastRowNum();
    			// startRow 开始读取的行数 --- 第二行开始读
    			for( int startRow = 1 ;startRow <= rows  ; startRow ++) {
    				HSSFRow row = sheet.getRow(startRow);
    				List<Object> rowList = new ArrayList<>();
    				if(null != row) {
    					// row 行中的 单元格总个数
    					short cells = row.getLastCellNum();
    					for(int x = 0 ; x <= cells ; x++) {
    						HSSFCell cell = row.getCell(x);
    						if(null == cell) {
    							rowList.add("");
    						}else {
    							rowList.add(getXlsValue(cell));
    						}
    					}
    					list.add(rowList);
    				}
    			}
    		}
    		return list;
    	}
    	
    	/**
    	 * description: 获取 03 版 excel数据 
    	 * @param cell
    	 * @return String
    	 * @version v1.0
    	 * @author w
    	 * @date 2020年3月31日 下午3:54:14
    	 */
    	private static String getXlsValue(HSSFCell cell) {
    		if ( cell.getCellType() == cell.CELL_TYPE_BOOLEAN) {  
                return String.valueOf(cell.getBooleanCellValue());  
            } else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {  
                String cellValue = "";  
                if(HSSFDateUtil.isCellDateFormatted(cell)){                  
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());  
                    cellValue = new SimpleDateFormat("yyyy/MM/dd").format(date);  
                }else{  
                    DecimalFormat df = new DecimalFormat("#.##");  
                    cellValue = df.format(cell.getNumericCellValue());  
                    String strArr = cellValue.substring(cellValue.lastIndexOf(POINT)+1,cellValue.length());  
                    if(strArr.equals("00")){  
                        cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));  
                    }    
                }  
                return cellValue;  
            } else {  
    	       	// 其他类型的值,统一设置为 string 
    	       	// http://blog.csdn.net/ysughw/article/details/9288307 
            	cell.setCellType(Cell.CELL_TYPE_STRING);
               return String.valueOf(cell.getStringCellValue());  
            }  
    	}
    
    	/**
    	 * description: 读取07或以上版本的 excel 
    	 * @param file
    	 * @throws Exception
    	 * @return List<List<Object>>
    	 * @version v1.0
    	 * @author w
    	 * @date 2020年3月31日 下午4:01:25
    	 */
    	private static List<List<Object>> readXlsx(InputStream inputStream) throws Exception {
    		List<List<Object>> list = new ArrayList<>();
    		// 读取excel ,封装到 XSSFWorkbook 对象 
    		XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
    		int sheets = workbook.getNumberOfSheets();
    		for(int num = 0 ;num < sheets ; num++) {
    			XSSFSheet sheet = workbook.getSheetAt(num);
    			if(null == sheet) {
    				continue ;
    			}
    			// 获取sheet页的总行数
    			int rows = sheet.getLastRowNum();
    			for(int startRow = 1 ; startRow <= rows ; startRow++ ) {
    				// startRow 开始读取的行数, 从第二行开始读取
    				XSSFRow row = sheet.getRow(startRow);
    				List<Object> rowList = new ArrayList<>();
    				if(null != row) {
    					// 获取行总单元格个数
    					short cells = row.getLastCellNum();
    					for(int x = 0 ; x < cells ; x++) {
    						XSSFCell cell = row.getCell(x);
    						if(cell == null) {
    							rowList.add("");
    						}else {
    							rowList.add(getXlsxValue(cell));
    						}
    					}
    					list.add(rowList);
    				}
    			}
    		}
    		return list;
    	}
    
    	/**
    	 * description: 获取07或以上版本 excel 数据
    	 * @param cell
    	 * @return Object
    	 * @version v1.0
    	 * @author w
    	 * @date 2020年3月31日 下午4:09:03
    	 */
    	private static Object getXlsxValue(XSSFCell cell) {
    		if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
    			return String.valueOf(cell.getBooleanCellValue());
    		} else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
    			String cellValue = "";
    			if (DateUtil.isCellDateFormatted(cell)) {
    				Date date = DateUtil.getJavaDate(cell.getNumericCellValue());
    				cellValue = new SimpleDateFormat("yyyy/MM/dd").format(date);
    			} else {
    				DecimalFormat df = new DecimalFormat("#.##");
    				cellValue = df.format(cell.getNumericCellValue());
    				String strArr = cellValue.substring(cellValue.lastIndexOf(POINT) + 1, cellValue.length());
    				if (strArr.equals("00")) {
    					cellValue = cellValue.substring(0, cellValue.lastIndexOf(POINT));
    				}
    			}
    			return cellValue;
    		} else {
    			// 其他类型的值,统一设置为 string 
            	// http://blog.csdn.net/ysughw/article/details/9288307 
    			//cell.setCellType(Cell.CELL_TYPE_STRING);
    			return String.valueOf(cell.getStringCellValue());
    		}
    	}
    }

    2、测试,直接本地测试 :

    @Test
    public void test() {
        String path = "F:\\poi导出2.xlsx" ;
        File file = new File(path);
        try {
            List<List<Object>> importFile = ExcelImport.importFile(file);
            System.out.println(importFile);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

     

    3、查看控制中输出的数据和excel中的是否一致。

     

    三、总结

    1、本示例使用的是 poi 3.15版的,其他版本可能需要做部分调整。

    2、对于导入excel数据类型转换,不一定考虑到全部,请根据实际业务情况调整。

    3、web情况下导入,请自行创建页面测试,ExcelImport 类中已经提供对应的方法支持。

    4、需要源码请私聊我,谢谢。

     

     

    展开全文
  • Java导入Excel数据

    万次阅读 2018-09-10 11:27:48
    例如导入excel所在目录为D:/cs/test.xls,测试数据如下图所示: 1.创建与excel表头对应的xml模版 &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;!-- 导入的模版校验...

    例如导入的excel所在目录为D:/cs/test.xls,测试数据如下图所示:

    1.创建与excel表头对应的xml模版

    <?xml version="1.0" encoding="UTF-8"?>
    <!-- 导入的模版校验文件 -->
    <execelImport>
    	<field>姓名</field>
    	<field>性别</field>
    	<field>手机号</field>
    	<field>邮箱</field>
    	<field>住址</field>
    </execelImport>

    2.创建导入数据对应实体类

    public class Persion {
    
    	private String name;
    	private String sex;
    	private String phone;
    	private String email;
    	private String address;
    	
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	public String getSex() {
    		return sex;
    	}
    	public void setSex(String sex) {
    		this.sex = sex;
    	}
    	public String getPhone() {
    		return phone;
    	}
    	public void setPhone(String phone) {
    		this.phone = phone;
    	}
    	public String getEmail() {
    		return email;
    	}
    	public void setEmail(String email) {
    		this.email = email;
    	}
    	public String getAddress() {
    		return address;
    	}
    	public void setAddress(String address) {
    		this.address = address;
    	}
    	
    	public void setValues(String[] values) throws Exception{
    		this.name = values[0] ==null?"":values[0].trim();
    		this.sex = values[1] ==null?"":values[1].trim();
    		this.phone = values[2] ==null?"":values[2].trim();
    		this.email = values[3] ==null?"":values[3].trim();
    		this.address = values[4] ==null?"":values[4].trim();
    	}
    	
    }
    

    3.创建导入数据工具类

    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.net.URLDecoder;
    import java.text.DateFormat;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.Iterator;
    import java.util.List;
    import java.util.Set;
    
    import javax.validation.ConstraintViolation;
    import javax.validation.Validation;
    import javax.validation.Validator;
    import javax.validation.ValidatorFactory;
    
    import org.apache.log4j.Logger;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.hssf.util.CellReference;
    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;
    import org.dom4j.Document;
    import org.dom4j.DocumentException;
    import org.dom4j.Element;
    import org.dom4j.io.SAXReader;
    import org.springframework.expression.EvaluationException;
    import org.springframework.expression.Expression;
    import org.springframework.expression.ExpressionParser;
    import org.springframework.expression.spel.standard.SpelExpressionParser;
    
    /**
     * @Desc 对execel文件的校验并且解析
     */
    @SuppressWarnings("rawtypes")
    public class ExecelUtil {
    	Logger logger = Logger.getLogger(this.getClass());
    
    	private String description = "";// 如果校验失败,将会给出详细提示信息
    	private Sheet sheet;// execel 对象
        private List<String> fieldList;//从xml读取到的execel表格信息
        private int rowIndex = 0;//当前操作行
        private Object objectBean;//每一行数据封装 
        private Cell cellStart;// 数据的开始单元格
        private Class clazz; //需要封装的类
        private Validator validator; //hibernate 的校验器
        private String[] fieldVals ; //从execel读到的某一行的数据
        private int fieldSize = 0;  //有效数据的列数
        private DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); // 针对日期的默认转换形式
        private Expression exp ;//EL 解析器
        private ExpressionParser parser;
        
        private DecimalFormat df = new DecimalFormat("#");
        
    	public String getDescription() {
    		return description;
    	}
    
    	public Object getObjectBean() {
    		return objectBean;
    	}
    	/**
    	 * 
    	 * @param execelFilename
    	 *            execel文件名
    	 * @param xmlFilename
    	 *            execel文件所对应的校验文件
    	 * @param calzz 需要封装的类
    	 */
    	public ExecelUtil(InputStream execelIS,String xmlFilename,Class clazz,String suffix) throws ValidationExeception{
    		// 打开execel工作簿		
    		 Workbook wb = null;
    		try {
    			if(suffix.equals(".xls")){
    				wb = new HSSFWorkbook(execelIS);
    			}else if(suffix.equals(".xlsx")){
    				wb = new XSSFWorkbook(execelIS);
    			}
    			execelIS.close();
    		} catch (IOException e) {
    			logger.error(e);
    			throw new ValidationExeception("","加载文件失败,请确保是否是Execel表格");
    		}		
    		sheet = wb.getSheetAt(0);// 默认取第一个工作簿
    		//读配置文件,获取所有的属性列描述
            fieldList = this.readFieldsFromXML(getAbsolutePath(xmlFilename));
            //个数
            fieldSize = fieldList.size();
            
    		//找到有效数据的开始单元格
    		cellStart = this.findStartCell();
    		if(cellStart == null){			
    			throw new ValidationExeception("",this.description);
    		}
    		
    		//每次读取一行execel数据,rowIndex每次增1
    		rowIndex = cellStart.getRowIndex()+1;
    		
    		//需要封装的对象类
    		this.clazz = clazz;
    		//初始化校验器
    		ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
    		validator = factory.getValidator();
    		//初始化EL解析器
    		parser = new SpelExpressionParser();
    		exp = parser.parseExpression("values");
    	}
    	
    	//是否还有数据
        public boolean hasNext(){
        	Row row = sheet.getRow(rowIndex++);
        	if(row == null)
        		return false;
        	fieldVals = this.getRowValues(row, cellStart.getColumnIndex());
            if(Arrays.asList(fieldVals).indexOf("") != -1){
            	for(String s :fieldVals)//如果每个字段都是空的,则返回false 否则true
            		if(!s.equals(""))
            			return true;
            	return false;
            }
        	return true;
        }
        //校验
        public boolean validate(){
            try {        
            	objectBean = Class.forName(clazz.getName()).newInstance();
    		} catch (Exception e) {
    			logger.error(e);
    		}
    		
    		try{	
    		    exp.setValue(objectBean, fieldVals);// 给objectBean的属性赋值
    		    
    		}catch(EvaluationException e){//由于所有的数据类型转换都有objectBean里面来处理,故可能有异常,需要进行相应的处理
    			System.out.println(e);
    			List exList = Arrays.asList("ParseException","NumberFormatException");//一般可能发生的异常
    			Throwable t = e.getCause();
    			while(t!=null){
    				String causeClazz = t.getClass().getSimpleName();
    				if(exList.contains(causeClazz)){
                           this.description = "第" +rowIndex+"行,类型转换失败:"+t.getMessage();
                           return false;
    				}else if(causeClazz.equals("ValidationExeception")){//自定义异常
    					this.description = "第" +rowIndex+"行,"+t.getMessage();
    					return false;
    				}else
    					t = t.getCause();
    			}			 
    			//this.description = parser.parseExpression("sales").getValue(objectBean,String.class);
    			this.description = "数据错误";
    			return false;
    		}
    		//校验,校验规则是配置在objectBean对象里面
    		Set<ConstraintViolation<Object>> constraintViolations = validator.validate(objectBean);
    		
    		if(constraintViolations.size() >0){//校验失败时,提示相应信息
    			this.description = "第" +rowIndex+"行,校验出错:";
    			for (ConstraintViolation<Object> vl : constraintViolations) {
    				this.description = this.description + vl.getMessage()+" ;  ";
    			}				
    			return false;
    		}
    		return true;
        }
        
        private String[] getRowValues(Row row,int columnStartIndex){
            String[] values = new String[fieldSize];
        	for(int j = columnStartIndex,t=0;t<fieldSize;j++,t++){
        		Cell c = row.getCell(j);
        		if(c==null){
        			values[t] = "";
        			continue;
        		}
        		switch(c.getCellType()){
        		case Cell.CELL_TYPE_BLANK:
        			values[t] = "";
        			break;
        		case Cell.CELL_TYPE_BOOLEAN:
        			values[t] = String.valueOf(c.getBooleanCellValue());
        			break;
        		case Cell.CELL_TYPE_NUMERIC:
        			
    				if (HSSFDateUtil.isCellDateFormatted(c)) {
    					values[t] = format.format(c.getDateCellValue());
    				} else if(c.getCellStyle().getDataFormat() == 58) {
    					// 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)  
    	                SimpleDateFormat sdf = new SimpleDateFormat("MM/dd");  
    	                double value = c.getNumericCellValue();  
    	                Date date = org.apache.poi.ss.usermodel.DateUtil  
    	                        .getJavaDate(value);  
    	                
    	                values[t] = sdf.format(date); 
    				}
    				else {
    					values[t] = new DecimalFormat("#").format(c.getNumericCellValue()); 
    				}
        			break;
        		case Cell.CELL_TYPE_STRING:
        			values[t] = String.valueOf(c.getStringCellValue());
        			break;
        		
        		default:
        			values[t] = "";
        			break;
        		}
        	}
        	return values;
        }
    	// 根据某一个单元格,得到更人性化的显示,例如“A4”
    	private String getCellRef(Cell cell) {
    		return CellReference.convertNumToColString(cell.getColumnIndex()) + (cell.getRowIndex() + 1);
    	}
    	private  String getAbsolutePath(String file) throws ValidationExeception {
    		try {
    			file = this.getClass().getClassLoader().getResource(file).getFile();
    
    		} catch (NullPointerException e) {
    			throw new ValidationExeception(file, "文件不存在");
    		}
    		try {
    			// 解决当出现中文路径时不能解析的bug
    			file = URLDecoder.decode(file, "UTF-8");
    		} catch (UnsupportedEncodingException e) {
    			throw new ValidationExeception(file, "解码失败");
    		}
    		return file;
    	}
    	private List<String> readFieldsFromXML(String xmlFilename)throws ValidationExeception{
    		SAXReader reader = new SAXReader();
    		Document document = null;
    		
    		try {
    			document = reader.read(new File(xmlFilename));// 加载配置文件
    		} catch (DocumentException e) {
    			e.printStackTrace();
    			this.description = "IO 异常,读取配置文件失败";
    			throw new ValidationExeception(xmlFilename,"IO 异常,读取配置文件失败");
    		}
    		
    		Element root = document.getRootElement();
    		List<String> fields = new ArrayList<String>();
    		for (Iterator iter = root.elementIterator("field"); iter.hasNext();) {
    			Element field = (Element) iter.next();
                fields.add(field.getTextTrim());
    		}
    		
    		return fields;
    	}
    	/**
    	 * 从execel表中找到数据开始的单元格
    	 * @return
    	 */
    	private  Cell findStartCell(){
    		String firstFieldDesc = this.fieldList.get(0);
    		int endRow = sheet.getLastRowNum()>100?100:sheet.getLastRowNum();
    		for(int i = 0;i<=endRow;i++){
    			Row r = sheet.getRow(i);
    			if (r == null)
    				continue;
    			for(int j = 0;j < r.getLastCellNum();j++){
    				Cell c = r.getCell(j);
    				if( c == null)
    					continue;
    				if(c.getCellType() == Cell.CELL_TYPE_STRING){
    					if(c.getStringCellValue().trim().equals(firstFieldDesc)){//找到第一个符合要求的字段,接下来判断它相邻的字段是否都符合要求
                            if(fieldList.size()>r.getLastCellNum()-j){
                            	this.description = "execel表格与所给配置描述不符,请下载模板文件";
                            	return null;
                            }
    						for(int k=j+1,t=1;k<=j+fieldList.size()-1;k++,t++){
    							Cell c2 = r.getCell(k);
    							if(c2 == null){
    								this.description = "请确保单元格"+this.getCellRef(c2)+"内容是\""+fieldList.get(t)+"\"";
    								return null;
    							}
    							if(c2.getCellType() == Cell.CELL_TYPE_STRING){
    								if(c2.getStringCellValue().contains(fieldList.get(t)))
    									continue;
    								else{
    										this.description = "请确保单元格"+this.getCellRef(c2)+"内容是\""+fieldList.get(t)+"\"";
    										return null;	
    								}
    							}
    							 
    						}
    						return c;
    					}else
    						continue;
    				}else
    					continue;
    			}
    		}
    		this.description = "找不到\""+fieldList.get(0)+"\"这一列";
    		return null;
    	}
    
    	public int getRowIndex() {
    		return rowIndex;
    	}
    
    	public DateFormat getFormat() {
    		return format;
    	}
    
    	
    	public String createExcelIncludeFailReason(InputStream execelIS,String path,String newExcelName, HashMap<Integer,String> errHash) {
    		FileOutputStream file;
    		try {
    			file = new FileOutputStream(path+"/"+newExcelName);
    			Workbook workbook=this.getWorkbook(execelIS);
    			Sheet s=workbook.getSheetAt(0);			
    		    
    		    //int endRow = sheet.getLastRowNum()>100?100:sheet.getLastRowNum();
    			int endRow = sheet.getLastRowNum();
    		    for(int i=1;i<=endRow;i++){		    	
    		    	if(errHash.get(i)!=null){
    		    		Row rowkk = s.getRow(i);	    			
    			    	Cell error_cell = rowkk.createCell(fieldList.size());
    			    	error_cell.setCellValue(errHash.get(i));
    		    	}		    	
    		    }
    		    workbook.write(file);
    			file.close();
    		} catch (FileNotFoundException e) {
    			
    			e.printStackTrace();
    		} catch (IOException e) {
    			
    			e.printStackTrace();
    		} catch (ValidationExeception e) {
    			
    			e.printStackTrace();
    		}
    
    		return newExcelName;
    	}
    	
    
    	public String getFile(InputStream execelIS,String path,String appPath, List<Integer> listF, boolean b) {
    		FileOutputStream file;
    		try {
    			file = new FileOutputStream(path+"/"+appPath);
    			Workbook workbook=this.getWorkbook(execelIS);
    			Sheet s=workbook.getSheetAt(0);			
    		    Row row=null;
    		   //int endRow = sheet.getLastRowNum()>100?100:sheet.getLastRowNum();
    		    int endRow = sheet.getLastRowNum();
    		    for(int i=1;i<=endRow;i++){
    		    	
    		    	Row rowkk = s.getRow(i);	    			
    		    	Cell info_cell = rowkk.createCell(fieldList.size());
    		    	info_cell.setCellValue("sss");
    		    	
    		    	//删除错误行
    		    	if(b&& listF.contains(i)){
    		    		row=s.getRow(i);		    		
    		    		//System.out.println("错误行删除"+i);
    		    		if(row!=null)s.removeRow(row);
    		    	}
    		    	//删除正确行
    		    	if(!b && !listF.contains(i)){
    		    		row=s.getRow(i);
    		    		//System.out.println("正确行删除"+i);
    		    		if(row!=null)s.removeRow(row);
    		    	}
    		    }
    		    workbook.write(file);
    			file.close();
    		} catch (FileNotFoundException e) {
    			
    			e.printStackTrace();
    		} catch (IOException e) {
    			
    			e.printStackTrace();
    		} catch (ValidationExeception e) {
    			
    			e.printStackTrace();
    		}
    
    		return appPath;
    	}
    	public  Workbook  getWorkbook(InputStream execelIS) throws ValidationExeception{
    		Workbook wb = null;
    		try {
    			wb = new HSSFWorkbook(execelIS);
    		} catch (IOException e) {
    			logger.error(e);
    			throw new ValidationExeception("","加载文件失败,请确保是否是Execel表格");
    		}
    		return wb;
    	}
    	 
    }

    4.测试取出数据

    public class Test {
    
    	public static void main(String[] args) throws Exception {
    		InputStream is = new FileInputStream("D:/cs/test.xls");
    		ExecelUtil eu = new ExecelUtil(is, "excel/import_test.xml", Persion.class,".xls");
    		Persion cp = null;
    		while (eu.hasNext()) {
    			if (eu.validate()) {
    				cp = (Persion) eu.getObjectBean();				
    				System.out.println(cp.getName()+"/"+cp.getSex()+"/"+cp.getPhone()+"/"+cp.getEmail()+"/"+cp.getAddress());
    			}
    		}
    	}
    }

     

    展开全文
  • Java导入Excel数据方法

    千次阅读 2017-09-16 19:45:28
    今天早上朋友让我帮她算一个数学建模中的数据,因为我...Apache POI导入excel数据,需要实现导入的包。 Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能

    今天早上朋友让我帮她算一个数学建模中的数据,因为我不会用matlab,所以使用Java来解决这个问题。《Thinking in java》还没有看到后面I/O系统,所以借鉴了一下其他博主的内容。

    Apache POI

    导入excel数据,需要实现导入的包。
    Apache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。
    下面是所需的包内容:

    这里写图片描述

    读取excel文件

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    
    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;
    
    public class getData {
        @SuppressWarnings("deprecation")
        public static void getDataFromExcel(String filePath) {
            FileInputStream fis = null;
            Workbook wookbook = null;
            try {
                fis = new FileInputStream(filePath);
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                // 2003版本的excel,用.xls结尾
                wookbook = new HSSFWorkbook(fis);// 得到工作簿
            } catch (Exception ex) {
                try {
                    // 这里需要重新获取流对象,因为前面的异常导致了流的关闭
                    fis = new FileInputStream(filePath);
                    // 2007版本的excel,用.xlsx结尾
                    wookbook = new XSSFWorkbook(filePath);// 得到工作簿
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            Sheet sheet = wookbook.getSheetAt(0);// 得到一个工作表
            int totalRowNum = sheet.getLastRowNum();// 获得数据的总行数
            double Lat ;//纬度
            double Lng ;//经度
    
            // 获得所有数据
            for (int i = 1; i <= totalRowNum; i++) {
                // 获得第i行对象
                Row row = sheet.getRow(i);
                // 获得纬度
                Cell cell = row.getCell(0);
                Lat = cell.getNumericCellValue();
                // 获得经度
                cell = row.getCell(1);
                Lng =  cell.getNumericCellValue();
                System.out.println("经度:" + Lng + ",纬度:" + Lat);
            }
        }
        public static void main(String[] args) {
            getDataFromExcel("E://2.xlsx");
        }
    }

    以下是源数据:
    这里写图片描述

    Output:
    这里写图片描述

    展开全文
  • 今天小编就为大家分享一篇解决Java导入excel大量数据出现内存溢出的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • java导入Excel的同时导入excle里面的图片,提供测试demo,使用工具类-XSSFWorkbook
  • java导入Excel表格数据

    千次阅读 多人点赞 2019-05-08 13:55:09
    一、思路是这样的: 1.先做好一个Excel模板供用户下载,例如下图 2.用户使用模板填好数据,上传Excel文件到web后台,后台接收文件。 ... 3.把用户上传的文件进行...1.要导入数据JAVA对象如下: public clas...

    一、思路是这样的:

          1.先做好一个Excel模板供用户下载,例如下图

          2.用户使用模板填好数据,上传Excel文件到web后台,后台接收文件。

          3.把用户上传的文件进行校验文件格式、字段是否符合要求,符合要求则解析数据,保存到数据库中,不符合要求则提示;

          

    二、代码实现

     1.要导入的数据JAVA对象如下:

    public class Rfid extends BaseEntity{
    
        //名称
        private String name;
        //藏品类别
        private String rfidTypeId;
        //藏品类别名称
        private String rfidTypeName;
        //藏品分类
        private String typeName;
        //藏品年代
        private String age;
        //设计师
        private String stylist;
        //品牌
        private String brand;
        //国家地区
        private String contriesRegions;
        //材质
        private String texture;
        //工艺
        private String technology ;
        //尺寸
        private String measure;
        //颜色
        private String colour;
        //入藏时间
        private Date enterTime;
        //包含藏品数量
        private Integer rfidCout;
        //藏品来源
        private String source;
        //馆藏状态
        private Integer rfidState=0;
        //关键词
        private String keyword;
        //曾被引用
        private String quote;
        //关联藏品
        @Transient
        private String relevance;
        //保险
        private String insurance;
        //藏品编号
        private String typeNumber;
        //出入库状态
        private Integer status=0;
        //仓库位置信息
        private String locationInformation;
        //描述
        private String description;
    
    //省略get、set方法
    }

     

    2.Excel表格导入后,处理代码如下

    /**
         * 读取出filePath中的所有数据信息
         * @param filePath filePath excel文件的绝对路径
         * @param cellNameList 要读取的对应表头名
         * @return
         */
        public static List<String[]> getDataFromExcel(String filePath,List<String> cellNameList )throws Exception{
    
            List<String[]> resultList = new ArrayList<>();
            //判断是否为excel类型文件
            if(!filePath.endsWith(".xls")&&!filePath.endsWith(".xlsx"))
            {
                throw new BaseException("文件不是excel类型");
            }
            FileInputStream fis =null;
            Workbook wookbook = null;
            int flag = 0;
            try
            {
                //获取一个绝对地址的流
                fis = new FileInputStream(filePath);
            }
            catch(Exception e)
            {
                e.printStackTrace();
            }
            try
            {
                //2003版本的excel,用.xls结尾
                wookbook = new HSSFWorkbook(fis);//得到工作簿
    
            }
            catch (Exception ex)
            {
                try
                {
                    //2007版本的excel,用.xlsx结尾
                    fis = new FileInputStream(filePath);
                    wookbook = new XSSFWorkbook(fis);//得到工作簿
                } catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
            //得到一个工作表
            Sheet sheet = wookbook.getSheetAt(0);
            //获得表头
            Row rowHead = sheet.getRow(0);
            //根据不同的data放置不同的表头
           /* Set<String> headSet = new HashSet<>();*/
            //判断表头列数是否与预期的列数一致
            if(rowHead.getPhysicalNumberOfCells() != cellNameList.size())
            {
                throw new BaseException("表头列数与要导入的数据库不对应");
            }
            //判断表头与预期数据是否相符
             while (flag < cellNameList.size()){
                Cell cell = rowHead.getCell(flag);
                String cellName=cellNameList.get(flag);
                if (getRightTypeCell(cell).equals(cellName))
                {
                    //headSet.add(cellName);
                }else{
                    throw new BaseException("表头["+getRightTypeCell(cell)+"]不合规范,请修改后重新导入");
                }
                flag++;
            }
            /*if(headSet.size()!= cellNameList.size()){
                throw new BaseException("表头不合规范,请修改后重新导入");
            }*/
    
            //获得数据的总行数
            int totalRowNum = sheet.getLastRowNum();
            if(0 == totalRowNum)
            {
                throw new BaseException("Excel内没有数据");
            }
    
            //要获得属性
            String name = "";
            //获得所有数据
            for(int i = 1 ; i <= totalRowNum ; i++)
            {
                //获得第i行对象
                Row row = sheet.getRow(i);
                String [] cells=new String[cellNameList.size()];
                for(int j=0;j<cellNameList.size();j++){
                    name = (String) getRightTypeCell(row.getCell(j));
                    cells[j]=name;
                }
                resultList.add(cells);
            }
            return resultList;
        }
    
    
    
    
    
    /**
         * 把EXCEL Cell原有数据转换成String类型
         * @param cell 一个单元格的对象
         * @return 返回该单元格相应的类型的值
         */
        public static String getRightTypeCell(Cell cell) {
            if(cell==null) return "";
    
            String cellSring="";
            switch (cell.getCellType()) {
                case HSSFCell.CELL_TYPE_STRING: // 字符串
                    cellSring = cell.getStringCellValue();
                    break;
                case HSSFCell.CELL_TYPE_NUMERIC: // 数字
                    if(HSSFDateUtil.isCellDateFormatted(cell)){
                        //用于转化为日期格式
                        Date d = cell.getDateCellValue();
                        DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                        cellSring= formater.format(d);
                    }else{
                        // 用于格式化数字,只保留数字的整数部分
                        DecimalFormat df = new DecimalFormat("########");
                        cellSring= df.format(cell.getNumericCellValue());
    
                    }
                    //cellSring=String.valueOf(cell.getNumericCellValue());
                    break;
                case HSSFCell.CELL_TYPE_BOOLEAN: // Boolean
                    cellSring=String.valueOf(cell.getBooleanCellValue());
                    break;
                case HSSFCell.CELL_TYPE_FORMULA: // 公式
                    cellSring=String.valueOf(cell.getCellFormula());
                    break;
                case HSSFCell.CELL_TYPE_BLANK: // 空值
                    cellSring="";
                    break;
                case HSSFCell.CELL_TYPE_ERROR: // 故障
                    cellSring="";
                    break;
                default:
                    cellSring="ERROR";
                    break;
            }
            return cellSring;
        }

    3.业务逻辑即Service层,代码如下

    /**
         * 批量导入藏品
         * @param file
         * @return
         * @throws Exception
         */
        public List<Rfid> importRfid(MultipartFile file) throws Exception {
    
            List<Rfid> resultList=new ArrayList<>();
            String origName = file.getOriginalFilename();
            String name = FilesService.trimExt(origName);
            String ext = FilesService.getExt(origName);
            if (ext != null) {
                ext = ext.toLowerCase();
            }
    
            String fileName = name+"_"+filesService.generateFileName(new Date());
    
            String fullPath= uploadPathHelper.getRootPath()+ uploadPathHelper.getFilePath() + fileName;
            File f = new File(uploadPathHelper.getRootPath()+ uploadPathHelper.getFilePath());
            if (!f.exists()) {
                f.mkdirs();
            }
            String url =fullPath+ "." + ext;
            File f1 = new File(url);
            f1.createNewFile();
            file.transferTo(f1);
            List<String[]> resultString= excelUtil.getDataFromExcel(url,this.getCellNameList());
    
            resultString.forEach(rfidArray->{
                Rfid rfid=new Rfid();
                rfid.setName(rfidArray[0]);
                rfid.setRfidTypeId(rfidArray[1]);
                rfid.setRfidTypeName(rfidArray[2]);
                rfid.setTypeName(rfidArray[3]);
                rfid.setAge(rfidArray[4]);
                rfid.setStylist(rfidArray[5]);
                rfid.setBrand(rfidArray[6]);
                rfid.setContriesRegions(rfidArray[7]);
                rfid.setTexture(rfidArray[8]);
                rfid.setTechnology(rfidArray[9]);
                rfid.setMeasure(rfidArray[10]);
                rfid.setColour(rfidArray[11]);
                rfid.setEnterTime(TimeUtil.getDate(rfidArray[12]));
                if(rfidArray[13]!=null)
                rfid.setRfidCout(Integer.parseInt(rfidArray[13]));
                rfid.setSource(rfidArray[14]);
                rfid.setKeyword(rfidArray[15]);
                rfid.setLocationInformation(rfidArray[16]);
                rfid.setDescription(rfidArray[17]);
                try {
                    resultList.add( this.save(rfid,null));
                } catch (Exception e) {
                    e.printStackTrace();
                }
            });
    
            //导入完成,删除导入文件
            File delExt=new File(url);
            if(delExt.exists()){
                delExt.delete();
            }
            return resultList;
        }
    
    
    
    /**
    *要导入Excel字段名称
    *
    **/
    
    
    public List<String> getCellNameList(){
            //导入藏品的字段名称
            List<String> cellNameList =new ArrayList<>();
            cellNameList.add("名称");
            cellNameList.add("藏品类别");
            cellNameList.add("藏品类别名称");
            cellNameList.add("藏品分类");
            cellNameList.add("藏品年代");
            cellNameList.add("设计师");
            cellNameList.add("品牌");
            cellNameList.add("国家地区");
            cellNameList.add("材质");
            cellNameList.add("工艺");
            cellNameList.add("尺寸");
            cellNameList.add("颜色");
            cellNameList.add("入藏时间");
            cellNameList.add("包含藏品数量");
            cellNameList.add("藏品来源");
            cellNameList.add("关键词");
            cellNameList.add("仓库位置信息");
            cellNameList.add("描述");
            return  cellNameList;
        }

    4.控制层代码

    @ResponseBody
        @PostMapping("importRfid")
        public String importRfid(MultipartFile file) throws Exception {
            return Result.succeedResultByMsgAndDate("藏品导入成功",rfidService.importRfid(file));
        }

     

     

    到此Excel批量导入数据完成。

    展开全文
  • java 批量导入excel数据

    热门讨论 2012-04-04 12:46:37
    java平台中批量将excel表格中数据导入到数据库中
  • java导入Excel

    2016-05-10 11:30:41
    完美的实现了java代码将数据导入到Excel或将Excel数据导入java后台
  • Java Excel 导入数据

    2017-01-22 20:40:54
    Java Excel 导入数据
  • 主要为大家详细介绍了Java实现excel大数据导入,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java读取excel数据导入数据库源码 java读取excel数据导入数据库源码
  • java导入excel

    千次阅读 2018-01-09 15:07:11
    java导入excel
  • java导入EXCEL

    2010-08-15 22:49:53
    lotus BS 通过 java导入EXCEL数据到系统当中,
  • java实现Excel数据导入到数据库,如果数据库中存在就更新。 数据库数据导入到Excel表中。 java实现Excel数据导入到数据库,如果数据库中存在就更新。 数据库数据导入到Excel表中。
  • java导入excel日期数据

    千次阅读 2019-01-18 18:17:32
    在使用poi解析Excel文件时,会发现,表格中的日期解析出来是一个数字,如下: 我们期望这个日期解析出来是:2015/8/21,而结果却是42237.什么原因呢?这个数字是什么呢?是以1900年为原点,到2015年8月21日,之间...
  • Java导入Excel文件返回数据对应属性类字段,Java导出Excel文件如何让数据对应指定的标题字段-附件资源
  • java导入excel数据到mysql数据库

    千次阅读 2012-04-22 20:14:47
    package com.excel; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class UtilDa
  • 导入Excel数据,验证数据是否符合标准,如果不符合则返回所有错误的行数,数据量每个Excel为2w~3w左右数据量,导入较慢,通过线程池把数据分块为每1000条为一批数据,同时导入数据库提高速度。 二、Excel文件标准 ...
  • 导入数据的步骤如下:  一:先上传所导入库EXCEL  二:分析EXCEL导入 新增时间和速度功能 由于之前的版本是通过session传递实现进度,在集群模式下就出现了问题。详见 ...
  • java实现Excel数据导入

    2011-04-12 16:28:21
    java实现Excel数据导入,仅作参考!
  • 范例通过解析Excel,将Excel中坐标信息及属性信息转换为点对象及对象属性,并将点对象添加至地图中,属性通过标签专题图的方式一并展现。
  • Java导入Excel文件如何对应属性类对应的字段?Java导出Excel文件如何实现? 下面分为两段供各位测试,要是不懂或者实在不行可以评论一下,看到我会回复的 jar这些你们可以自己找,用maven也就是复制粘贴的事。 下面...
  • 问题:系统要求导入40万条excel数据,采用poi方式,服务器出现内存溢出情况。 解决方法:由于HSSFWorkbook workbook = new HSSFWorkbook(path)一次性将excel load到内存中导致内存不够。 故采用读取csv格式。由于...
  • 主要为大家详细介绍了Java实现Excel批量导入数据,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • java 使用 poi 解析导入大数据量(几万数据量+)时,报出OOM。这是使用POI 第二种处理方法,解决大数据导入内存溢出问题,并提升效率

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,763
精华内容 12,705
关键字:

java导入excel数据大

java 订阅