需要做個導入excel數據到mysql,其實navicate工具就可以無腦導入辣,但是如果需要加些業務啥的那最好還是寫代碼操作了,其實很簡單,還是記錄下來,分享也方便自己日後直接拿來用~
開整~
當然第一步是先讀到內存裏啦,Apache的POI是個很好的工具,話不多少,貼代碼,修改下自己需要接收excel數據的Java類即可~
1.將相應maven依賴添加到pom.xml文件中:
<!-- poi:07版之前的二進制格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<!-- poi-ooxml:07版之後的OpenXML格式 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
2.新建對應excel數據的接收類,這裏不再贅述遼
3.util 工具類(根據需要修改,只是操作excel部分通用)
package com.pacific.rsp.phone.util;
import com.pacific.rsp.phone.exception.PhoneException;
import com.pacific.rsp.phone.model.request.EmpParam;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.springframework.web.multipart.MultipartFile;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.util.*;
/**
* @author: Hason
* @Description:Excel上傳: 針對單元格數據類型轉換數據格式
* @Date: Created in 2019/5/24 14:14
*/
public class ExcelUtils {
public static List<EmpParam> readPhoneUserImportScores(MultipartFile file) throws Exception {
if(file == null || file.getSize() == 0)
return null;
List<EmpParam> datas = new ArrayList<EmpParam>();
// 文件名
String fileName = file.getOriginalFilename();
if (fileName.endsWith(".xlsx")||fileName.endsWith(".xls")) {
// 獲取Excel文件對象
Workbook wb = WorkbookFactory.create(file.getInputStream());
// 獲取文件指定工作表,默認第一個
Sheet sheet = wb.getSheetAt(0);
// 遍歷行數(行記錄,從0開始,首行記錄數+1)
w: for (int i = 2; i < sheet.getLastRowNum() + 1; i++) {
// 每一行對應一個list
List<Object> list = new ArrayList<Object>();
// 創建一個行對象
Row row = sheet.getRow(i);
if (row == null || row.getLastCellNum() == -1) {
break w;
}
if(!CheckRowNull(row)){
continue;
}
//表格列名校驗開始
List checkTitleList = new ArrayList<Object>();
Row checkTitleListrow = sheet.getRow(1);
for (int j = 0; j < checkTitleListrow.getLastCellNum(); j++) {
// 爲每一個字段創建一個單元格對象
Cell checkTitleListcell = checkTitleListrow.getCell((short) (j));
if (checkTitleListcell == null || "".equals(checkTitleListcell)) {
checkTitleList.add("");
continue ;
}
// 獲取cell數據
Object data = getCellValue(checkTitleListcell);
checkTitleList.add(data);
}
if(!checkTitleList.get(0).equals("姓名") || !checkTitleList.get(1).equals("工號") || !checkTitleList.get(2).equals("手機號") )throw new PhoneException("表格列名稱錯誤,請選擇正確的模板導入!","PH00001");
// 遍歷一行中的每個字段
for (int j = 0; j < row.getLastCellNum(); j++) {
// 爲每一個字段創建一個單元格對象
Cell cell = row.getCell((short) (j));
if (cell == null || "".equals(cell)) {
list.add("");
continue;
}
// 獲取cell數據
Object data = getCellValue(cell);
list.add(data);
}
//此部分用自己的實體類接收數據
// EmpParam param =new EmpParam();
// param.setName(list.get(0).toString());
// param.setEmpNo(list.get(1).toString());
// param.setMobile(list.get(2).toString());
// param.setChannel(list.get(3).toString());
datas.add(param);
}
wb.close();
}
return datas;
}
/**
* EXCEL中的CELL值轉換
*
* @param cell
* @return
*/
public static Object getCellValue(Cell cell) {
Object result = null;
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_NUMERIC: // 數字類型,日期類型
result = dealNum(cell);
break;
case XSSFCell.CELL_TYPE_STRING: // 字符串類型
result = cell.getStringCellValue();
result = dealStr(result.toString());
break;
case XSSFCell.CELL_TYPE_FORMULA: // 公式
result = cell.getCellFormula();
break;
default:
result = String.valueOf(cell.getStringCellValue());
break;
}
return result;
}
/**
* 處理數值類型
*
* @param cell
* @return
*/
public static Object dealNum(Cell cell) {
Object str = "";
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date cellDate = cell.getDateCellValue();
//str = TimeUtils.formatAll(cellDate);
return cellDate;
} else {
str = new DecimalFormat("#.##").format(cell.getNumericCellValue());
}
return str;
}
/**
*
* 根據後綴判斷是否爲 Excel 文件,後綴匹配xls和xlsx
*
* @param pathname
* @return
*
*/
public static boolean isExcel(String pathname) {
if (pathname == null) {
return false;
}
return pathname.endsWith(".xls") || pathname.endsWith(".xlsx");
}
/**
* 處理字符串
*
* @param str
* @return
*/
public static String dealStr(String str) {
if (str.trim().equals("") || str.trim().length() < 0) {
str = "";
}
return str;
}
/**
* 檢查改行是不是全空
* @param row
* @return
*/
public static boolean CheckRowNull(Row row){
boolean flag = false;
Iterator<Cell> iterator = row.cellIterator();
while(iterator.hasNext()){
Cell cell = iterator.next();
if(cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && !cell.equals("") )
flag = true;
}
return flag;
}
public static boolean checkNumber(String number){
// String regex = "^(\\d|[1-9]\\d|100)(\\.\\d{1,1})?$";
String regex = "^(((\\d|[1-9]\\d)(\\.\\d{1,2})?)|100|100.0|100.00)$";
if(number.matches(regex)){
return true;
}else {
return false;
}
}
/**
* 判斷字符串是否爲數字
* @param str
* @return
*/
public static boolean isNumber(String str){
return str.matches("-?[0-9]+.*[0-9]*");
}
public static boolean checkYear(String year){
String regex = "[1-9]+\\d{3}\\-(?:0[1-9]|1[0-2])";
StringBuffer str = new StringBuffer(year);
str.insert(4, "-");
String s = str.toString();
if(s.matches(regex)){
return true;
}else {
return false;
}
}
public static boolean isDone(String number1,String number2){
Integer integer1 = Integer.valueOf(number1);
Integer integer2 = Integer.valueOf(number2);
if(integer1<integer2){
return true;
}else {
return false;
}
}
/**
* 獲取利用反射獲取類裏面的值和名稱
*
* @param obj
* @return
* @throws IllegalAccessException
*/
public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {
Map<String, Object> map = new HashMap<>();
Class<?> clazz = obj.getClass();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
Object value = field.get(obj);
map.put(fieldName, value);
}
return map;
}
}
聽說有大神寫了個開源項目叫EasyExcel,還沒來得及看,應該很強大,有興趣可以看下~
GitHub:https://github.com/alibaba/easyexcel