得到上傳的MultipartFile 文件轉換成FileInputStream ,將輸入流傳入importExcelX解析返回List,然後遍歷插入數據庫。
ExportDataController.java
@RequestMapping(value = "ImportExcelProduct.do",method = RequestMethod.POST)
public String ImportExcelProduct(@RequestParam("files") MultipartFile file){
BasicProductMsg basicProductMsg = new BasicProductMsg();
String fileName =file.getOriginalFilename() ;
String returnStr = StringUtil.RETURN_ERROR_DATA_FORMAT;//這個是一個返回提示內容:上傳格式錯誤!
//文件不爲空並且後綴等於xlsx就將上傳的文件寫入臨時的文件夾中
if (!file.isEmpty() && fileName.endsWith(".xlsx")) {
try {
//得到文件的輸入流
FileInputStream fis = (FileInputStream) file.getInputStream();
//解析Excel後得到的 List集合
List<Object> list = ImportExcelUtil.importExcelX(fis, basicProductMsg);
for (Object objects : list) {
BasicProductMsg bpmo = (BasicProductMsg) objects;
//判斷新增的記錄數據表是否已經包含
if(basicProductMsgService.DetctBasicProductMsg(bpmo).size()!= 0){
continue;
}
basicProductMsgService.addBasicProductMsg(StringUtil.objectToMap(objects));
}
//關閉輸入流
fis.close();
returnStr = "Data import success";
} catch (Exception e) {
e.printStackTrace();
returnStr = "Data import failure";
}
}
return StringUtil.returnPopover(returnStr,"/mainMate/productInform?a");
}
ImportExxcelUtil.java
import java.io.FileInputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.alibaba.fastjson.JSON;
import com.sd.xm003.model.User;
/**
* 導入Excel表格的工具類
*/
public class ImportExcelUtil {
/**
* POI:解析Excel文件中的數據並把每行數據封裝成一個實體
* @param filePath 文件絕對路徑
* @return List<Object> Excel中數據封裝實體的集合
*/
public static List<Object> importExcelX(FileInputStream fis,Object object){
List<Object> objects =new ArrayList<Object>();
Workbook wookbook = null;
Cell cell = null;
String json ="";
//FileInputStream fis =null;
//創建Excel工作簿
try {
//得到文件輸入流對象
//fis = new FileInputStream(filePath);
//2007版本的excel,用.xlsx結尾
wookbook = new XSSFWorkbook(fis);//得到工作簿
fis.close();
} catch (IOException e1) {
e1.printStackTrace();
}
//得到第一個工作表
Sheet sheet = wookbook.getSheetAt(0);
//獲得表頭
Row rowHead = sheet.getRow(0);
//得到表頭列數
int heads =rowHead.getPhysicalNumberOfCells();
String[] headers = new String[heads];//表頭
//遍歷表頭存放在數組中
for(int i =0; i<heads; i++){
cell =rowHead.getCell(i);
headers[i] =cell.getStringCellValue();
}
//獲得數據的總行數
int totalRowNum = sheet.getLastRowNum();
//遍歷表格數據,生成對應
for (int i = 1; i <= totalRowNum; i++) {
Row rowDate =sheet.getRow(i);
for(int j = 0; j<heads; j++){
cell =rowDate.getCell(j);
String value =getCellValue(cell);
//String value =cell.getStringCellValue();
String head =headers [j];
if(j !=heads-1){
json = json+"\""+head+"\""+":"+"\""+value+"\""+",";
}
if(j ==heads-1){
json = json+"\""+head+"\""+":"+"\""+value+"\"";
}
}
//生成單個json數據
json = "{"+json+"}";
object = JSON.parseObject(json,object.getClass());
objects.add(object);
json ="";
}
return objects;
}
//判斷從Excel文件中解析出來數據的格式
private static String getCellValue(Cell cell){
String value = null;
//日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
if(cell == null || cell.equals("") || cell.getCellType() ==HSSFCell.CELL_TYPE_BLANK){
value = null;
return value;
}
//簡單的查檢列類型
switch(cell.getCellType())
{
case Cell.CELL_TYPE_STRING://字符串
value = cell.getRichStringCellValue().getString();
value = StringUtil.convertNull(value);
break;
case Cell.CELL_TYPE_NUMERIC://數字
//判斷是否是日期類型
if(DateUtil.isCellDateFormatted(cell)){
Date date =cell.getDateCellValue();
//格式化日期類型
value = sdf.format(date);//.toString();
break;
}
long dd = (long)cell.getNumericCellValue();
value = dd+"";
break;
case Cell.CELL_TYPE_BLANK:
value = "";
break;
case Cell.CELL_TYPE_FORMULA:
value = String.valueOf(cell.getCellFormula());
break;
case Cell.CELL_TYPE_BOOLEAN://boolean型值
value = String.valueOf(cell.getBooleanCellValue());
break;
case Cell.CELL_TYPE_ERROR:
value = String.valueOf(cell.getErrorCellValue());
break;
default:
break;
}
return value;
}
public static void main(String[] args) {
User user =new User();
String filePath ="D:\\123.xlsx";
List<Object> objects =importExcelX(filePath,user);
List<User> users =new ArrayList<User>();
for (Object object : objects) {
users.add((User)object);
}
for (User user2 : users) {
System.out.println(user2.toString());
}
}
}
實體類
import java.util.Date;
public class BasicProductMsg {
private Integer id;
private String productNo;
private String productName;
private String figureNo;
private String model;
private String unit;
private String venderFigureNo;
private String customer;
private String remarks;
private String companyFlag;
private String operator;
private String operatingTime;
private String flag;
private Integer minStock;
private Integer maxStock;
private Integer unitPackageNumber;
private Integer number;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getProductNo() {
return productNo;
}
public void setProductNo(String productNo) {
this.productNo = productNo == null ? null : productNo.trim();
}
public String getProductName() {
return productName;
}
public void setProductName(String productName) {
this.productName = productName == null ? null : productName.trim();
}
public String getFigureNo() {
return figureNo;
}
public void setFigureNo(String figureNo) {
this.figureNo = figureNo == null ? null : figureNo.trim();
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model == null ? null : model.trim();
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit == null ? null : unit.trim();
}
public String getVenderFigureNo() {
return venderFigureNo;
}
public void setVenderFigureNo(String venderFigureNo) {
this.venderFigureNo = venderFigureNo == null ? null : venderFigureNo.trim();
}
public String getCustomer() {
return customer;
}
public void setCustomer(String customer) {
this.customer = customer == null ? null : customer.trim();
}
public String getRemarks() {
return remarks;
}
public void setRemarks(String remarks) {
this.remarks = remarks == null ? null : remarks.trim();
}
public String getCompanyFlag() {
return companyFlag;
}
public void setCompanyFlag(String companyFlag) {
this.companyFlag = companyFlag == null ? null : companyFlag.trim();
}
public String getOperator() {
return operator;
}
public void setOperator(String operator) {
this.operator = operator == null ? null : operator.trim();
}
public String getOperatingTime() {
return operatingTime;
}
public void setOperatingTime(String operatingTime) {
this.operatingTime = operatingTime;
}
public String getFlag() {
return flag;
}
public void setFlag(String flag) {
this.flag = flag == null ? null : flag.trim();
}
public Integer getMinStock() {
return minStock;
}
public void setMinStock(Integer minStock) {
this.minStock = minStock;
}
public Integer getMaxStock() {
return maxStock;
}
public void setMaxStock(Integer maxStock) {
this.maxStock = maxStock;
}
@Override
public String toString() {
return "BasicProductMsg{" +
"id=" + id +
", productNo='" + productNo + '\'' +
", productName='" + productName + '\'' +
", figureNo='" + figureNo + '\'' +
", model='" + model + '\'' +
", unit='" + unit + '\'' +
", venderFigureNo='" + venderFigureNo + '\'' +
", customer='" + customer + '\'' +
", remarks='" + remarks + '\'' +
", companyFlag='" + companyFlag + '\'' +
", operator='" + operator + '\'' +
", operatingTime='" + operatingTime + '\'' +
", flag='" + flag + '\'' +
", minStock=" + minStock +
", maxStock=" + maxStock +
'}';
}
public Integer getUnitPackageNumber() {
return unitPackageNumber;
}
public void setUnitPackageNumber(Integer unitPackageNumber) {
this.unitPackageNumber = unitPackageNumber;
}
public Integer getNumber() {
return number;
}
public void setNumber(Integer number) {
this.number = number;
}
}
導入的文件列頭要和實體類一樣,如果要列頭是中文在就在幫助類58行下面寫一個判斷如果 headers[j] =“蘋果”,name head = "apple"