导入excel内容

摘要:

MultipartFile工具类:

  1. MultipartFile是SpringMVC提供简化上传操作的工具类。
  2. 在不使用框架之前,都是使用原生的HttpServletRequest来接收上传的数据,文件是以二进制流传递到后端的,然后需要我们自己转换为File类,非常麻烦。使用了MultipartFile工具类之后,我们对文件上传的操作就简便许多了。
  3. 以下是MultipartFile工具类全部的接口方法。
方法名返回值作用
getContentType()String在取文件MIME类型
getlnputStream()InputStream获取文件流
getName()String获取 form 表单中文件组件的名字
getOriginalFilename()String获取上传文件件的原名
getSize()long获取文件的大小,单位为byte
isEmpty()boolean是否为空
transferTo(File dest)void将数据保存到一个目标文件中

1.定义一个枚举类 

用来遍历excel每一列

package com.amarsoft.lease.commerce.constant;public enum CmceWarrantyInfoColumnEnum {LEASEHOLD_NO(0, "租赁物编号", "leaseholdNo"),INSURANCE_COMPANY(1, "保险公司", "insuranceCompany"),SLIP_NO(2, "保单号", "slipNo"),INSURE_START_DATE(3, "保险起始日", "insureStartDate"),INSURE_END_DATE(4, "保险到期日", "insureEndDate"),IS_SURRENDER(5, "是否为退保单", "isSurrender");private int columnNum;private String columnName;private String columnKey;CmceWarrantyInfoColumnEnum(int columnNum, String columnName, String columnKey) {this.columnNum = columnNum;this.columnName = columnName;this.columnKey = columnKey;}public int getColumnNum() {return columnNum;}public void setColumnNum(int columnNum) {this.columnNum = columnNum;}public String getColumnName() {return columnName;}public void setColumnName(String columnName) {this.columnName = columnName;}public String getColumnKey() {return columnKey;}public void setColumnKey(String columnKey) {this.columnKey = columnKey;}/*** 获取列名* @param columnNum* @return*/public static CmceWarrantyInfoColumnEnum getByColumnNum(int columnNum) {CmceWarrantyInfoColumnEnum[] columnEnums = CmceWarrantyInfoColumnEnum.values();for (CmceWarrantyInfoColumnEnum columnEnum : columnEnums) {if(columnEnum.getColumnNum() == columnNum) return columnEnum;}return null;}
}

2.定义接口

2.1:如果接入的接口是HttpServletRequest 

  1. // 转型为MultipartHttpRequest:   
  2.         MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;  
  3.         // 获得文件:   
  4.         MultipartFile file = multipartRequest.getFile(" file ");   
  5.         // 获得文件名:   
  6.         String filename = file.getOriginalFilename();   
  7.         // 获得输入流:   
  8.         InputStream input = file.getInputStream();   
  9.         // 写入文件   
  10.         File source = new File(localfileName.toString());   
  11.         multipartFile.transferTo(source);  

2.2:直接使用  MultipartHttpServletRequest

