前言:
接着上一篇博客文件上传,这一篇博客实践的是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的内容
接下来看一下,解析的结果:
excel的简单解析的功能就介绍到这里了,大家可以以这个为demo,开发自己的解析excel的需求了,如需要了解文件上传可查看上一篇博客文件上传的实践
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/111240.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...