本工具类提供了Excel导入功能,通过反射机制将Excel中数据映射到实体类中,从而获取Excel数据,工具类依赖org.apache.poi
包。支持RESTful API,支持Spring MVC中使用。
本工具类,可直接在项目中使用。
package com.excel.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.ss.usermodel.Cell;
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.ss.usermodel.WorkbookFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
/**
* Excel导入工具类
*/
public class ImportExcelUtil {
// 正则表达式 ,用于判断是get还是set方法
private static final String REGEX = "[a-zA-Z]";
private static final Logger log = LoggerFactory.getLogger(ImportExcelUtil.class);
/**
* @param multipartFile
* @param startRow 开始行
* @param endRow 结束行(0表示到最后一行结束)
* @param clazz
* @return
* @throws Exception
*/
public static List> importExcelMultipartFile(MultipartFile multipartFile, int startRow, int endRow,
Class> clazz) throws Exception {
// 判断文件是否存在
if (multipartFile == null || multipartFile.isEmpty()) {
throw new IOException("Excel文件内容为空或不存在!");
}
String name = "Excel" + System.currentTimeMillis();
File file = File.createTempFile(name, null);
multipartFile.transferTo(file);
if (!file.exists()) {
throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
}
return importExcelFile(file, startRow, endRow, clazz);
}
/**
* 根据文件导入Excel,仅导入数据,去除校验
*
* @param file 文件
* @param startRow 开始行,从0开始
* @param endRow 结束行,0表示所有行; 正数表示到第几行结束; 负数表示到倒数第几行结束
* @param clazz sheet需要映射的对象类型
* @return List>
* @throws Exception
*/
public static List> importExcelFile(File file, int startRow, int endRow, Class> clazz)
throws Exception {
List> sheetsData = new ArrayList<>();
// 判断文件是否存在
if (!file.exists()) {
throw new IOException("文件名为" + file.getName() + "Excel文件不存在!");
}
Workbook wb = null;
FileInputStream inputStream = null;
try {
inputStream = new FileInputStream(file);
// 工厂模式,根据Excel版本(2003版以前版本,或其他版本),创建对应的工作薄处理类
wb = WorkbookFactory.create(inputStream);
for (int sheetNumber = 0; sheetNumber < wb.getNumberOfSheets(); sheetNumber++) {
List rowList = new ArrayList();
Sheet sheet = wb.getSheetAt(sheetNumber);
// 获取最后行号
int lastRowNum = sheet.getLastRowNum();
Row row = null;
Pattern p = Pattern.compile("\\s*|\t|\r|\n");
// 循环读取
for (int i = startRow; i <= lastRowNum + endRow; i++) {
// 是否全部单元格都为空
boolean isEmptyRow = true;
row = sheet.getRow(i);
if (row != null) {
// 获取每一单元格的值
for (int j = 0; j < row.getLastCellNum(); j++) {
String value = p.matcher(getCellValue(row.getCell(j))).replaceAll("");
if (!value.trim().equals("")) {
isEmptyRow = false;
}
}
// 校验规则:如果是空白行,没有数据,仅有空格符、制表符等字符(用户无意间输入的字符),则应该过滤掉。
if (!isEmptyRow) {
// 该行数据中存在非空单元格,则返回该行
rowList.add(row);
}
}
}
sheetsData.add(returnObjectList(rowList, clazz));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (wb != null) {
wb.close();
}
}
return sheetsData;
}
/**
* 功能:返回指定的对象集合
*/
private static List
应用场景: Web页面中通过MultipartFile上传文件,可直接转为List
。>
使用示例:
@PostMapping(value = "/project/import")
public ResultObject importAlarmEvents(@RequestParam MultipartFile file) {
try {
// 从Excel第一行起到最后一行结束,
List> excelData = ImportExcelUtil.importExcelMultipartFile(file, 1, 0, EventDTO.class);
if (excelData == null || excelData.isEmpty()) {
result.setMessage("导入失败,Excel内容为空");
return result;
}
//将Excel中数据,转为你的实体类
List> alarmList = new ArrayList<>();
for (List> list : excelData) {
alarmList.add((List) list);
}
Map res = eventService.importEvent(alarmList);
} catch (Exception e) {
result.setMessage(e.getMessage());
}
return result;
}
应用场景: Web页面中通过File上传文件,可直接转为List
。>
使用示例:
@PostMapping(value = "/project/import")
public ResultObject importAlarmEvents(@RequestParam File file) {
try {
// 从Excel第一行起到最后一行结束,
List> excelData = ImportExcelUtil.importExcelFile(file, 1, 0, EventDTO.class);
if (excelData == null || excelData.isEmpty()) {
result.setMessage("导入失败,Excel内容为空");
return result;
}
//将Excel中数据,转为你的实体类
List> alarmList = new ArrayList<>();
for (List> list : excelData) {
alarmList.add((List) list);
}
Map res = eventService.importEvent(alarmList);
} catch (Exception e) {
result.setMessage(e.getMessage());
}
return result;
}
注意:实体类的属性声明顺序,必须跟Excel列头顺序保持一致,否则会出现列数据和属性名对应不上问题
package com.entity.dto;
import java.io.Serializable;
/**
* 数据转Excel对象 注:属性名的顺序和Excel列顺序必须相同
*/
@SuppressWarnings("serial")
public class EventDTO implements Serializable {
// 列字段1
private String name;
// 列字段2
private String code;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
}