从服务器下载Excel模板到本地,然后本地再将数据填好,再上传Excel新增到数据库[springboot]

excel导入及下载模板 通过input元素绑定change事件,当选择excel文件后会触发importExcel方法。在该方法中,使用FileReader对象读取excel文件的内容,然后使用xlsx插件解析excel文件的内容并将其转换为json格式的数据。最后就可以获得jsonData格式的数据,并进行处理。下载模板的首行为英文字段名,中文字段名解析后为row[0]的记录,需过滤掉,日期的格式为字符。两种方式,axios.get请求完整的url地址和接口请求stream流的方式。解析后的json数据格式。 阅读详情

一、Excel下载

1.在本地新建Excel文件模板,并设置文件单元格格式(方便存储时读取数据)

2.选择字段,右键,设置单元格格式

3.将Id设置为数值类型,并且是正数值类型,将Name,Address,Sex,Content设置为文本类型

4.将文件存在服务器上,放在template下,也可以自定义字段,写代码时注意路径问题

5.代码


    @Resource
    private ResourceLoader resourceLoader;


//controller接口
@RequestMapping(value="/down",method= RequestMethod.GET)
    public void down(HttpServletRequest request, HttpServletResponse response,
                              @RequestParam("fileName") String fileName){
        if(fileName==null||"".equals(fileName)){
            logger.info("============================文件不存在");
            return;
        }
        messageTaskService.down(request,response,fileName);
    }

//service代码
 /**
     * 下载任务详情模板
     * @param
     * @return
     */
    public void down(HttpServletRequest request, HttpServletResponse response,String fileName){
        if(fileName==null|| !fileName.endsWith(".xls")){
            logger.info("=============downLoadModel's fileName is null or file type is wrong !");
            return;
        }
        logger.info("=============start in downLoadModel , fileName = "+fileName);
        InputStream inputStream = null;
        ServletOutputStream servletOutputStream = null;
        try {
            String filename = fileName;
            String path = "template/"+fileName;
            org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:"+path);

            response.setContentType("application/vnd.ms-excel");
            response.addHeader("Cache-Control", "no-cache, no-store, must-revalidate");
            response.addHeader("charset", "utf-8");
            response.addHeader("Pragma", "no-cache");
            String encodeName = URLEncoder.encode(filename, StandardCharsets.UTF_8.toString());
            response.setHeader("Content-Disposition", "attachment; filename=\"" + encodeName + "\"; filename*=utf-8''" + encodeName);

            inputStream = resource.getInputStream();
            servletOutputStream = response.getOutputStream();
            IOUtils.copy(inputStream, servletOutputStream);
            response.flushBuffer();
            logger.info("=============success in downLoadModel");
        } catch (Exception e) {
            logger.error("=============filed in downLoadModel , fileName = "+fileName);
            e.printStackTrace();
        } finally {
            try {
                if (servletOutputStream != null) {
                    servletOutputStream.close();
                    servletOutputStream = null;
                }
                if (inputStream != null) {
                    inputStream.close();
                    inputStream = null;
                }
                // 召唤jvm的垃圾回收器
                System.gc();
            } catch (Exception e) {
                logger.error("=============filed in downLoadModel , fileName = "+fileName);
                e.printStackTrace();
            }
        }
    }

二、Excel上传

1.将数据写到刚下载下来的文件夹

2.代码编写

//controller
@RequestMapping(value="/upLoad",method= RequestMethod.POST,consumes = "multipart/*",headers = "content-type=multipart/form-data")
    public ResultData  uploadImg( @RequestParam("file") MultipartFile file,HttpServletRequest request, HttpServletResponse response) {
        ResultData resultData=new ResultData(Constant.SUCCESS,Constant.RETURN_SUCCESS_CODE,Constant.RETURN_SUCCESS_MESSAGE);
        if(file==null||file.getName()==null){
            return new ResultData(Constant.FAIL,Constant.RETURN_FAIL_CODE,"文件上传有误");
        }
        try {
            resultData=messageTaskService.upLoadModel(request,response,file);
            return resultData;
        } catch (Exception e) {
            logger.error(e.toString());
            resultData.setResult(Constant.FAIL);
            resultData.setCode(Constant.RETURN_FAIL_CODE);
            resultData.setMessage("任务详情模板上传失败!");
            return resultData;
        }
    }



