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;
}
}
Java:Excel文件上传至后台的更多相关文章
- java实现文件上传下载
喜欢的朋友可以关注下,粉丝也缺. 今天发现已经有很久没有给大家分享一篇技术文章了,于是想了一下给大家分享一篇java实现文件上传下载功能的文章,不喜欢的希望大家勿喷. 想必大家都知道文件的上传前端页面 ...
- java进行文件上传,带进度条
网上看到别人发过的一个java上传的代码,自己写了个完整的,附带源码 项目环境:jkd7.tomcat7. jar包:commons-fileupload-1.2.1.jar.commons-io-1 ...
- Java Web文件上传
参考资料:http://www.cnblogs.com/xdp-gacl/p/4200090.html 一.问题描述 Java Web文件上传需要借助一些第三方库,常用的是借助Apache的包,有两个 ...
- [SAP ABAP开发技术总结]客户端文本文件、Excel文件上传下载
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- [SAP ABAP开发技术总结]文本文件、Excel文件上传下传
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- CentOS下安装配置NFS并通过Java进行文件上传下载
1:安装NFS (1)安装 yum install nfs-utils rpcbind (2)启动rpcbind服务 systemctl restart rpcbind.service 查看服务状态 ...
- Java实现文件上传到服务器(FTP方式)
Java实现文件上传到服务器(FTP方式) 1,jar包:commons-net-3.3.jar 2,实现代码: //FTP传输到数据库服务器 private boolean uploadServer ...
- Java Web文件上传原理分析(不借助开源fileupload上传jar包)
Java Web文件上传原理分析(不借助开源fileupload上传jar包) 博客分类: Java Web 最近在面试IBM时,面试官突然问到:如果让你自己实现一个文件上传,你的代码要如何写,不 ...
- Java超大文件上传解决办法
这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...
随机推荐
- 深入Java线程管理(三):线程同步
一. 引入同步: 有一个很经典的案例,即银行取款问题.我们可以先看下银行取款的基本流程: 1)用户输入账户.密码,系统判断用户的账户.密码是否匹配. 2)用户输入取款金额. 3)系统判断账户金额是否大 ...
- Vue的路由Router之导航钩子和元数据及匹配
一.文件结构 二.vue.js 打开此链接 https://cdn.bootcss.com/vue/2.6.10/vue.js 复制粘贴页面的所有内容 三.vue-router.js 打开此链接 h ...
- [C++] WinAES的问题
WinAES是个不错的windows CAPI封装. 如果C++程序需要和java的程序进行aes加解密通讯,那么WinAES的代码是有问题的. java的aes代码缺省不会设置IV而且采用ECB模式 ...
- Python--day41--条件
1,条件 #锁 #acquire release#一个条件被创建之初 默认有一个False状态#False状态 会影响wait一直处于等待状态#notify(int数据类型) 造钥匙 代码示例:条件. ...
- C# AddRange 添加位置
有没人想知道, AddRange 添加位置 是哪? 是添加到数组的开始,还是数组的末尾? 假如有一个 代码,看起来是下面的,很简单,把一个 list b 放进list a List<int> ...
- 如何在 centos 7.3 上安装 caffe 深度学习工具
有好多朋友在安装 caffe 时遇到不少问题.(看文章的朋友希望关心一下我的创业项目趣智思成) 今天测试并整理一下安装过程.我是在阿里云上测试,选择centos 7.3 镜像. 先安装 epel 源 ...
- H3C VLAN配置示例
- 2018.12.7 浪在ACM 集训队第八次测试赛
2018.12.7 浪在ACM 集训队第八次测试赛 https://blog.csdn.net/QLU_minoz/article/details/84886717 感谢苗学林同学C题和D题题解 ...
- 【t044】弗洛伊德
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 弗洛伊德是一个大牛!给一个有向图G,他有n个结点,现在请你求出对于他的每一对结点(x,y),从x出发走 ...
- Linux 内核注册一个 USB 驱动
所有 USB 驱动必须创建的主要结构是 struct usb_driver. 这个结构必须被 USB 驱动填 充并且包含多个函数回调和变量, 来向 USB 核心代码描述 USB 驱动: struct ...