Java:Excel文件上傳至后台


之前的項目中有遇到上傳Excel文件的需求,簡單說就是解析一個固定格式的Excel表格,然后存到數據庫對應的表中,表格如下:

 

 

項目采用SSM架構,mvc模式,顯而易見,這個Excel表需要拆成兩個表,分別存入數據庫中,這種表會解析,那其他的應該就難不倒我們了。我自己寫的java后台的相關解析代碼如下。

注意Excel文件中每個單元格的格式要准確,否則可能解析錯誤,如果有更加簡潔的方案,歡迎大家在留言評論區,相互學習,共同進步!

依賴文件主要是ExcelUtil,其他的直接用maven導入就好,ExcelUtil的路徑:https://i.cnblogs.com/Files.aspx

package com.yuandi.car.platform.controller;

import java.io.ByteArrayInputStream;
import java.math.BigDecimal;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

import org.apache.commons.lang.time.DateUtils;
import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
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.ss.usermodel.WorkbookFactory;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import com.yuandi.car.common.bean.RestDataResult;
import com.yuandi.car.common.enums.ResponseEnum;
import com.yuandi.car.common.exception.ServiceException;
import com.yuandi.car.common.util.ExcelUtils;
import com.yuandi.car.common.util.UUIDutil;
import com.yuandi.car.platform.service.IManufactService;
import io.swagger.annotations.Api;
import java.util.UUID;

import com.yuandi.car.platform.dao.model.T301_merchant;
import com.yuandi.car.platform.dao.model.T701_car_order;
import com.yuandi.car.platform.dao.model.T701_car_order_ext;


@Controller
@RequestMapping("/order")
@Api(value = "order接口")
public class OrderController extends BaseController {

	private static Logger logger = LoggerFactory.getLogger(OrderController.class);
	
	@Autowired
	private IManufactService manufactService;
	
