web开发excel文件上传及解析(下)

web开发excel文件上传及解析(下)

前言:

接着上一篇博客文件上传,这一篇博客实践的是excel文件的解析,通常我们会需要这样的需求,就是让用户下载一个格式的模板,然后在模板中按照要求填写资料,最后的就是将excel中的内容全部保存到数据库中,从而实现一种批量的上传的作用,节省很多时间。

准备工作:

要实现excel文件的解析,我们同样需要依赖相应的jar包。如果是maven依赖则需要在pom.xml中添加如下依赖

 <!-- 解析Excel文件的jar包 用于2003- 版本的excel -->
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.17</version>
</dependency>
<!-- 解析Excel文件的jar包 用于2007+ 版本的excel -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.17</version>
</dependency>

如果需要下载jar包,则从下面的地址中下载相应的jar包,然后导入到项目中

链接:https://pan.baidu.com/s/1wkc7Aak4P_fwvmYoxlIwHQ 密码:wiji

功能实现:

全部代码如下:

ExcelUtil.java

package com.tools.utils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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 ExcelUtils {

	/**
	 * 根据文件路径,生成workbook实例
	 * @param filePath
	 * @return
	 */
	public static Workbook readExcel(String filePath) {
		Workbook workbook = null;
		if(filePath == null) return null;
		InputStream inputStream;
		try {
			inputStream = new FileInputStream(filePath);
			workbook = new XSSFWorkbook(inputStream);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return workbook;
	}
	
	/**
	 * 通过流获取workbook的实例
	 * @param in
	 * @return
	 */
	public static Workbook readExcel(InputStream in) {
		Workbook workbook = null;
		try {
			//这里仅仅解析的是xlsx类型的excel,如果是xls格式的new HSSFWorkbook(in),大家可根据文件的后缀不同,自动适配
			workbook = new XSSFWorkbook(in);
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return workbook;
	}
	
	public static List<Map<String, String>> analysisWorkbook(Workbook workbook){
		if(workbook == null) return null;
		List<Map<String,String>> result = new ArrayList<>();
		//定义excel有哪些字段
		String[] colunms = {"name","age","score"};
		//获取第一个sheet
		Sheet firstSheet = workbook.getSheetAt(0);
		int rowNums = firstSheet.getPhysicalNumberOfRows();
		//获取第一行
		Row row = firstSheet.getRow(0);
		//获取最大的列数
		int colunmNums = row.getPhysicalNumberOfCells();
		
		for(int i=1;i<rowNums;i++) {
			row = firstSheet.getRow(i);
			Map<String,String> cellMap = new HashMap<>();
			if(row!=null) {
				for(int j=0;j<colunmNums;j++) {
					cellMap.put(colunms[j],(String) getCellValue(row.getCell(j)));
				}
			}
			result.add(cellMap);
		}
		return result;
	}
	
	/**
	 * 获取每一个excel表格中的value
	 * @param cell
	 * @return
	 */
	public static Object getCellValue(Cell cell) {
		Object result = null;
		if(cell == null) return null;
		switch (cell.getCellType()) {
		case Cell.CELL_TYPE_NUMERIC:
			result = String.valueOf(cell.getNumericCellValue());
			break;
		case Cell.CELL_TYPE_FORMULA:
			//判断cell是否是日期格式
			if(DateUtil.isCellDateFormatted(cell)) {
				result = cell.getDateCellValue();
			}else {
				result = String.valueOf(cell.getNumericCellValue());
			}
			break;
		case Cell.CELL_TYPE_STRING:
			result = cell.getRichStringCellValue().getString();
			break;
		default:
			result="";
			break;
		}
		return result;
	}
	
}

 Controller中的部分代码

@RequestMapping(value="/uploadExcelFile",method=RequestMethod.POST,produces = "text/html;charset=UTF-8")
	@ResponseBody
	public String uploadExcelFile(@RequestParam("file") CommonsMultipartFile file,HttpServletRequest request) {
		try {
			//file upload start
			String path = request.getSession().getServletContext().getRealPath("/");
			String fileName = "display.xlsx";
			File excelFile = new File(path+fileName);
			LOGGER.info("uploadExcelFile file = "+excelFile.toString());
			if(excelFile.exists()) {
				excelFile.delete();
			}
			file.transferTo(excelFile);
			//file upload end
			//解析
			InputStream in = new FileInputStream(excelFile);
			Workbook workbook = ExcelUtils.readExcel(in);
			List<Map<String, String>> list = ExcelUtils.analysisWorkbook(workbook);
			for(Map<String,String> map : list) {
				for(Entry<String,String> entry : map.entrySet()) {
					System.out.println(entry.getKey()+":"+entry.getValue());
				}
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "fail";
		}
		return "success";
	}

这部分代码仅仅是简单写的实践的实例,controller中不应该写这么多逻辑,这里为了简单演示功能,上面congroller中的代码,前半部分是文件上传,后半部分是文件解析。而文件的解析,我单独封装到一个ExcelUtil中了。

运行结果:

首先看下要解析的excel的内容

web开发excel文件上传及解析(下)

接下来看一下,解析的结果:

web开发excel文件上传及解析(下)

excel的简单解析的功能就介绍到这里了,大家可以以这个为demo,开发自己的解析excel的需求了,如需要了解文件上传可查看上一篇博客文件上传的实践

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111240.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 远程控制木马原理_安卓远程控制木马

    远程控制木马原理_安卓远程控制木马 导读:刘东发(http://www.codelive.net)的杰作——–远程控制木马”偷窥者”VC6.0编译通过。2001年是中国的木马大丰收的一年. 首先是灰鸽子的诞生.灰鸽子早期版本开放源代码,灰鸽子的作者葛军(俺安徽的老乡,呵呵可不是拉关系),开始还倒不错,开放了源代码,后来功能齐全后,葛军开始翻脸了,不但不公开源代码,还收费.灰鸽子是delphi版的,本人愚

    2025年6月16日
    2
  • Linux stat函数_linux C编程视频

    Linux stat函数_linux C编程视频linuxC函数之stat函数1.函数功能:通过文件名filename获取文件信息,并保存在buf所指的结构体stat中2.函数原型1)函数头文件#include#include2)函数intstat(constchar*file_name,structstat*buf)3)返回返回值:     执行成功则返回0,失败返回-1,错误代码存于errno错误代码:ENOENT  

    2022年8月21日
    11
  • 关于 HikariPool-1 – Starting… 启动问题

    关于 HikariPool-1 – Starting… 启动问题问题今天开了一台新的阿里云服务器,启动Docker容器内的Springboot程序,数据库(阿里云的)一直死活连不上去。2020-12-0114:39:56.178INFO[svc-activity,,,]8—[main]com.zaxxer.hikari.HikariDataSource:HikariPool-1-Starting…2020-12-0114:49:57.493ERROR[svc-activity,,,]8-

    2022年6月23日
    342
  • Springboot集成kafka_Spring boot

    Springboot集成kafka_Spring bootspringboot集成TkMapper简化持久层法人代码熟悉,提高开发效率;先给大家截个图看一下效果这就是效果!!是不是感觉很爽。(TkMapper对单表的操作很方便的)下来我们进入正题,第一步:Pom文件中加载jar文件&lt;dependency&gt;&lt;groupId&gt;tk.mybatis&lt;/groupId&gt;&lt;ar…

    2022年10月6日
    3
  • 时间序列数据库概览

    时间序列数据库概览

    2021年11月26日
    48
  • oracle日期时间函数总结

    oracle日期时间函数总结

    2021年11月29日
    35

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号