读取 exl - s9797456/MyCommonCodeSnippets GitHub Wiki
package com.xinle.car.admin.common.util;
import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile;
/**
- poi读取excel数据 工具类
- @author yx
/
public class ReadExcelUtil {
/*
* 读取Excel的数据,自动判断是2003(含2003)前的版本(xls),还是2007(含2007)之后版本(xlsx)
* @param templetFile 文件
* @param startRow 开始行号 ,从0开始(如果第一行是标题,则从1开始)
* @param startCol 开始列号 ,从0开始
* @param sheetNum 开始标签号sheet,从0开始
* @return list<Map<String,String>>
*/
public static List<Map<String,String>> readExcel(MultipartFile templetFile, int startRow, int startCol, int sheetNum){
List<Map<String,String>> list = new ArrayList<Map<String,String>>();
if(templetFile != null && templetFile.getSize() > 0){
String ofn = templetFile.getOriginalFilename().toLowerCase();// 文件名
/String extName = ""; // 扩展名格式
if(ofn.lastIndexOf(".") >= 0){
extName = ofn.substring(ofn.lastIndexOf("."));
}
if(".xls".equals(extName.toLowerCase())){
varList = readExcelByXls(templetFile, startRow, startCol, sheetNum);
}else if(".xlsx".equals(extName.toLowerCase())){
varList = readExcelByXlsx(templetFile, startRow, startCol, sheetNum);
}/
if(isExcel2003(ofn)){
list = readExcelByXls(templetFile, startRow, startCol, sheetNum);
}else if(isExcel2007(ofn)){
list = readExcelByXlsx(templetFile, startRow, startCol, sheetNum);
}
}
return list;
}
/**
* 判断是否是2003的excel,返回true是2003
* @param filePath
* @return
*/
public static boolean isExcel2003(String filePath) {
return filePath.matches("^.+\\.(?i)(xls)$");
}
/**
* 判断是否是2007的excel,返回true是2007
* @param filePath
* @return
*/
public static boolean isExcel2007(String filePath) {
return filePath.matches("^.+\\.(?i)(xlsx)$");
}
/**
* 读取Excel2003以前(包括2003)(扩展名是.xls)的数据
* @param templetFile 文件
* @param startRow 开始行号
* @param startCol 开始列号
* @param sheetNum 开始标签号sheet
* @return list
*/
public static List<Map<String,String>> readExcelByXls(MultipartFile templetFile, int startRow, int startCol, int sheetNum) {
List<Map<String,String>> varList = new ArrayList<Map<String,String>>();
try {
HSSFWorkbook wb = new HSSFWorkbook(templetFile.getInputStream());
HSSFSheet sheet = wb.getSheetAt(sheetNum); //sheet 从0开始
int rowNum = sheet.getLastRowNum() + 1; //取得最后一行的行号
for (int i = startRow; i < rowNum; i++) { //行循环开始
Map<String,String> varpd = new HashMap<String,String>();
HSSFRow row = sheet.getRow(i); //行
int cellNum = row.getLastCellNum(); //每行的最后一个单元格位置
for (int j = startCol; j < cellNum; j++) { //列循环开始
HSSFCell cell = row.getCell(Integer.parseInt(j + ""));
String cellValue = null;
if (null != cell) {
switch (cell.getCellType()) { // 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
case 0:
if(HSSFDateUtil.isCellDateFormatted(cell)){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cellValue=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
} else {
cell.setCellType(1);
cellValue = cell.getStringCellValue();
}
break;
case 1:
cellValue = cell.getStringCellValue();
break;
case 2:
//cell.setCellType(1);
//cellValue = cell.getStringCellValue();
//cellValue = cell.getNumericCellValue() + "";
cellValue = String.valueOf(cell.getDateCellValue());
break;
case 3:
cellValue = "";
break;
case 4:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case 5:
cellValue = String.valueOf(cell.getErrorCellValue());
break;
}
} else {
cellValue = "";
}
varpd.put("var"+j, cellValue);
}
varList.add(varpd);
}
} catch (Exception e) {
System.out.println(e);
}
return varList;
}
/**
* 读取Excel2007版本(扩展名是.xlsx)的数据
* @param templetFile 文件
* @param startRow 开始行号
* @param startCol 开始列号
* @param sheetNum 开始标签号sheet
* @return list
*/
public static List<Map<String,String>> readExcelByXlsx(MultipartFile templetFile, int startRow, int startCol, int sheetNum) {
List<Map<String,String>> varList = new ArrayList<Map<String,String>>();
try {
InputStream in = templetFile.getInputStream();
if(in == null) {
return null;
}
XSSFWorkbook wb = new XSSFWorkbook(in);
XSSFSheet sheet = wb.getSheetAt(sheetNum); //sheet 从0开始
int rowNum = sheet.getLastRowNum() + 1; //取得最后一行的行号
for (int i = startRow; i < rowNum; i++) { //行循环开始
Map<String,String> varpd = new HashMap<String,String>();
XSSFRow row = sheet.getRow(i); //行
int cellNum = row.getLastCellNum(); //每行的最后一个单元格位置
for (int j = startCol; j < cellNum; j++) { //列循环开始
XSSFCell cell = row.getCell(Integer.parseInt(j + ""));
String cellValue = null;
if (null != cell) {
switch (cell.getCellType()) { // 判断excel单元格内容的格式,并对其进行转换,以便插入数据库
case 0:
if(HSSFDateUtil.isCellDateFormatted(cell)){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
cellValue=sdf.format(HSSFDateUtil.getJavaDate(cell.getNumericCellValue())).toString();
} else {
cell.setCellType(1);
cellValue = cell.getStringCellValue();
}
break;
case 1:
cellValue = cell.getStringCellValue();
break;
case 2:
cellValue = cell.getStringCellValue();
//cellValue = cell.getNumericCellValue() + "";
// cellValue = String.valueOf(cell.getDateCellValue());
break;
case 3:
cellValue = "";
break;
case 4:
cellValue = String.valueOf(cell.getBooleanCellValue());
break;
case 5:
cellValue = String.valueOf(cell.getErrorCellValue());
break;
}
} else {
cellValue = "";
}
varpd.put("var"+j, cellValue);
}
varList.add(varpd);
}
} catch (Exception e) {
System.out.println(e);
}
return varList;
}
}