	@RequestMapping(value = "/uploadDeal", method = RequestMethod.POST)
	@ResponseBody
	public RestDataResult uploadDeal(@RequestParam("file") MultipartFile file) {
		RestDataResult result = new RestDataResult();
		try {
			if (validToken()) {
				String contentType = file.getContentType();
				String fileName = file.getOriginalFilename();				
				Workbook wb = WorkbookFactory.create(new ByteArrayInputStream(file.getBytes()));
				Sheet sheet = wb.getSheetAt(0);
				Row row = null;
				
				FormulaEvaluator formulaEvaluator = null;
				if (fileName.endsWith("xlsx")) {
		            formulaEvaluator = new XSSFFormulaEvaluator((XSSFWorkbook) wb);
		        } else {
		            formulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook) wb);
		        }
				T701_car_order order = new T701_car_order();
				String orderid  = UUIDutil.getUUID();
				order.setOrderid(orderid);
				//manufactService.addcarOrder(order);
				String ownerEntity  = null;
				String mertPhone  = null;
				boolean flag = false;
				for (int i = 1; i < 6; i++) { //i < sheet.getLastRowNum() - 0 + 1;
					row = sheet.getRow(i);
					if (null == row) {
						continue;
					}
					
					switch (i) {
					case 1:
						for (Cell c : row) {//循環單行的每一個空格
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
					
								order.setOwnerentity(value);
								ownerEntity = value;
								System.out.println("經銷商法人姓名:" + value);
							} else if (c.getColumnIndex() == 5) {
								order.setMerchantphone(value);
								mertPhone  = value;
								System.out.println("聯系電話:" + value);
							}
						}
						break;
					case 2:
						for (Cell c : row) {
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {

								order.setManagername(value);
								System.out.println("公司分管經理:" + value);
							} else if (c.getColumnIndex() == 5) { 
								order.setManagerphone(value);
								System.out.println("聯系電話:" + value);
							}
						}
						break;
					case 3:
						for (Cell c : row) {
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
								order.setMerchantname(value);
								System.out.println("經銷商全稱:" + value);
							} else if (c.getColumnIndex() == 5) { 
								order.setAddress(value);
								System.out.println("收貨地址:" + value);
							}
						}
						break;
					case 4:
						for (Cell c : row) {
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
								
								Double f = Double.valueOf(value);
								Integer intvalue = (int)Math.ceil(f);
								order.setCapacity(intvalue);
								System.out.println("經銷商庫容:" + intvalue);
							} else if (c.getColumnIndex() == 5) { 
								
								Date expDate = ExcelUtils.stringToNormalDate(value);
								order.setExptime(expDate);
								System.out.println("期望發貨時間:" + expDate);
							}
						}
						break;
					case 5:
						for (Cell c : row) {
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
								order.setMonopolize(value);
								System.out.println("經銷商品牌經營:" + value);
							} 
							else if (c.getColumnIndex() == 5) { 
								order.setBrandnumber(value);
								System.out.println("品牌經營數量:" + value);
							}
						}
						break;
					}
					
				}
				for (int i = sheet.getLastRowNum() - 3 + 1; i < sheet.getLastRowNum() - 0 + 1; i++) { //i < sheet.getLastRowNum() - 0 + 1;
					row = sheet.getRow(i);
					if (null == row) {
						continue;
					}
					
					switch (i - sheet.getLastRowNum()-1) {
					case -3:
						for (Cell c : row) {
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
								// TODO 
								//Integer intvalue = Integer.parseInt(value);
								Double f = Double.valueOf(value);
								Integer intvalue = (int)Math.ceil(f);
								order.setTotal(intvalue);
								System.out.println("合計:" + value + " 輛");
							} else if (c.getColumnIndex() == 5) {
								//Long f = Long.valueOf(value);Long f = Long.parseLong(value);
								BigDecimal bd=new BigDecimal(value);

								order.setTotalprice(bd);
								System.out.println("總價:" + value + " 元");
							} 
						}
						break;	
					
					case -2:
						for (Cell c : row) {
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
								// TODO 
								order.setOrganizername(value);
								System.out.println("編制人姓名:" + value);
							} else if (c.getColumnIndex() == 4) {
								order.setOrganizerphone(value);
								System.out.println("編制人電話:" + value);
							} else if (c.getColumnIndex() == 6) { 
								Date subTime = ExcelUtils.stringToNormalDate(value);
								order.setSubmittime(subTime);
								System.out.println("訂單提報時間:" + subTime);
							}
						}
						break;	
					case -1:
						for (Cell c : row) {//循環單行的每一個空格
							String value = null;
							boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
							// 判斷是否具有合並單元格
							if (isMerge) {
								value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
							} else {
								value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
							}
							
							if (c.getColumnIndex() == 2) {
								order.setRegulatorname(value);
								System.out.println("接收人姓名:" + value);
							} else if (c.getColumnIndex() == 4) {
								order.setRegulatorphone(value);
								System.out.println("接收人電話:" + value);
							} else if (c.getColumnIndex() == 6) { 
								Date receiveTime = ExcelUtils.stringToNormalDate(value);
								order.setReceivetime(receiveTime);
								System.out.println("訂單接收確認時間:" + receiveTime);
							}
						}
						break;
					}
					
				}
				if(ownerEntity.isEmpty()||mertPhone.isEmpty()){
					result.setRespcode(ResponseEnum.PARAM_NULL.getCode());
					result.setMessage(ResponseEnum.PARAM_NULL.getMessage());
				}else{
					T301_merchant merchant = manufactService.qryMerchantByOwnerPhone(ownerEntity, mertPhone);
					Date now = new Date();
					order.setManufactid(merchant.getEntityid());
					order.setName(merchant.getEntityname());
					order.setMerchantid(merchant.getMerchantid());
					order.setCreatetime(now);
					
					manufactService.addcarOrder(order);
					flag = true;
				}
				//以下內容添加到擴展表
				for (int i = 7; i < sheet.getLastRowNum() - 3 + 1; i++) { 
					row = sheet.getRow(i);
					if (null == row) {
						continue;
					}
					T701_car_order_ext orext = new T701_car_order_ext();
					orext.setOrderid(orderid);
					for (Cell c : row) {
						String value = null;
						boolean isMerge = ExcelUtils.isMergedRegion(sheet, i, c.getColumnIndex());	
						// 判斷是否具有合並單元格
						if (isMerge) {
							value = ExcelUtils.getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
						} else {
							value = ExcelUtils.getCellValueFormula(c, formulaEvaluator);
						}
						
						if (c.getColumnIndex() == 2) {
							orext.setModel(value);
						} else if (c.getColumnIndex() == 3) {
							orext.setVersion(value);
						} else if (c.getColumnIndex() == 4) {
							Double f = Double.valueOf(value);
							Integer intvalue = (int)Math.ceil(f);
							orext.setTotal(intvalue);
							System.out.println("數量:" + value + " 輛");
						} else if (c.getColumnIndex() == 5) {
							BigDecimal bd=new BigDecimal(value);
							orext.setUnitprice(bd);
							System.out.println("單價:" + bd + " 元");
						} else if (c.getColumnIndex() == 6) {
							//Long f = Long.valueOf(value);Long f = Long.parseLong(value);
							BigDecimal bd=new BigDecimal(value);
							orext.setTotalprice(bd);
							System.out.println("金額:" + value + " 元");
						} else if (c.getColumnIndex() == 7) {
							orext.setProperty(value);
							System.out.println("屬性:" + value);
						} 
					}
					if(flag){
						manufactService.addcarOrderExt(orext);
						
					}else{
						result.setRespcode(ResponseEnum.PARAM_NULL.getCode());
						result.setMessage(ResponseEnum.PARAM_NULL.getMessage());	
					}		
				}
				
				setSucc(result);
			} else {
				setInvalidToken(result);
			}
		} catch (ServiceException e) {
			result.setCodeMessage(e.getErrorCode(), e.getMessage());
		} catch (Exception e) {
			logger.error("", e);
			result.setRespcode(ResponseEnum.SYS_ERROR.getCode());
			result.setMessage(ResponseEnum.SYS_ERROR.getMessage());
		}
		return result;
	}
}  


免責聲明!

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



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