//service
/*
    上传任务详情Excel
     */
    @Transactional
    public ResultData upLoadModel(HttpServletRequest request,HttpServletResponse response,MultipartFile file) throws Exception {
        ResultData resultData=new ResultData(Constant.SUCCESS,Constant.RETURN_SUCCESS_CODE,Constant.RETURN_SUCCESS_MESSAGE);
        logger.info("=============start in  upLoadModel");
        logger.info("=============start to trans data");
        ExcelUtil ept = new ExcelUtil();
        List<MessageTaskDetail> list = ept.uploadExcelData(file);
        logger.info("=============end to trans data , and MessageTaskDetailList size="+list.size());
        System.out.println(list.size());
        if(list==null||list.size()==0){
            resultData.setMessage("请上传xls或xlsx带数据的文件!");
        }else{
            logger.info("=============start to delete database taskDetail");
            //删除
            int deleteCount = messageTaskDetailMapper.deleteByTaskId(list.get(0).getTaskId());
            logger.info("=============end to delete taskDetail . Count = " +deleteCount);
            logger.info("=============start to insert taskDetail");
            MessageTaskDetail stu=null;
            for (int i=0;i< list.size();i++) {
                stu=list.get(i);
                messageTaskDetailMapper.insertSelective(stu);
                System.out.println("### "+stu.toString());
            }
            logger.info("=============insert taskDetail success");
        }
        logger.info("=============end in upLoadModel");
        return resultData;
    }

