• Java解析导入Excel文件后台代码实现


    使用MultipartFile上传Excel文件后端代码实现:(springmvc下的spring-webmvc (MultipartFile )上传)
      由于POST一个包含文件上传的Form会以multipart/form-data请求发送给服务器,必须明确告诉转发器(DispatcherServlet)如何处理MultipartRequest。首先,在配置文件中声明一个MultipartResolver;
        <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">  
            <!-- 设置上传文件的最大尺寸为1MB(也可以不配置而在代码中限制上传的文件大小) -->  
            <property name="maxUploadSize">  
                <value>1048576</value>  
            </property>  
        </bean>  

    代码所需jar包下载地址:

      https://files.cnblogs.com/files/Big-Boss/Java%E5%AF%BC%E5%85%A5Excel%E6%96%87%E4%BB%B6%E6%89%80%E9%9C%80jar%E5%8C%85.zip

      注:以下代码只能满足基本需求,需根据实际需求做代码更改。

    代码:

    import java.io.FileInputStream;
    import java.io.InputStream;
    import java.lang.reflect.Field;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    import javax.servlet.http.HttpServletRequest;
    
    import org.apache.commons.lang3.StringUtils;
    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;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    /**
     * 解析导出的Excel文件
     * 注:需根据实际需求做代码更改
     * @author 【】
     *
     */
    public class ImportExcelUtil {
    	/*
    	 * 导入Excel文件
    	 * @param obj	导入文件数据对应的实体类
    	 * @param request	HttpServletRequest请求request
    	 * @return	解析后数据集合
    	 */
    	public List<Object> importExcel(Object obj, HttpServletRequest request) {
    		// 将请求转化为多部件的请求
    		MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
    		// 解析多部件请求文件
    		MultipartFile mFile = multipartRequest.getFile("importFile");
    		// 获得上传文件的文件名
    		String fileName = mFile.getOriginalFilename();
    		// 获取文件扩展名
    		String eName = fileName.substring(fileName.lastIndexOf(".")+1);
    		InputStream inputStream = mFile.getInputStream();
    		Workbook workbook = getWorkbook(inputStream, eName);
    		// 获取工作薄第一张表
    		Sheet sheet = workbook.getSheetAt(0);
    		// 获取名称
    		String sheetName = sheet.getSheetName().trim();
    		// 获取第一行
    		Row row = sheet.getRow(0);
    		// 获取有效单元格数
    		int cellNum = row.getPhysicalNumberOfCells();
    		// 表头集合
    		List<String> headList = new ArrayList<>();
    		for (int i = 0; i < cellNum; i++) {
    			Cell cell = row.getCell(i);
    			String val = cell.getStringCellValue();
    			headList.add(val);
    		}
    		Map<String, Field> map = getObjComment(obj);
    		// 获得有效行数
    		int rowNum = sheet.getPhysicalNumberOfRows();
    		// 定义导出文件中数据集合
    		List<Object> objList = new ArrayList<>();
    		for (int i = 1; i < rowNum; i++) {
    			row = sheet.getRow(i);
    			Object data = new Object();
    			for (int j = 0; j < headList.size(); j++) {
    				// 解析单元格
    				Cell cell = row.getCell(j);
    				// 根据字段给字段设值(根据实际需求更改代码)
    				Field field = map.get(headList.get(j));
    				field.setAccessible(true);
    				field.set(data, cell.getStringCellValue());
    			}
    			objList.add(data);
    		}
    		
    		return objList;
    	}
    	
    	/*
    	 * 利用java反射机制获取该类及父类的字段@Comment("")注解和字段信息Map集合
    	 */
    	public Map<String, Field> getObjComment(Object obj) {
    		Map<String, Field> map = new HashMap<>();
    		// 获取该类所有字段信息
    		Field[] fields = obj.getClass().getDeclaredFields();
    		for (Field field : fields) {
    			Comment comment = field.getAnnotation(Comment.class);
    			if (null == comment) {
    				continue;
    			}
    			if (StringUtils.isNotBlank(comment.value())) {
    				map.put(comment.value(), field);
    			}
    		}
    		// 获取其父类所有属性(字段信息)
    		Field[] superFields = obj.getClass().getSuperclass().getDeclaredFields();
    		for (Field field : superFields) {
    			Comment comment = field.getAnnotation(Comment.class);
    			if (null == comment) {
    				continue;
    			}
    			if (StringUtils.isNotBlank(comment.value())) {
    				map.put(comment.value(), field);
    			}
    		}
    		return map;
    	}
    
    	/*
    	 * 根据excel文件格式获知excel版本信息
    	 */
    	public static Workbook getWorkbook(InputStream fs,String str){
    		Workbook book = null;
    		try{
    			if ("xls".equals(str)) {
    				// 2003
    				book = new HSSFWorkbook(fs);
    			} else { 
    				// 2007
    				book = new XSSFWorkbook(fs);
    			}
    		}catch (Exception e) {
    			e.printStackTrace();
    		}
    		return book;
    	}
    
    }
    
  • 相关阅读:
    SpringMVC 数组类型的参数: Cannot generate variable name for non-typed Collection parameter type
    java.lang.NoClassDefFoundError: org/springframework/boot/context/embedded/FilterRegistrationBean
    Optional 的基本用法
    反序列化失败Failed to deserialize --- local class incompatible: stream classdesc serialVersionUID
    xxx.jar 中没有主清单属性
    低级sql语法错误: BadSqlGrammarException
    Apollo配置中心
    ELK+Beats日志分析系统部署
    Openface 入门
    spring boot 之 spring security 配置
  • 原文地址:https://www.cnblogs.com/Big-Boss/p/10007807.html
Copyright © 2020-2023  润新知