package com.mzl.flower.utils;
|
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
import org.apache.poi.ss.usermodel.*;
|
import org.apache.poi.util.LocaleUtil;
|
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.*;
|
import java.text.SimpleDateFormat;
|
import java.util.*;
|
|
/**
|
* excel读写工具类 */
|
public class POIUtil {
|
private final static String xls = "xls";
|
private final static String xlsx = "xlsx";
|
|
public static SheetContent readExcel(MultipartFile file, int sheetNum) throws IOException{
|
//检查文件
|
checkFile(file);
|
//获得Workbook工作薄对象
|
Workbook workbook = getWorkBook(file);
|
|
return readExcel(workbook, sheetNum);
|
}
|
|
public static SheetContent readExcel(File file, int sheetNum) throws IOException{
|
Workbook workbook = getWorkBook(file);
|
|
return readExcel(workbook, sheetNum);
|
}
|
|
public static SheetContent readExcel(InputStream is, String fileName, int sheetNum) throws IOException{
|
Workbook workbook = getWorkBook(is, fileName);
|
|
return readExcel(workbook, sheetNum);
|
}
|
|
public static SheetContent readExcel(Workbook workbook, int sheetNum) throws IOException{
|
SheetContent sheetContent = null;
|
|
//获得当前sheet工作表
|
Sheet sheet = workbook.getSheetAt(sheetNum);
|
if(sheet == null){
|
return sheetContent;
|
}
|
String sheetName = sheet.getSheetName();
|
List<String[]> list = new ArrayList<>();
|
//获得当前sheet的开始行
|
int firstRowNum = sheet.getFirstRowNum();
|
//获得当前sheet的结束行
|
int lastRowNum = sheet.getLastRowNum();
|
//循环除了第一行的所有行
|
for(int rowNum = firstRowNum; rowNum <= lastRowNum; rowNum++){
|
//获得当前行
|
Row row = sheet.getRow(rowNum);
|
if(row == null){
|
continue;
|
}
|
//获得当前行的开始列
|
int firstCellNum = row.getFirstCellNum();
|
if(firstCellNum == -1){
|
list.add(new String[0]);
|
continue;
|
}
|
//获得当前行的列数
|
int lastCellNum = row.getPhysicalNumberOfCells();
|
String[] cells = new String[row.getPhysicalNumberOfCells()];
|
//循环当前行
|
for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
|
Cell cell = row.getCell(cellNum);
|
cells[cellNum] = getCellValue(cell);
|
}
|
list.add(cells);
|
}
|
|
sheetContent = new SheetContent(sheetName, list);
|
|
return sheetContent;
|
}
|
|
public static List<SheetContent> readExcel(Workbook workbook) throws IOException{
|
//创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回
|
List<SheetContent> list = new ArrayList<>();
|
if(workbook != null){
|
for(int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++){
|
list.add(readExcel(workbook, sheetNum));
|
}
|
}
|
return list;
|
}
|
|
public static void checkFile(MultipartFile file) throws IOException{
|
//判断文件是否存在
|
if(null == file){
|
throw new FileNotFoundException("文件不存在!");
|
}
|
//获得文件名
|
String fileName = file.getOriginalFilename();
|
//判断文件是否是excel文件
|
if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){
|
throw new IOException(fileName + "不是excel文件");
|
}
|
}
|
|
public static Workbook getWorkBook(MultipartFile file) {
|
//获得文件名
|
String fileName = file.getOriginalFilename();
|
//创建Workbook工作薄对象,表示整个excel
|
Workbook workbook = null;
|
try {
|
workbook = getWorkBook(file.getInputStream(), fileName);
|
} catch (IOException e) {
|
}
|
return workbook;
|
}
|
|
public static Workbook getXSSFWorkbook(InputStream is) throws IOException {
|
return new XSSFWorkbook(is);
|
}
|
|
public static Workbook getHSSFWorkbook(InputStream is) throws IOException {
|
return new HSSFWorkbook(is);
|
}
|
|
public static Workbook getWorkBook(File file) {
|
String fileName = file.getName();
|
//创建Workbook工作薄对象,表示整个excel
|
Workbook workbook = null;
|
try {
|
workbook = getWorkBook(new FileInputStream(file), fileName);
|
} catch (IOException e) {
|
}
|
|
return workbook;
|
}
|
|
public static Workbook getWorkBook(InputStream is, String fileName) {
|
Workbook workbook = null;
|
try {
|
//根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象
|
if(fileName.endsWith(xls)){
|
//2003
|
workbook = getHSSFWorkbook(is);
|
}else if(fileName.endsWith(xlsx)){
|
//2007
|
workbook = getXSSFWorkbook(is);
|
}
|
} catch (IOException e) {
|
e.printStackTrace();
|
}
|
return workbook;
|
}
|
|
public static String getCellValue(Cell cell){
|
String cellValue = "";
|
if(cell == null){
|
return cellValue;
|
}
|
int tt = cell.getCellStyle().getDataFormat();
|
//判断数据的类型
|
switch (cell.getCellType()){
|
case NUMERIC: //数字
|
short format = cell.getCellStyle().getDataFormat();
|
SimpleDateFormat sdf = null;
|
if (format == 57) { // 日期
|
sdf = new SimpleDateFormat("yyyy年MM月");
|
}
|
if(sdf != null){
|
try {
|
double value = cell.getNumericCellValue();
|
Date date = DateUtil.getJavaDate(value);
|
cellValue = sdf.format(date);
|
} catch (Exception e) {
|
}
|
}else{
|
cell.setCellType(CellType.STRING);
|
cellValue = String.valueOf(cell.getStringCellValue());
|
}
|
break;
|
case STRING: //字符串
|
cellValue = String.valueOf(cell.getStringCellValue());
|
break;
|
case BOOLEAN: //Boolean
|
cellValue = String.valueOf(cell.getBooleanCellValue());
|
break;
|
case FORMULA: //公式
|
//cellValue = String.valueOf(cell.getCellFormula());
|
try {
|
cellValue = String.valueOf(cell.getNumericCellValue());
|
} catch (IllegalStateException e) {
|
}
|
if(cellValue.length() == 0){
|
try {
|
cellValue = String.valueOf(cell.getStringCellValue());
|
} catch (IllegalStateException e) {
|
}
|
}
|
break;
|
case BLANK: //空值
|
cellValue = "";
|
break;
|
case ERROR: //故障
|
cellValue = "非法字符";
|
break;
|
default:
|
cellValue = "未知类型";
|
break;
|
}
|
return cellValue;
|
}
|
|
public static class SheetContent{
|
private String sheetName;
|
private List<String[]> data;
|
public SheetContent(String sheetName, List<String[]> data){
|
this.sheetName = sheetName;
|
this.data = data;
|
}
|
|
public String getSheetName(){
|
return sheetName;
|
}
|
|
public List<String[]> getData(){
|
return data;
|
}
|
}
|
}
|