<!-- excel工具 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>${poi.version}</version>
</dependency>
<properties>
<poi.version>3.17</poi.version>
</properties>
首先poi的pom文件 版本号
里面的代码,改改包名,别的应该就不用改了
package com.ruoyi.web.controller.system;
import com.ruoyi.common.exception.BusinessException;
import com.ruoyi.common.utils.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.NumberToTextConverter;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* excel 导入工具类
* @author 姜文林 2020/6/2
*/
public class ImportExcelFile {
private static final Logger log = LoggerFactory.getLogger(ImportExcelFile.class);
/**
* excel版本
*/
private static final String EXCEL_XLS = "xls";
private static final String EXCEL_XLSX = "xlsx";
/**
* 时间格式
*/
public final static String DATE_OUTPUT_PATTERNS = "yyyy-MM-dd HH:mm:ss";
public final static SimpleDateFormat simpleDateFormat = new SimpleDateFormat(DATE_OUTPUT_PATTERNS);
/**
* 判断版本获取Wordboook
*
* @param in 输入流
* @param fileName 文件名称
* @return Workbook版本
* @throws IOException
*/
private static Workbook getWorkbook(InputStream in, String fileName) throws IOException {
Workbook wbook = null;
if (fileName.endsWith(EXCEL_XLS)) {
wbook = new HSSFWorkbook(in);
} else if (fileName.endsWith(EXCEL_XLSX)) {
wbook = new XSSFWorkbook(in);
}
return wbook;
}
/**
* 解析excel文件问对象集合
*
* @param file 文件上传
* @param fileName 文件名称 file.getOriginalFilename()可以获得
* @return
*/
public static String getExcelData(MultipartFile file, String fileName) {
//文件校验
long size = file.getSize();
if (file == null || fileName == null ||
StringUtils.isEmpty(fileName) && size == 0) {
throw new BusinessException("导入数据不能为空!");
}
//成功数量
int successNum = 0;
// 失败数量
int failureNum = 0;
// 成功集合
StringBuilder successMsg = new StringBuilder();
// 失败集合
StringBuilder failureMsg = new StringBuilder();
// 行数 用来抛出错误用或者成功用
int linesNumber = 0;
List<List<String>> lists = new ArrayList<>();
try {
// 获取版本
Workbook workbook = getWorkbook(file.getInputStream(), fileName);
//获取Sheet的数量
int sheetCount = workbook.getNumberOfSheets();
// 第一个Sheet
Sheet sheet = workbook.getSheetAt(0);
//表头
Row rowHead = sheet.getRow(0);
//总列数
int columns = rowHead.getPhysicalNumberOfCells();
//总行数
int lines = sheet.getPhysicalNumberOfRows();
/**
* 判断是不是空的excel 下面有一个for循环 所以行数的判断根据具体情况来,因为
* 表头可能是多行,我下面的循环从2开始,所有行数应该 >2
*/
if (columns < 1 || lines < 2) {
throw new BusinessException("导入数据不能为空!");
}
//循环获取每行数据
for (int i = 2; i < lines; i++) {
// 行数+1是正确的行数
linesNumber = i + 1;
Row row = sheet.getRow(i);
视情况而定的代码();
// 失败判断条件 触发failureNum ++ 触发failureNum集合 后面的.getCell(1)是第几列 +1
if (i == 0) {
failureNum++;
failureMsg.append("<br/>" + failureNum + "、【行数】" + linesNumber + "【某某字段】" + row.getCell(1) + " 添加怎么了(例如不存在)");
continue;
}
// String.valueOf(getCellValue(row.getCell(1))) 用来判断类型
// qqq 实体类
// qqq.setxx(String.valueOf(getCellValue(row.getCell(1))));
// 添加数据库
// xxxMapper.insertxxx(qqq);
// 成功 successNum ++ successMsg 后面的.getCell(1)是第几列 +1
successNum++;
successMsg.append("<br/>" + successNum + "、【某某字段】 " + row.getCell(1) + " 已添加");
}
} catch (Exception e) {
failureNum++;
String msg = "<br/>" + failureNum + "、【行数】 " + linesNumber + " 导入失败:";
failureMsg.append(msg + e.getMessage());
log.error(msg, e);
}
if (failureNum > 0) {
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
throw new BusinessException(failureMsg.toString());
} else {
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
}
return successMsg.toString();
// JSONArray array = JSONArray.parseArray(JSON.toJSONString(lists));
// return null;
// return array.toJavaList(User.class);
}
/**
* 获取对应的枚举类型数据
*
* @param cell 单元格
* @return 对应的枚举类型数据
*/
public static String getCellValue(Cell cell) {
String ret = "";
if (cell == null) {
return ret;
}
CellType type = cell.getCellTypeEnum();
switch (type) {
case BLANK:
ret = "";
break;
case BOOLEAN:
ret = String.valueOf(cell.getBooleanCellValue());
break;
case ERROR:
ret = null;
break;
case FORMULA:
Workbook wb = cell.getSheet().getWorkbook();
CreationHelper crateHelper = wb.getCreationHelper();
FormulaEvaluator evaluator = crateHelper.createFormulaEvaluator();
ret = getCellValue(evaluator.evaluateInCell(cell));
break;
case NUMERIC:
if (DateUtil.isCellDateFormatted(cell)) {
Date theDate = cell.getDateCellValue();
ret = simpleDateFormat.format(theDate);
} else {
ret = NumberToTextConverter.toText(cell.getNumericCellValue());
}
break;
case STRING:
ret = cell.getRichStringCellValue().getString();
break;
default:
ret = "";
}
// 有必要自行trim
return ret;
}
public static void 视情况而定的代码() {
/**
* 这一行的代码视情况而定 直接打在这一行
* //循环获取每列
* List<String> list = new ArrayList<>();
* for (int j = 0; j < columns; j++) {
* if (sheet.getRow(i).getCell(j) != null) {
* Object obj = getCellValue(sheet.getRow(i).getCell(j));
* list.add(String.valueOf(obj));
* } else {
* list.add(null);
* }
* }
* lists.add(list);
*/
}
}