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的需求了,如需要了解文件上传可查看上一篇博客文件上传的实践

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • FPGA仿真软件-modelsim破解「建议收藏」

    FPGA仿真软件-modelsim破解「建议收藏」见原文https://blog.csdn.net/u010830004/article/details/81008764破解过程见这个链接:modelsim-win64-10.4-se下载、安装、破解全攻略-Bla…_CSDN博客

  • 华为模拟器ensp怎么安装_华为olt模拟器

    华为模拟器ensp怎么安装_华为olt模拟器华为网络模拟器eNSP安装教程

    2022年10月14日
  • 因果图和判定表_因果判定法

    因果图和判定表_因果判定法 上一篇文章中介绍了等价类和边界值,接下来我们就来学习一下因果图和判定表,这两种方法在软件测试中是非常重要的工具,这两个东西理论也是很绕口,特别是因果图,砖家给的方法我看起来也很困,所以我们就不要按照砖家的思路来。定义因果图法是一种利用图解法分析输入的各种组合情况,从而设计测试用例的方法,它适合于检查程序输入条件的各种组合情况。 特点:a考虑输入条件的相互制约及组合关系b考虑输出条件对输…

  • mysql中length函数_length中文

    mysql中length函数_length中文1、length:返回字符串所占的字节数selectlength(“10,A,B”);2、char_length:返回字符串的字符数selectchar_length(“10,A,B”);归纳:应用场景1.查询字符串长度length(str)2.查询列最大字符串长度max(length(str))3.查询某个字符出现几次length(str1)-length(replace(‘str1’,’str2’,”))4.length求得是字符长度。【1个中文、英文字母、数字、中文

  • Pycharm的python interpreter选择「建议收藏」

    Pycharm的python interpreter选择「建议收藏」初学python时我在电脑装idle,装上了ANACONDA,也裸装了python3.9(也就是说我电脑上有两个独立的python,一个是python3.9,另一个是装在Anaconda里面的python3.7。在我装上Pycharm后,Pycharm自动使用Anaconda提供的环境,虽然Anaconda的包很全,但还是有缺少的包,当我使用pip命令安装需要的包时,确自动安装到了python3.9的安装目录下,而且命令行运行python时只运行python3.9而不是Anaconda里面的python

发表回复

您的电子邮箱地址不会被公开。

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