Ⅰ:pom依赖
<!-- Excle Xls格式解析 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
<!-- Excle Xlsx格式解析 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
<!-- 解析Excle相关依赖 -->
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>org.apache.xmlbeans</groupId>
<artifactId>xmlbeans</artifactId>
<version>2.6.0</version>
</dependency>
<!-- FastJason -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.8</version>
</dependency>
Ⅱ:代码 ,包括JSONArray转换成list对象,以及上传的file文件判空处理,LZ是直接抛出异常,粘贴过去的话可以换成打桩输出(若粘过去无法使用可能是配置文件缺少,可以去我上篇帖子里面找)
package com.luntek.platform.ic_manufacturing_platform.utils;
import com.luntek.platform.ic_manufacturing_platform.exception.BusinessException;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author Czw
* @Description 解析用户上传的Excle表格
* @Date 2019/4/9 下午 3:58
*/
@Component
public class ExcleResolve<T> {
/**
* 将Excle表格中的数据转换成指定List对象集合
* @author Czw
* @date 2019/4/9 下午 10:47
* @param file 上传的Excle文件
* @param clazz 类对象
* @return t对象的list集合
* @exception BusinessException 文件类型不支持,文件为空
*/
public List readExcel(File file, Class clazz) throws IOException, InvalidFormatException, BusinessException {
int res = checkFile(file);
JSONArray jsonArray = null;
if (res == 0 || readXLSX(file).size() == 0 || readXLS(file).size() == 0) {
throw new BusinessException(307, "文件不存在或者文件为空");
}else if (res == 1) {
jsonArray = readXLSX(file);
}else if (res == 2) {
jsonArray = readXLS(file);
}else {
throw new BusinessException(306,"文件类型不支持");
}
return this.jsonArrayToList(jsonArray, clazz);
}
/**
* 用于将一个
* @param jsonArray 需要转换的JSONArray
* @param clazz 类对象
* @return List 对象集合
* @author Czw
* @date 2019/4/9 0009 下午 9:16
*/
private List jsonArrayToList(JSONArray jsonArray, Class clazz) {
if (jsonArray.size() > 0) {
return com.alibaba.fastjson.JSONObject.parseArray(jsonArray.toString(), clazz);
} else {
//表格为空
return null;
}
}
/**
* 判断File文件的类型
* @param file 传入的文件
* @return 0-文件为空,1-XLSX文件,2-XLS文件,3-其他文件
*/
private int checkFile(File file){
//文件不存在
if (!file.exists() || file.length()==0) {
return 0;
}
String flieName = file.getName();
if (flieName.endsWith(Constants.XLSX)) {
System.out.println(1);
return 1;
}
if (flieName.endsWith(Constants.XLS)) {
return 2;
}
return 3;
}
/**
* 读取XLSX文件
*/
private JSONArray readXLSX(File file) throws InvalidFormatException, IOException{
Workbook book = new XSSFWorkbook(file);
Sheet sheet = book.getSheetAt(0);
return read(sheet, book);
}
/**
* 读取XLS文件
* @param file 文件
* @throws FileNotFoundException 文件未找到
*/
private JSONArray readXLS(File file) throws FileNotFoundException, IOException{
POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file));
Workbook book = new HSSFWorkbook(poifsFileSystem);
Sheet sheet = book.getSheetAt(0);
return read(sheet, book);
}
/**
* 解析数据
* @param sheet 表格sheet对象
* @param book 用于流关闭
*/
private JSONArray read(Sheet sheet, Workbook book) throws IOException{
int rowStart = sheet.getFirstRowNum(); // 首行下标
int rowEnd = sheet.getLastRowNum(); // 尾行下标
// 如果首行与尾行相同,表明只有一行,直接返回空数组
if (rowStart == rowEnd) {
book.close();
return new JSONArray();
}
// 获取第一行JSON对象键
Row firstRow = sheet.getRow(rowStart);
int cellStart = firstRow.getFirstCellNum();
int cellEnd = firstRow.getLastCellNum();
Map<Integer, String> keyMap = new HashMap<>();
for (int j = cellStart; j < cellEnd; j++) {
keyMap.put(j,getValue(firstRow.getCell(j), rowStart, j, book, true));
}
// 获取每行JSON对象的值
JSONArray array = new JSONArray();
for(int i = rowStart+1; i <= rowEnd ; i++) {
Row eachRow = sheet.getRow(i);
JSONObject obj = new JSONObject();
StringBuilder sb = new StringBuilder();
for (int k = cellStart; k < cellEnd; k++) {
if (eachRow != null) {
String val = getValue(eachRow.getCell(k), i, k, book, false);
sb.append(val); // 所有数据添加到里面,用于判断该行是否为空
obj.put(keyMap.get(k),val);
}
}
if (sb.toString().length() > 0) {
array.add(obj);
}
}
book.close();
return array;
}
/**
* 获取每个单元格的数据
* @param cell 单元格对象
* @param rowNum 第几行
* @param index 该行第几个
* @param book 主要用于关闭流
* @param isKey 是否为键:true-是,false-不是。 如果解析Json键,值为空时报错;如果不是Json键,值为空不报错
*/
private String getValue(Cell cell, int rowNum, int index, Workbook book, boolean isKey) throws IOException{
// 空白或空
if (cell == null || cell.getCellTypeEnum() == CellType.BLANK) {
if (isKey) {
book.close();
throw new NullPointerException(String.format("the key on row %s index %s is null ", ++rowNum,++index));
}else{
return "";
}
}
// 0. 数字 类型
if (cell.getCellTypeEnum() == CellType.NUMERIC) {
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
return df.format(date);
}
String val = cell.getNumericCellValue()+"";
val = val.toUpperCase();
if (val.contains("E")) {
val = val.split("E")[0].replace(".", "");
}
return val;
}
// 1. String类型
if (cell.getCellTypeEnum() == CellType.STRING) {
String val = cell.getStringCellValue();
if (val == null || val.trim().length()==0) {
if (book != null) {
book.close();
}
return "";
}
return val.trim();
}
// 2. 公式 CELL_TYPE_FORMULA
if (cell.getCellTypeEnum() == CellType.FORMULA) {
return cell.getStringCellValue();
}
// 4. 布尔值 CELL_TYPE_BOOLEAN
if (cell.getCellTypeEnum() == CellType.BOOLEAN) {
return cell.getBooleanCellValue()+"";
}
// 5. 错误 CELL_TYPE_ERROR
return "";
}
}
3:重点:其中fastjson依赖用来将JSONArray转换成list。所转换的Excle表格中第一行字段名需与实体类的字段相同(例如entity中有name字段,则excel表格第一行对应字段就应为name)。大部分配置都在上篇帖子里面,可以去查看一下,此贴只是完善而已。
余生还长,切勿惆怅;创作不易,点赞再走