/**
     * 上传Excel表格
     * @param file
     * @return
     */
   public List<MessageTaskDetail> uploadExcelData(MultipartFile file) throws Exception {
        List<MessageTaskDetail> list = new ArrayList<MessageTaskDetail>();
       String fileName=file.getOriginalFilename();
        InputStream is = null;
        try {
            is = file.getInputStream();
            Workbook workbook = null;
            if(fileName.toLowerCase().endsWith(".xls")||fileName.toLowerCase().endsWith(".xlsx")){
                workbook = new XSSFWorkbook(is);
                logger.info("=============start to uploadExcelData");
                if(fileName.contains("user")){//当下载文件夹已存在时,文件会自动重命名user(1).xls,user(2).xls,user(3).xls...所以只要判断文件名是否包含user就行了
                    list=this.transUserData(workbook,list);
                }else {
                    logger.error("=============file model is wrong ,please upload file model by '.xls' type");
                    return null;
                }
                logger.info("=============success uploadExcelData");
            }else{
                logger.error("=============文件格式不正确,请上传.xls或xlsx标准模板");
                return null;
           }

        }finally {
            if(is!=null){
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return list;
    }



 /**
     * 转换User数据
     * @param workbook
     * @param list
     * @return
     */
    public List<MessageTaskDetail> transUserData( Workbook workbook,List<MessageTaskDetail> list ){
        Sheet sheet = null;
        Row row = null;
        Integer succ = 0;
        Cell headCell=null;
        if(workbook!=null){
            MessageTaskDetail messageTaskDetail = null;
            int index = 0;//表  列索引
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {//循环表
                sheet = workbook.getSheetAt(i);// 第i张表格

                //表头判断是否正确
                row =sheet.getRow(0);// 第1行,表头
                // TaskId	Name AppId	Tags	Content
                if(row == null){break;};//判断行是否还有数据
                if(row.getCell(0)==null){break;};//判断第一行第一列是否有值
                headCell=row.getCell(1);
                if(!headCell.getStringCellValue().equals("Name")){
                    logger.info("============= Excel's "+headCell.getStringCellValue()+" column is wrong ! It's should be 'Name' !");
                    break;
                }
                headCell=row.getCell(2);
                if(!headCell.getStringCellValue().equals("Address")){
                    logger.info("============= Excel's "+headCell.getStringCellValue()+" column is wrong ! It's should be 'Address' !");
                    break;
                }
                headCell=row.getCell(3);
                if(!headCell.getStringCellValue().equals("Sex")){
                    logger.info("============= Excel's "+headCell.getStringCellValue()+" column is wrong ! It's should be 'Sex' !");
                    break;
                }
                headCell=row.getCell(4);
                if(!headCell.getStringCellValue().equals("Content")){
                    logger.info("============= Excel's "+headCell.getStringCellValue()+" column is wrong ! It's should be 'Content' !");
                    break;
                }

                for(int j=1;j < sheet.getPhysicalNumberOfRows();j++){//循环行
                    row = sheet.getRow(j);
                    if(row == null){break;};//判断行是否还有数据
                    index=0;//每次换行,重新从第一列开始
                    if(row.getCell(index)==null){break;};
                    messageTaskDetail  = new MessageTaskDetail();
                    //任务ID
                    Cell cell = row.getCell(index);
                    if(cell!=null && !cell.equals("")){
                        messageTaskDetail.setTaskId((long)cell.getNumericCellValue());
                    }
                    //姓名
                    cell = row.getCell(++index);
                    if(cell!=null && !cell.equals("")){
                        messageTaskDetail.setName(cell.getStringCellValue());
                    }
                    //Address
                    cell = row.getCell(++index);
                    if(cell!=null && !cell.equals("")){
                        messageTaskDetail.setAddress(cell.getStringCellValue());
                    }

                    //Sex
                    cell = row.getCell(++index);
                    if(cell!=null && !cell.equals("")){
                        messageTaskDetail.setSex(cell.getStringCellValue());
                    }

                    //推送内容
                    cell = row.getCell(++index);
                    if(cell!=null && !cell.equals("")){
                        messageTaskDetail.setContent(cell.getStringCellValue());
                    }
                    //赋值
                    list.add(messageTaskDetail);
                }
            }
        }
        return list;
    }

【注意】ResultData 是返回类型,不用在意

【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一) 【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(一) 【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(二) 【Excel_To_DB】SpringBoot+EasyPoi+Redis消息队列实现Excel批量异步导入数据库(三) 【码云地址】:https:/... 阅读详情

相关推荐

SpringBoot中使用POI实现Excel导入到数据库(图文教程已实践)

场景 IDEA中开发SpringBoot项目时需要将Excel模板中数据导入的到数据库。 Excel模板如下 实现思想 首先将模板上传到服务器中某路径,并将当前路径存储,然后使用POI自带的 工具类获取到sheet以及行数以及每个cell,然后分别给数据库中对应的对象的属性赋值,然后插入到数据库中并返回执行结果。 实现 实现文件上传 页面代码 实现点击导入按钮弹窗 &lt...

BADAO_LIUMANG_QIZHI的博客 9135

SpringBoot-Excel文件批量上传导入数据库

Spring boot + Spring data jpa + Thymeleaf 批量插入 + POI读取 + 文件上传 pom.xml: &lt;!-- https://mvnrepository.com/artifact/org.apache.poi/poi --&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.poi&lt;...

孟孟的博客 6257

javaWeb上传Excel文件并将数据保存到数据库

数据库在webcontent下的SQL文件夹中,excel模板在excelModel文件夹中,如果运行后不能正常出现页面,可以将压缩包内的jQuery-easyUI压缩包解压后将WebContent下的同名jQuery-easyUI文件替换。具体使用方法查看使用说明。

excel下载 上传

angularjs 控制上传下载,先下载模板,然后填写内容,然后再提交,后台是ssh 1,页面按钮 模板下载 上传文件 2,js方法  自定义只能让他上传excel文件 //模板下载 $scope.downloadTemplate=function(){ $("#expo

my_name_nb的博客 416

R语言实战:GEO单细胞数据下载与自动化整理全流程(附代码)

本文详细介绍了使用R语言从GEO数据库下载scRNA-seq数据并实现自动化整理的完整流程。通过GEOquery和Seurat等工具包,读者可以高效获取单细胞RNA测序数据,完成从原始数据下载到预处理的全过程,最终生成可直接用于分析的Seurat对象。文章包含完整代码示例,特别适合生物信息学研究者处理单细胞数据。

weixin_29061821的博客 427

西门子与汇川伺服脉冲连接(速度模式)

如何使用西门子PLC与汇川伺服进行脉冲连接

2301_77347966的博客 1万+

EasyExcel实现文件上传下载(百万级数据、单元格自定义样式)

Java解析、生成Excel比较有名的框架有Apache poijxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。EasyExcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;

从基础到源码解析的学习记录 4520

在thinkBook16的win11基础上安装ubuntu22.04

背景:联想ThinkBook16 pro 32G/512G,系统盘已安装Win11,加装一条M.2-2T固态,想在2T上分一个300GB的EXT4分区,然后把ubuntu22.04安装在该分区上,并实现Win11+Linux多系统共存。 目标:实现多磁盘下分区管理的简化,优化掉一些不必要的多余的维护性质的分区。

QzmAIoT 4003

关于实现将excel表中的数据以文件上传的方式添加到数据库中

导入easyexcel依赖即可完成 实现将数据保存到excel表格 实现将excel表格中的内容读取 1.实现一个监听器类,重写方法

m0_60970045的博客 1551

用PY32F003F18的PWM互补输出驱动无刷电机,保姆级配置流程(含代码)

本文详细介绍了如何利用PY32F003F18微控制器的TIM1定时器配置PWM互补输出功能来驱动三相无刷电机,涵盖硬件设计、代码实现及六步换相算法。通过保姆级配置流程和实用代码示例,帮助开发者快速掌握无刷电机驱动技术,适用于工业自动化和消费电子等领域。

weixin_26905487的博客 379

STM32 FMC驱动AD7606实战:从硬件连接到时序调试全流程解析

本文详细解析了STM32 FMC驱动AD7606的全流程,包括硬件连接、FMC接口配置、驱动程序设计和时序调试。通过实战案例,展示了如何利用STM32的FMC总线实现与AD7606的高效数据传输,特别强调了电源设计、信号连接和PCB布局等关键要点,为嵌入式数据采集系统开发提供了实用指导。

aa123的博客 1005

SpringBoot导出Excel模板

文章目录SpringBoot导出Excel模板pom.xml依赖Excel模板文件Controller测试 SpringBoot导出Excel模板 共同探讨,向各位大佬学习 走向CEO,迎娶白富美 pom.xml依赖 <!--excel--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml<

LXH_HX的博客 1977

Vue2+OpenLayers动态绘制两个经纬度并计算距离(提供Gitee源码)

动态绘制两个经纬度并计算它们之间的距离。

黄团团的个人博客 366

利用EasyExcel完整的springboot +vue前后端导出并下载excel表格

文章目录写在前面正文1. springboot后端引入easyexcel及使用1.1 引入依赖1.2 接口serviceImpl方法1.3 提供一个对list集合去重的方法(根据相同key,去除重复,合并value值)1.4 BizMergeStrategy合并策略类1.5 自定义ExcelUtil工具类2. vue前端调用后台下载excel接口实现点击按钮完成下载2.1 上图对应vue代码2.2 export_excel() 方法3. vue多种方式实现调用后台接口下载excel (本小节借鉴他人

初心不改 9940

Android CCodec (十七) 硬件解码调用分析-1(基于V4l2)

简单的分析V4L2DecodeComponent和其相关内容,后续针对解码调用单独分析。

给大佬递杯卡布奇诺的博客 6594

CCAR-23《正常类飞机适航规定》和CCAR-25《运输类飞机适航规定》差异分析

通过详细比较CCAR-23和CCAR-25在适用范围、设计标准、性能要求、运行限制、安全冗余和环境适应性方面的差异,我们可以看出,CCAR-23适用于轻型飞机,开发和运营成本较低,设计要求相对简单。而CCAR-25适用于大规模运输飞机,设计、开发、测试和运营管理都需要更高的复杂性和投入。

qq_41854911的博客 3706

springboot+jxls根据excel模板(类似于el表达式)导出excel

1.准备好excel模板 2.将准备好的excel模板放入项目中的resource文件夹中 3.添加Maven依赖 ```xml <!--jxls导出依赖jar包--> <dependency> <groupId>net.sf.jxls</groupId> <artifactId>jxls-core</artifactId> <version>1.0.6</version> &

weixin_44805174的博客 662

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

SpringBoot + iframe 前后端实现简单实用的下载文件、导出excel案例

大家JavaWeb项目中应该都会遇到下载文件或导出excel的需求,特此分享此文,简单明了,可用于实际项目。 1、前端页面,模拟两个按钮:下载文件、导出excel 注:本案例是使用 SpringBoot 构建的项目,我这里使用的是之前介绍SpringBoot 实现CORS而创建的工程,也可以自己重新创建一个新的SpringBoot项目即可,然后新增如下一个html或jsp页面,使用ifr...

骏马逸动,心随你动的博客 3028

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【File】使用 SpringBoot 实现Excel导入和导出

你给我一个Excel文件路径,和一个数据类型,我就能将这个Excel文件中的数据封装成一个集合,并返回给你;Excel 文件中性别对应的是男、女,但我们要用整形0、1 去接收它,所以,需要自定义一个性别转换器。这里 ExcelUtil 类用的是泛型,你要导入什么类型的数据,就传什么类型的数据。uploadFile():这个上传文件的方法,还是使用的上一篇博文的方法。

Novice_9518的博客 937

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

文件上传/easypoi简单模板导出Excel

工具类:Upload.java package com.example.sl.layer.util; import cn.afterturn.easypoi.excel.ExcelImportUtil; import cn.afterturn.easypoi.excel.entity.ImportParams; import org.apache.commons.lang3.StringUt...

qq_30944053的博客 1026

EasyExcel 导出简单应用,简单模板导出

EasyExcel 导出简单应用,简单模板导出

a____l的博客 5042

excel通过js导入到页面_30分钟,教会大家 javaweb项目,导入导出excel数据

1.背景本视频会讲解web项目如何,导入,导出excel:使用的技术是poi不管你使用的是sring boot框架 还是ssm框架(这2个框架基本一样)您都可以使用poi进入excel的操作。2.把数据 导出excel我们导出excel使用的是模板导出(Java 导出Excel利用模版导出)首先呢,在电脑新建一个excel的模板,复制到我们的项目,(截图 )我们导出数据就是利用这个模...

weixin_42356315的博客 349

Java真的不难(复习)SpringBoot使用EasyExcel实现导出

EasyExcel是一个基于Java的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel。github地址官方文档地址当然还有一个POI也可以实现操作Excel,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,POI为“Poor Obfuscation Implementation”的首字母缩写,意为“简洁版的模糊实现”

小应学长的的博客 984

深入浅出Java开发!java下载excel模板

1.美团面试官问的Spring Boot问题 什么是 Spring Boot? 为什么要用 Spring Boot? Spring Boot 的核心配置文件有哪几个?它们的区别是什么? Spring Boot 的配置文件有哪几种格式?它们有什么区别? Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的? 开启 Spring Boot 特性有哪几种方式? Spring Boot 需要独立的容器运行吗? 运行 Spring Boot 有哪几种方式? Spring Boot 自动配置原理是什么?

m0_56255097的博客 149

文件上传与下载以及导出导出(elmentui+springboot)

近两天用的最多的就是上传下载以及excel的导入和导出,测试人员提的bug不断,走了很多坑,现将其记录下来,以作记录。首先将应用情况介绍下:三按钮之 导入数据集:将excel模板中的数据导入到数据库中。(excel具有指定的格式样式等)三按钮之 导出数据集:将选中的数据库中的某条数据导出到excel。(用的是同一个模板)三按钮之 导出数据集模板 &lt;el-button-group&gt; ...

LIUHUA121的博客 6668

vue+springboot上传excel文件并读取

样例 前端代码: <div> <el-upload drag :limit=limitNum :auto-upload="false" accept=".xlsx" action="" :before-upload="beforeUploadFile"

qq_43653355的博客 1703
上一篇: mongodb多字段分组统计并求最大统计失败时间
下一篇: oracle-sql
芬芳酩酊
博客等级 码龄10年 35粉丝 108原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值