@PostMapping("/uploadInsureInfo")@Transactionalpublic ResultResponse<T> uploadInsureInfo(MultipartHttpServletRequest request) {List<MultipartFile> files = request.getFiles("file");MultipartFile file = null;InputStream inputStream = null;Date date = new Date();for (int i = 0; i < files.size(); i++) {file = files.get(i);if (!file.isEmpty()) {try {inputStream = file.getInputStream();//路劲Workbook workbook = ExcelUtils.openWorkbook(inputStream);Sheet sheet = workbook.cloneSheet(0);Row firstRow = sheet.getRow(0);//获取每一行的结果if (Objects.isNull(firstRow)) {return ResultResponse.error("导入数据为空或模板不正确, 请检查文件重新上传");}//获取总行数、总列数int rowSum = sheet.getLastRowNum() + 1;int columnSum = firstRow.getLastCellNum() + 1;//校验列名是否正确for (int k = 0; k < 6; k++) {Cell name = firstRow.getCell(k);ValueObject nameValueObject = Objects.isNull(name) ? ValueObject.valueOf(null) : new ValueObject(ExcelCellHelper.getCellValue(name));String strName = nameValueObject.strValue();if (strName.endsWith("*")) {strName = strName.substring(0, strName.length() - 1);}if (!Objects.requireNonNull(CmceWarrantyInfoColumnEnum.getByColumnNum(k)).getColumnName().equals(strName)) {return ResultResponse.error("导入数据为空或模板不正确, 请检查文件重新上传");}}//校验每一行结果是否正确a:for (int i1 = 1; i1 < rowSum; i1++) {/*** getRow 获取行     getCell  获取列*/Row currentRow = sheet.getRow(i1);if (Objects.isNull(currentRow)) continue;CmceWarrantyInfoPO cmceWarrantyInfoPO = new CmceWarrantyInfoPO();//创建每一行落库的保单数据Map<String, Object> cellColumnMap = new HashedMap();//用来存储遍历每一个字段的值for (int j = 0; j < columnSum; j++) {CmceWarrantyInfoColumnEnum templateColumnEnum = CmceWarrantyInfoColumnEnum.getByColumnNum(j);if (Objects.isNull(templateColumnEnum)) continue;Cell cell = currentRow.getCell(j);//每列每行内容值ValueObject cellValueObject = Objects.isNull(cell) ? ValueObject.valueOf(null) : new ValueObject(ExcelCellHelper.getCellValue(cell));String cellValueStr = StringUtils.isNotBlank(cellValueObject.strValue()) ? cellValueObject.strValue().trim() : null;//校验有无数据*   firstRow(第一行结果)Cell name = firstRow.getCell(j);ValueObject nameValueObject = Objects.isNull(name) ? ValueObject.valueOf(null) : new ValueObject(ExcelCellHelper.getCellValue(name));String strName = nameValueObject.strValue();if (strName.endsWith("*") && StringUtils.isBlank(cellValueStr) && !"是否为退保单*".equals(strName)) {return ResultResponse.error("第【"+i1+1+"】行,【"+strName+"】未录入!");}if (Objects.isNull(cellValueObject) && j == 0) continue a;//每一列每一行的数据对应保存SimpleDateFormat sip = new SimpleDateFormat("yyyy-MM-dd");switch (templateColumnEnum){case LEASEHOLD_NO:if (StringUtils.isBlank(cellValueStr)) continue;String sql = "SELECT *  FROM ARTL_LEASEHOLD AL \n" +"inner join PROJ_RELATION PR on PR.PROJECT_RELA_ID = AL.LEASEHOLD_ID\n" +"left join proj_project pp on PR.PROJECT_APPLY_ID = PP.PROJECT_APPLY_ID \n" +"WHERE  al.LEASEHOLD_NO =:leaseholdNo  AND al.EFFECT_STATUS ='Y' AND al.IS_VALID = 'Y' \n" +"AND pp.PROJECT_STATUS in('630_setting','635_settlewaitsign','640_settlesigning','645_settletowrite','650_settled')";Integer count = dataAccessor.selectCount(sql, "leaseholdNo", cellValueStr);if(count>0){cellColumnMap.put(templateColumnEnum.getColumnKey(),cellValueStr);}else{return ResultResponse.error("第【"+i1+1+"】行,租赁物编号无法匹配!");}break;case INSURANCE_COMPANY:if (StringUtils.isBlank(cellValueStr)) continue;cellColumnMap.put(templateColumnEnum.getColumnKey(),cellValueStr);//保险公司break;case SLIP_NO:if (StringUtils.isBlank(cellValueStr)) continue;cellColumnMap.put(templateColumnEnum.getColumnKey(), cellValueObject.strValue());break;case INSURE_START_DATE:if (StringUtils.isBlank(cellValueStr)) continue;Date parse = sip.parse(cellValueStr);cellColumnMap.put(templateColumnEnum.getColumnKey(), parse);break;case INSURE_END_DATE:if (StringUtils.isBlank(cellValueStr)) continue;Date parse2 = sip.parse(cellValueStr);cellColumnMap.put(templateColumnEnum.getColumnKey(), parse2);break;case IS_SURRENDER:if (StringUtils.isBlank(cellValueStr)) continue;cellColumnMap.put(templateColumnEnum.getColumnKey(),cellValueStr);break;default:continue;}}if(cellColumnMap.size()>0 && cellColumnMap!=null){BeanKit.copyProperties(cellColumnMap,cmceWarrantyInfoPO);String leaseholdNo = cellColumnMap.get("leaseholdNo").toString();String projectId = dataAccessor.selectOne(String.class, "SELECT pp.PROJECT_ID FROM ARTL_LEASEHOLD al \n" +"LEFT JOIN PROJ_RELATION PR ON PR.PROJECT_RELA_ID = AL.LEASEHOLD_ID\n" +"LEFT JOIN PROJ_PROJECT PP ON PP.PROJECT_APPLY_ID = PR.PROJECT_APPLY_ID\n" +"WHERE al.LEASEHOLD_NO =:leaseholdNo  AND al.EFFECT_STATUS ='Y' AND pp.PROJECT_EFFECT_STATUS = 'Y' AND al.IS_VALID = 'Y'", "leaseholdNo", leaseholdNo);cmceWarrantyInfoPO.setProjectId(projectId);//是否退保单String isSurrender = Objects.isNull(cellColumnMap.get("isSurrender"))? "N":cellColumnMap.get("isSurrender").toString();cmceWarrantyInfoPO.setIsSurrender(isSurrender);dataAccessor.save(cmceWarrantyInfoPO);//险到期日>当前日期的租赁物的投保状态更新为“已投保”boolean after = DateKit.isAfter(date, cmceWarrantyInfoPO.getInsureEndDate());if(after){String sql ="SELECT ci.*  FROM PROJ_PROJECT PP \n" +"LEFT JOIN CMCE_INSURE ci  ON PP.PROJECT_ID = ci.PROJECT_ID AND  ci.PROJECT_APPLY_ID=pp.PROJECT_APPLY_ID \n" +"WHERE pp.PROJECT_EFFECT_STATUS = 'Y'\n" +"AND ci.PROJECT_ID =:projectId";List<CmceInsurePO> cmceInsurePOS = dataAccessor.selectList(CmceInsurePO.class, sql, "projectId", projectId);cmceInsurePOS.stream().forEach(cmceInsurePO -> {cmceInsurePO.setInsureStatus("finishInsure");dataAccessor.update(cmceInsurePO);});}cellColumnMap.clear();}}} catch (Exception e) {return ResultResponse.error("系统异常"+e.getMessage());} finally {IOKit.close(inputStream);}}}return ResultResponse.success("导入成功");}

3.文件下载

@RestController
@Slf4j
public class FileController {@GetMapping("/download")public String downloadFile(HttpServletRequest request, HttpServletResponse response) {String fileName = "boss.jpg";// 文件名if (fileName != null) {//设置文件路径File file = new File("f:/upload/boss.jpg");//File file = new File(realPath , fileName);if (file.exists()) {response.setContentType("application/force-download");// 设置强制下载不打开response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名byte[] buffer = new byte[1024];FileInputStream fis = null;BufferedInputStream bis = null;try {fis = new FileInputStream(file);bis = new BufferedInputStream(fis);OutputStream os = response.getOutputStream();int i = bis.read(buffer);while (i != -1) {os.write(buffer, 0, i);i = bis.read(buffer);}return "下载成功";} catch (Exception e) {e.printStackTrace();} finally {if (bis != null) {try {bis.close();} catch (IOException e) {e.printStackTrace();}}if (fis != null) {try {fis.close();} catch (IOException e) {e.printStackTrace();}}}}}return "下载失败";}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/791446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android音视频开发 - MediaMetadataRetriever 相关

Android音视频开发 - MediaMetadataRetriever 相关 MediaMetadataRetriever 是android中用于从媒体文件中提取元数据新的类. 可以获取音频,视频和图像文件的各种信息,如时长,标题,封面等. 1:初始化对象 private MediaMetadataRetriever mediaMetadataRetriever new MediaMe…

Regression算法

文章目录 用线性回归找到最佳拟合直线标准回归函数局部加权线性回归函数 用线性回归找到最佳拟合直线 from google.colab import drive drive.mount("/content/drive")Mounted at /content/drivefrom numpy import *def loadDataSet(fileName):numFeat len(open(fi…

并发线程基础第八篇

目录 线程池 自定义线程池 步骤1&#xff1a;自定义拒绝策略接口 步骤2&#xff1a;自定义任务队列 步骤3&#xff1a;自定义线程池 步 骤 4&#xff1a;测 试 ThreadPoolExecutor 线程池状态 构造方法 工作方式 newFixedThreadPool newCachedThreadPool newSingleTh…

前端学习<四>JavaScript基础——02-JavaScript入门:hello world

开始写第一行 JavaScript&#xff1a;hello world JS 代码的书写位置在哪里呢&#xff1f;这个问题&#xff0c;也可以理解成&#xff1a;引入 JS 代码&#xff0c;有哪几种方式&#xff1f;有三种方式&#xff1a;&#xff08;和 CSS 的引入方式类似&#xff09; 行内式&…

C#开发中获取XML节点值,XML转对象案例

一、获取XML节点值 string strMsg"XML内容";XmlDocument xmlDoc new XmlDocument(); xmlDoc.LoadXml(strMsg);// 创建命名空间管理器 XmlNamespaceManager nsManager new XmlNamespaceManager(xmlDoc.NameTable); nsManager.AddNamespace("soapenv", &q…

我与C++的爱恋:内联函数,auto

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 ​ 一、内联函数 1.内联函数的概念 内联函数目的是减少函数调用的开销&#xff0c;通过将每个调用点将函数展开来实现。这种方法仅适用于那些函数体小、调用频繁的函数。 …

redis事务(redis features)

redis支持事务&#xff0c;也就是可以在一次请求中执行多个命令。redis中的事务主要是通过MULTI和EXEC这两个命令来实现的。 MULTI命令用来开启一个事务&#xff0c;事务开启之后&#xff0c;所有的命令就都会被放入到一个队列中&#xff0c;最后通过一个EXEC命令来执行事务中…

基于java+SpringBoot+Vue的网上订餐系统设计与实现

基于javaSpringBootVue的网上订餐系统设计与实现 开发语言: Java 数据库: MySQL技术: Spring Boot JSP工具: IDEA/Eclipse、Navicat、Maven 系统展示 前台展示 菜品浏览与选择&#xff1a;用户可以浏览不同的菜品分类&#xff0c;并选择心仪的菜品。 订单创建与管理&…

任意文件下载漏洞

1.文件下载漏洞存在的位置 文件经过php处理可能存在文件下载漏洞&#xff0c;配合目录遍历漏洞使用 2.目录遍历漏洞检验方法 测试是否存在目录遍历漏洞&#xff1a;在网站网址中间添加随意写一个文件名../&#xff08;返回上一级&#xff09;进行测试&#xff0c;没有报错就…

备战蓝桥杯--数论与搜索刷题2

话不多说&#xff0c;直接看题&#xff1a; 1.辗转相减法 我们不妨假设原等比数列a,a*(q/p),a*(q/p)^2.... 那么x1,,,,xn就是其中的n项&#xff0c;xi/x1(q/p)^b&#xff0c;假设最大比例为(q/p)^k&#xff0c;&#xff0c;那么一定有(q/p)^(k*s)(q/p)^b&#xff0c;即k是b的…

【Servlet】Servlet入门

文章目录 一、介绍二、入门案例导入servlet-api的解决办法 一、介绍 概念&#xff1a;server applet&#xff0c;即&#xff1a;运行在服务器端的小程序 Servlet就是一个接口&#xff0c;定义了Java类被浏览器访问到&#xff08;tomcat识别&#xff09;的规则。 将来我们定义…

【项目新功能开发篇】开发编码

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

mysql 磁盘空间100%

MySQL大事务可能会导致过多的占用临时文件&#xff0c;导致磁盘空间撑满的问题 本例说明下binlog cache产生的临时文件 案例复现 调小binlog_cache_size&#xff0c;让DML使用临时文件 使用存储过程模拟大事务 创建表 create table t1( id int AUTO_INCREMENT, name varchar…

Rust---复合数据类型之字符串与切片(2)

目录 字符串操作删除 (Delete)连接 (Concatenate) 字符串转义 前情回顾: Rust—复合数据类型之字符串&#xff08;1&#xff09; 字符串操作 删除 (Delete) 删除方法仅适用于 String 类型&#xff0c;分别是&#xff1a; pop()&#xff0c;remove()&#xff0c;truncate()&a…

【Redis系列】Redis安装与使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

使用subprocess包来在python代码实时查看GPU利用率

最近又被GPU利用率问题导致训练不高效的问题搞到了&#xff08;恼&#xff09;&#xff0c;所以在py使用代码看看是哪出了问题。 import subprocessdef get_gpu_utilization():# 运行nvidia-smi命令smi_output subprocess.check_output([nvidia-smi, --query-gpuutilization.…

保研线性代数复习3

一.基底&#xff08;Basis&#xff09; 1.什么是生成集&#xff08;Generating Set&#xff09;&#xff1f;什么是张成空间&#xff08;Span&#xff09;&#xff1f; 存在向量空间V(V&#xff0c;&#xff0c;*)&#xff0c;和向量集&#xff08;xi是所说的列向量&#xff…

大模型prompt技巧——思维链(Chain-of-Thought)

1、Zero-shot、One-shot、Few-shot 与fintune prompt的时候给出例子答案&#xff0c;然后再让模型回答。 2、zero-shot-CoT “Let’s think step by step”有奇迹效果 3、多数投票提高CoT性能——自洽性&#xff08;Self-consistency&#xff09; 多个思维链&#xff0c;然后取…

WordPress 6.5 “里贾纳”已经发布

WordPress 6.5 “里贾纳”已经发布&#xff0c;其灵感来自著名爵士小提琴家Regina Carter的多才多艺。雷吉娜是一位屡获殊荣的艺术家和著名的爵士乐教育家&#xff0c;以超越流派而闻名&#xff0c;她在古典音乐方面的技术基础和对爵士乐的深刻理解为她赢得了大胆超越小提琴所能…

数据库面试题之Mysql

(1)Mysql主从架构原理 主库把数据变更写入binlog从库的IO线程对主库发起dump请求主库IO线程推送binlog至从库从库IO线程写入本地relay log从库sql线程读取relay log,保持和主库数据一致(2)B+树和B树的区别? 结构方面: B树每个节点可以有多于一个的关键字,而非叶子节点可…