java实现读取excel表格数据

话不多说,直接上代码:

一、添加依赖:

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

二、判断excle类型,并调用相应的方法

/**
	 * 获取Excel工作蒲 
	 * @param filepath 文件路径
	 * @return
	 */
	public static void getExcel(String filepath) throws IOException {
		String filetype=getExcelType(filepath);
			if (filetype.equals("2003")) {//xls文件
				getExcel2003(filepath);
			} else if (filetype.equals("2007")) {//xlsx文件 
				getExcel2007(filepath);
			}
	}

/**
	 * 判断excel文件版本
	 * @param filePath 文件路径
	 * @return
	 */
	public static String getExcelType(String filePath) {
		String type="";
		if(filePath.matches("^.+\\.(?i)(xlsx)$")){
			type="2007";
		}else if (filePath.matches("^.+\\.(?i)(xls)$")) {
			type="2003";
		}
        return type;
    }

1、读取2007Excel

/**
	 * 获取Excel工作蒲 2007
	 * @param filepath 文件路径
	 * @return
	 */
	public static void getExcel2007(String filepath)  throws IOException {
			//创建工作簿对象
			XSSFWorkbook xssfWorkbook = new XSSFWorkbook(new FileInputStream(filepath));
			//获取工作簿下sheet的个数
			int sheetNum = xssfWorkbook.getNumberOfSheets();
			System.out.println("该excel文件中总共有:"+sheetNum+"个sheet");
			//遍历工作簿中的所有数据
			for(int i = 0;i<sheetNum;i++) {
				//读取第i个工作表
				System.out.println("读取第"+(i+1)+"个sheet");
				XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
				//获取最后一行的num,即总行数。此处从0开始
				int maxRow = sheet.getLastRowNum();
				for (int row = 0; row <= maxRow; row++) {
					//获取最后单元格num,即总单元格数 ***注意:此处从1开始计数***
					int maxRol = sheet.getRow(row).getLastCellNum();
					System.out.println("--------第" + row + "行的数据如下--------");
					for (int rol = 0; rol < maxRol; rol++){
						System.out.print(sheet.getRow(row).getCell(rol) + "  ");
					}
					System.out.println();
				}
			}
	}

2、读取2003Excel

/**
	 * 处理Excel的数据 2003
	 * @autor wzj
	 * @return 
	 */
	public static List<String[]> getExcel2003(String filepath) throws IOException {
		Workbook workbook = new HSSFWorkbook(new FileInputStream(filepath));
		List<String[]> list=new ArrayList<>();
		for (int numSheet = 0; numSheet < workbook.getNumberOfSheets(); numSheet++) {//获取每个sheet
            Sheet sheet = workbook.getSheetAt(numSheet);
            if (sheet == null) {
                continue;
            }
            //方法一:放入list集合
            for(int r = 0;r<sheet.getLastRowNum()+1;r++){
				Row headerRow=sheet.getRow(r);//获取每一行数据
				if (headerRow==null) {
					continue;
				}
				String[] headers=new String[headerRow.getLastCellNum()];//获取每一列并创建一个数组存放数组中
				for (int i = 0; i <headerRow.getLastCellNum(); i++) {
					headers[i]=getValue(headerRow.getCell(i));
				}
				list.add(headers);
			}
			//方法二:放入map集合
            /*for (int rowNum = 1; rowNum <= sheet.getLastRowNum(); rowNum++) {//获取数据行
            	Map<String, String> map=new HashMap<>();
				Row row=sheet.getRow(rowNum);
				if (row==null) {
	            	continue;
				}
				for (int i = 0; i <row.getLastCellNum(); i++) {
					map.put(headers[i], getValue(row.getCell(i)));//将数据存放到map里面 key为表头的值
				}
				list.add(map);
			}*/
		}
		for (String[] items : list){
			Arrays.asList(items).forEach(item -> System.out.println(item));
		}
		return list;
	}

/**
	 * 转换数据为String
	 * @param cell 
	 * @return
	 */
	public static String getValue(Cell cell){
		if(cell==null){
    		return "";
    	}else{
	        if (cell.getCellType() == cell.CELL_TYPE_BOOLEAN) {//Boolean类型
	            return String.valueOf(cell.getBooleanCellValue());
	        } else if (cell.getCellType() == cell.CELL_TYPE_NUMERIC) {//Number类型
	        	double d=cell.getNumericCellValue();
	        	//如果直接tostring,数组大的将会转为科学计数法 1.0E10 所以需要format
	        	DecimalFormat df=new DecimalFormat("#");
	        	return df.format(d);
	        } else {
	            return String.valueOf(cell.getStringCellValue());
	        }
    	}
	}

三、在主方法或自定义的接口下调用工具测试:

ExcelUtils.getExcel("C://Users//dell//Desktop//123.xls");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值