Springboot 上傳excel並解析文件內容


最近在做一個物業的系統,需要通過excel上傳業主的信息,解析並入庫。

參考:https://www.cnblogs.com/jyyjava/p/8074322.html

話不多說,直接上核心代碼


import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;

/**
* author
* <p>
* create 2019-01-21 15:57
* <p>
* desc
**/
@Component
public class ExcelUtil {

/**
* 標題樣式
*/
private final static String STYLE_HEADER = "header";
/**
* 表頭樣式
*/
private final static String STYLE_TITLE = "title";
/**
* 數據樣式
*/
private final static String STYLE_DATA = "data";

/**
* 存儲樣式
*/
private static final HashMap<String, CellStyle> cellStyleMap = new HashMap<>();

  //解析 excel
public static List readExcel(HttpServletRequest request) throws IOException {
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

MultipartFile file = multipartRequest.getFile("filename");

// String[] IMAGE_TYPE = "xlsx,xls".split(",");
// String path = null;
// boolean flag = false;
// for (String type : IMAGE_TYPE) {
// if (StringUtils.endsWithIgnoreCase(file.getOriginalFilename(), type)) {
// flag = true;
// break;
// }
// }


Workbook wb = null;

/*MultipartFile轉換File*/
File f = null;
if(file.equals("")||file.getSize()<=0){
file = null;
}else {
InputStream ins =file.getInputStream();
f = new File( file.getOriginalFilename() );
FileUtil.inputStreamToFile( ins, f );
}

// 獲得文件名稱
String fileName = f.getName();
// 獲得后綴
String extName = fileName.substring(fileName.indexOf("."));
// 根據后綴名稱判斷excel的版本

if (ExcelVersion.V2003.getSuffix().equals(extName)) {
wb = new HSSFWorkbook(new FileInputStream(f));

} else if (ExcelVersion.V2007.getSuffix().equals(extName)) {
wb = new XSSFWorkbook(new FileInputStream(f));

} else {
// 無效后綴名稱,這里之能保證excel的后綴名稱,不能保證文件類型正確,不過沒關系,在創建Workbook的時候會校驗文件格式
throw new IllegalArgumentException("Invalid excel version");
}
// 開始讀取數據
List<ExcelSheetPO> sheetPOs = new ArrayList<>();
// 解析sheet
for (int i = 0; i < wb.getNumberOfSheets(); i++) {
Sheet sheet = wb.getSheetAt(i);
List<List<Object>> dataList = new ArrayList<>();
ExcelSheetPO sheetPO = new ExcelSheetPO();
sheetPO.setSheetName(sheet.getSheetName());
sheetPO.setDataList(dataList);
int readRowCount = 0;
readRowCount = sheet.getPhysicalNumberOfRows();

// 解析sheet 的行
for (int j = sheet.getFirstRowNum(); j < readRowCount; j++) {
Row row = sheet.getRow(j);
if (row == null) {
continue;
}
if (row.getFirstCellNum() < 0) {
continue;
}
int readColumnCount = 0;

readColumnCount = (int) row.getLastCellNum();

List<Object> rowValue = new LinkedList<Object>();
// 解析sheet 的列
for (int k = 0; k < readColumnCount; k++) {
Cell cell = row.getCell(k);
rowValue.add(getCellValue(wb, cell));
}
dataList.add(rowValue);
}
sheetPOs.add(sheetPO);
}
return sheetPOs;
}

private static Object getCellValue(Workbook wb, Cell cell) {
Object columnValue = null;
if (cell != null) {
DecimalFormat df = new DecimalFormat("0");// 格式化 number
// String
// 字符
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 格式化日期字符串
DecimalFormat nf = new DecimalFormat("0.00");// 格式化數字
switch (cell.getCellType()) {
case Cell.CELL_TYPE_STRING:
columnValue = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_NUMERIC:
if ("@".equals(cell.getCellStyle().getDataFormatString())) {
columnValue = df.format(cell.getNumericCellValue());
} else if ("General".equals(cell.getCellStyle().getDataFormatString())) {
columnValue = nf.format(cell.getNumericCellValue());
} else {
columnValue = sdf.format( HSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
}
break;
case Cell.CELL_TYPE_BOOLEAN:
columnValue = cell.getBooleanCellValue();
break;
case Cell.CELL_TYPE_BLANK:
columnValue = "";
break;
case Cell.CELL_TYPE_FORMULA:
// 格式單元格
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
evaluator.evaluateFormulaCell(cell);
CellValue cellValue = evaluator.evaluate(cell);
columnValue = cellValue.getNumberValue();
break;
default:
columnValue = cell.toString();
}
}
return columnValue;
}
}


/**
* author
* <p>
* create 2019-01-21 16:00
* <p>
* desc Excel版本枚舉
**/
public enum ExcelVersion {
/**
* 雖然V2007版本支持最大支持1048575 * 16383 ,
* V2003版支持65535*255
* 但是在實際應用中如果使用如此龐大的對象集合會導致內存溢出,
* 因此這里限制最大為10000*100,如果還要加大建議先通過單元測試進行性能測試。
* 1000*100 全部導出預計時間為27s左右
*/
V2003(".xls", 10000, 100), V2007(".xlsx", 100, 100);

private String suffix;

private int maxRow;

private int maxColumn;

ExcelVersion(String suffix, int maxRow, int maxColumn) {
this.suffix = suffix;
this.maxRow = maxRow;
this.maxColumn = maxColumn;
}

public String getSuffix() {
return this.suffix;
}

public int getMaxRow() {
return maxRow;
}

public void setMaxRow(int maxRow) {
this.maxRow = maxRow;
}

public int getMaxColumn() {
return maxColumn;
}

public void setMaxColumn(int maxColumn) {
this.maxColumn = maxColumn;
}

public void setSuffix(String suffix) {
this.suffix = suffix;
}
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM