Java SpringMVC项目导入excel2003以及2007多版本自动识别对应工具类(util)

12 篇文章 0 订阅

一直想着如何智能提高导入的方法,想出了一个工具类,希望对大家有用,导入excel生成对应的行的集合(list),集合里是对应列的Map。原生基于apache的poi类

Ps:之间还遇到了时间和电话号码转型问题,不知道为什么excel明明列设置了文本,但导入来的时候还是识别了数字类型,然后改良了代码,识别时间日期和数字类型返回字符串。


1.首先是导入Excel2003以前(包括2003)的版本,扩展名是.xls 的


/**
	 * 操作Excel2003以前(包括2003)的版本,扩展名是.xls 
	 * @param templetFile 文件
	 * @param startrow 开始行号
	 * @param startcol 开始列号
	 * @param sheetnum sheet
	 * @return list
	 */
	public static List<Map<String,String>> readExcelByXls(MultipartFile templetFile, int startrow, int startcol, int sheetnum) {
		List<Map<String,String>> varList = new ArrayList<Map<String,String>>();

		try {
			
			HSSFWorkbook wb = new HSSFWorkbook(templetFile.getInputStream());
			HSSFSheet sheet = wb.getSheetAt(sheetnum); 					//sheet 从0开始
			int rowNum = sheet.getLastRowNum() + 1; 					//取得最后一行的行号

			for (int i = startrow; i < rowNum; i++) {					//行循环开始
				
				Map<String,String> varpd = new HashMap<String,String>();
				HSSFRow row = sheet.getRow(i); 							//行
				int cellNum = row.getLastCellNum(); 					//每行的最后一个单元格位置

				for (int j = startcol; j < cellNum; j++) {				//列循环开始
		
					HSSFCell cell = row.getCell(Integer.parseInt(j + ""));
					String cellValue = null;
					if (null != cell) {
						switch (cell.getCellType()) { 					// 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
						case 0:
							if(HSSFDateUtil.isCellDateFormatted(cell)){
								SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
								cellValue=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
							} else {
								cell.setCellType(1);
								cellValue = cell.getStringCellValue();
						    }
							break;
						case 1:
							cellValue = cell.getStringCellValue();
							break;
						case 2:
							//cell.setCellType(1);
							//cellValue = cell.getStringCellValue();
							//cellValue = cell.getNumericCellValue() + "";
							 cellValue = String.valueOf(cell.getDateCellValue());
							break;
						case 3:
							cellValue = "";
							break;
						case 4:
							cellValue = String.valueOf(cell.getBooleanCellValue());
							break;
						case 5:
							cellValue = String.valueOf(cell.getErrorCellValue());
							break;
						}
					} else {
						cellValue = "";
					}
					
					varpd.put("var"+j, cellValue);
					
				}
				varList.add(varpd);
			}

		} catch (Exception e) {
			System.out.println(e);
		}
		
		return varList;
	}


2.是操作Excel2007的版本,扩展名是.xlsx的


/**
	 * 是操作Excel2007的版本,扩展名是.xlsx
	 * @param templetFile 文件
	 * @param startrow 开始行号
	 * @param startcol 开始列号
	 * @param sheetnum sheet
	 * @return list
	 */
	public static List<Map<String,String>> readExcelByXlsx(MultipartFile templetFile, int startrow, int startcol, int sheetnum) {
		List<Map<String,String>> varList = new ArrayList<Map<String,String>>();

		try {
			
			XSSFWorkbook wb = new XSSFWorkbook(templetFile.getInputStream());
			XSSFSheet sheet = wb.getSheetAt(sheetnum); 					//sheet 从0开始
			int rowNum = sheet.getLastRowNum() + 1; 					//取得最后一行的行号

			for (int i = startrow; i < rowNum; i++) {					//行循环开始
				
				Map<String,String> varpd = new HashMap<String,String>();
				XSSFRow row = sheet.getRow(i); 							//行
				int cellNum = row.getLastCellNum(); 					//每行的最后一个单元格位置

				for (int j = startcol; j < cellNum; j++) {				//列循环开始
					
					XSSFCell cell = row.getCell(Integer.parseInt(j + ""));
					String cellValue = null;
					if (null != cell) {
						switch (cell.getCellType()) { 					// 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
						case 0:				
							if(HSSFDateUtil.isCellDateFormatted(cell)){
								SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
								cellValue=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
							} else {
								cell.setCellType(1);
								cellValue = cell.getStringCellValue();
						    }
							break;
						case 1:
							cellValue = cell.getStringCellValue();
							break;
						case 2:
							cellValue = cell.getStringCellValue();
							//cellValue = cell.getNumericCellValue() + "";
							// cellValue = String.valueOf(cell.getDateCellValue());
							break;
						case 3:
							cellValue = "";
							break;
						case 4:
							cellValue = String.valueOf(cell.getBooleanCellValue());
							break;
						case 5:
							cellValue = String.valueOf(cell.getErrorCellValue());
							break;
						}
					} else {
						cellValue = "";
					}
					
					varpd.put("var"+j, cellValue);
					
				}
				varList.add(varpd);
			}

		} catch (Exception e) {
			System.out.println(e);
		}
		
		return varList;
	}

3.重点来了,结合前两个代码使用,自动识别excel版本文件

public static List<Map<String,String>> readExcel(MultipartFile templetFile, int startrow, int startcol, int sheetnum){
		List<Map<String,String>> varList = new ArrayList<Map<String,String>>();
		if(templetFile!=null&&templetFile.getSize()>0){
			String ofn=templetFile.getOriginalFilename();// 文件名
			String extName = ""; // 扩展名格式:
			if (ofn.lastIndexOf(".") >= 0){
				extName = ofn.substring(ofn.lastIndexOf("."));
			}
			if(".xls".equals(extName.toLowerCase())){
				varList=readExcelByXls(templetFile,startrow,startcol,sheetnum);
			}else if(".xlsx".equals(extName.toLowerCase())){
				varList=readExcelByXlsx(templetFile,startrow,startcol,sheetnum);
			}
		}
		return varList;
	}



如果有问题,可以留言或者加群(466355109)交流


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值