使用hutool库,对excel进行一些导出、导入操作_hutool excel-程序员宅基地

技术标签: excel  java  servlet  

所用到的各种类,依赖的话百度一下吧,最后再给上全部代码

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.domain.MagBackAmountInfo;
import com.domain.ReturnResult;
import com.example.service.impl.MagBackAmountInfoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

导出数据为excel的接口代码

    @GetMapping("/testExport")
 public void test(HttpServletRequest request, HttpServletResponse response){
    
     int pageStart = Integer.parseInt(request.getParameter("Pagenumber"));
     int pageSize = Integer.parseInt(request.getParameter("number"));
     /** 这里写你自己获取数据的方法*/
        List<MagBackAmountInfo> magBackAmountInfos = backAmountInfoService.selectByPrimarybyid(null);

        ExcelWriter writer = ExcelUtil.getWriter(true);
        /** 这里的作用是将你的字段与excel展示名称做匹配 */
     Map<String,String> map = new HashMap<>();
     map.put("backAmountId","VIN");
     map.put("makeInvocId","ICCID");
     map.put("customerName","客户名称");
     map.put("vehiclesName","车系名称");
     map.put("vehicleModel","车型名称");
     map.put("vehicleConf","配置名称");
     map.put("customerType","客户类型");
     map.put("activedTime","实销通过日期");
     map.put("realStatus","实名状态");
     writer.setHeaderAlias(map);
     /** 这里的作用时,写出之后不展示你的字段名,只展示你设置的别名,客户类型,实销通过日期。这些 */
     writer.setOnlyAlias(true);
     writer.write(magBackAmountInfos,true);
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
     response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
     ServletOutputStream out= null;
     try {
    
         out = response.getOutputStream();
         writer.flush(out, true);
         // 关闭writer,释放内存
         writer.close();
         //此处记得关闭输出Servlet流
         IoUtil.close(out);
     } catch (IOException e) {
    
         e.printStackTrace();
     }
 }

导入时提供模板的接口代码

  @ResponseBody
    @RequestMapping(value = "/moban", method = RequestMethod.GET)
    public void moban(HttpServletRequest request, HttpServletResponse response){
    

        ExcelWriter writer = ExcelUtil.getWriter(true);
        List<String> row = CollUtil.newArrayList("backAmountId", "makeInvocId", "customerName", "vehiclesName","vehicleModel","vehicleConf","customerType","activedTime","realStatus");
        List<String> secRow = CollUtil.newArrayList("VIN", "ICCID", "客户名称", "车系名称","车型名称","配置名称","客户类型","实销通过日期-(yyyy-MM-dd HH:mm:ss)","实名状态");
        writer.writeHeadRow(row);
        writer.writeRow(secRow);
        /** 这里说是隐藏,但是其实就是将高度置为0,有点鸡肋 */
        writer.getSheet().getRow(0).setZeroHeight(true);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
        ServletOutputStream out= null;
        try {
    
            out = response.getOutputStream();
            writer.flush(out, true);
            // 关闭writer,释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        } catch (IOException e) {
    
            e.printStackTrace();
        }
    }

导入接口代码

    //导入excel
    @PostMapping("/import")
    public ReturnResult importExcel(@RequestParam("file") MultipartFile file) throws IOException {
    
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        if (file==null|| file.isEmpty()){
    
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "上传文件为空,请重新上传");
        }
        else if (!suffix.equals("xls")&&!suffix.equals("xlsx")){
    
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件格式错误,请上传excel文件");
        }
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        /** 因为模板中有两行为提示信息,所以这儿设置从0,2之后读取 */
        List<MagBackAmountInfo> blackDtos = reader.read(0, 2, MagBackAmountInfo.class);
        if (blackDtos.size() == 0) {
    
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件数据为空,请重新上传");
        } else {
    
            /** 可以直接批量插入,也可以在service层做一些关键值的判断 */
             backAmountInfoService.batchInsert(blackDtos);
          return   ReturnResult.ok();
        }
    }

完整class代码

package com.example.demo;

import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.io.IoUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import cn.hutool.poi.excel.ExcelWriter;
import com.domain.MagBackAmountInfo;
import com.domain.ReturnResult;
import com.example.service.impl.MagBackAmountInfoServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
//允许跨域访问
@CrossOrigin
@RequestMapping("/member")
public class ExcelController {
    

    @Autowired
    MagBackAmountInfoServiceImpl backAmountInfoService;

    @GetMapping("/testExport")
 public void test(HttpServletRequest request, HttpServletResponse response){
    
     int pageStart = Integer.parseInt(request.getParameter("Pagenumber"));
     int pageSize = Integer.parseInt(request.getParameter("number"));
     /** 这里写你自己获取数据的方法*/
        List<MagBackAmountInfo> magBackAmountInfos = backAmountInfoService.selectByPrimarybyid(null);

        ExcelWriter writer = ExcelUtil.getWriter(true);
        /** 这里的作用是将你的字段与excel展示名称做匹配 */
     Map<String,String> map = new HashMap<>();
     map.put("backAmountId","VIN");
     map.put("makeInvocId","ICCID");
     map.put("customerName","客户名称");
     map.put("vehiclesName","车系名称");
     map.put("vehicleModel","车型名称");
     map.put("vehicleConf","配置名称");
     map.put("customerType","客户类型");
     map.put("activedTime","实销通过日期");
     map.put("realStatus","实名状态");
     writer.setHeaderAlias(map);
     /** 这里的作用时,写出之后不展示你的字段名,只展示你设置的别名,客户类型,实销通过日期。这些 */
     writer.setOnlyAlias(true);
     writer.write(magBackAmountInfos,true);
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
     response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
     ServletOutputStream out= null;
     try {
    
         out = response.getOutputStream();
         writer.flush(out, true);
         // 关闭writer,释放内存
         writer.close();
         //此处记得关闭输出Servlet流
         IoUtil.close(out);
     } catch (IOException e) {
    
         e.printStackTrace();
     }
 }


    @ResponseBody
    @RequestMapping(value = "/moban", method = RequestMethod.GET)
    public void moban(HttpServletRequest request, HttpServletResponse response){
    

        ExcelWriter writer = ExcelUtil.getWriter(true);
        List<String> row = CollUtil.newArrayList("backAmountId", "makeInvocId", "customerName", "vehiclesName","vehicleModel","vehicleConf","customerType","activedTime","realStatus");
        List<String> secRow = CollUtil.newArrayList("VIN", "ICCID", "客户名称", "车系名称","车型名称","配置名称","客户类型","实销通过日期-(yyyy-MM-dd HH:mm:ss)","实名状态");
        writer.writeHeadRow(row);
        writer.writeRow(secRow);
        /** 这里说是隐藏,但是其实就是将高度置为0,有点鸡肋 */
        writer.getSheet().getRow(0).setZeroHeight(true);
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8");
        response.setHeader("Content-Disposition","attachment;filename=RealnameRechargeBlack.xlsx");
        ServletOutputStream out= null;
        try {
    
            out = response.getOutputStream();
            writer.flush(out, true);
            // 关闭writer,释放内存
            writer.close();
            //此处记得关闭输出Servlet流
            IoUtil.close(out);
        } catch (IOException e) {
    
            e.printStackTrace();
        }
    }


    //导入excel
    @PostMapping("/import")
    public ReturnResult importExcel(@RequestParam("file") MultipartFile file) throws IOException {
    
        String originalFilename = file.getOriginalFilename();
        String suffix = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        if (file==null|| file.isEmpty()){
    
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "上传文件为空,请重新上传");
        }
        else if (!suffix.equals("xls")&&!suffix.equals("xlsx")){
    
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件格式错误,请上传excel文件");
        }
        ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
        /** 因为模板中有两行为提示信息,所以这儿设置从0,2之后读取 */
        List<MagBackAmountInfo> blackDtos = reader.read(0, 2, MagBackAmountInfo.class);
        if (blackDtos.size() == 0) {
    
            return ReturnResult.failed(HttpStatus.BAD_REQUEST.value(), "文件数据为空,请重新上传");
        } else {
    
            /** 可以直接批量插入,也可以在service层做一些关键值的判断 */
             backAmountInfoService.batchInsert(blackDtos);
          return   ReturnResult.ok();
        }
    }

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_48162563/article/details/131124627

智能推荐

JavaDemo——读取硬盘物理序列号_java 硬盘物理序列号-程序员宅基地

文章浏览阅读1.2k次。通过调用wmic命令获取硬盘序列号,wmic命令很强大。Demo:/** * 2019年3月13日下午3:48:22 */package testReadDiskInfo;import java.io.IOException;import java.util.ArrayList;import java.util.HashMap;import java.util.List;..._java 硬盘物理序列号

CentOS 编译Hadoop 2.6 32位_32位linux系统 编译hadoop-程序员宅基地

文章浏览阅读2.2k次。本文采用CenOS 6 32位,JDK1.7进行编译 (1)安装编译库yum install cmake lzo-devel zlib-devel gcc gcc-c++ autoconf automake libtool ncurses-devel openssl-devel libXtst(2)安装mavenwget http://repos.fedorapeople.org/repos/dc_32位linux系统 编译hadoop

bind mysql web_基于的django的bind dns管理平台-程序员宅基地

文章浏览阅读422次。BIND(Berkeley internet Name Daemon)也叫做NAMED,是现今互联网上使用最为广泛的DNS 服务器程序,本项目旨在更简单的维护我们内部的dns系统。环境:数据库: mysql5.6应用: bind-9.11.2环境: python3.8 , django30x01 安装数据库bash sql 建库语句use mysqlcreate database bind9; -..._使用web管理bind

Jvm基础篇-02-自动内存管理-程序员宅基地

文章浏览阅读282次。对于Java程序员来说,在虚拟机自动内存管理机制的帮助下,不再需要为每一个new操作去写配对的delete/free代码,不容易出现内存泄漏和内存溢出问题。不过,一旦出现内存泄漏和溢出方面的问题,如果不了解虚拟机是怎样使用内存的,那排查错误、修正问题将会成为一项异常艰难的工作。====从新生代出发-XX:+UseSerialGC 可互相激活新生代 :Serial + 老年代: Serial Old 都是串行-XX:+UseParNewGC 可互相激活。_自动内存管理

自己写的轮播图,原生JavaScript,支持移动端触摸滑动。分页器圆点可以支持mouseover鼠标移入和click点击,面向对象思路_轮播图无缝链接带有小圆点且支持移动端触频滑动-程序员宅基地

文章浏览阅读529次。自己用原生javascript写的轮播图,分页器按钮Click点击与mouseover鼠标悬浮导航都支持。同时支持移动端触摸操作,自己写得感觉不足之处是图片滚动动画还不够平滑,再改改间隔与偏移量应该可以。函数接受参数应该改成对象更好,还没有改。感觉这次写的轮播图功能比较全面了哈。高手们请别笑话,不足请指正.上源码:先HTML:&lt;!DOCTYPE html&gt;&lt;html&gt;&..._轮播图无缝链接带有小圆点且支持移动端触频滑动

LAMP服务架构之传统缓存机制(Ngins+PHP+Memcache)-程序员宅基地

文章浏览阅读339次。nginx - fastcgi - php - memcache 协同下的 请求的完整访问过程用户发送http请求报文给nginx服务器nginx会根据文件url和后缀来判断请求如果请求的是静态内容,nginx会将结果直接返回给用户; 如果请求的是动态内容,nginx会将请求交给 fastcgi客户端 ,通过 fastcgi_pass 将这个请求发送给 php-fpmphp-fpm 会将请求交给 wrapperwrapper 收到请求会生成新的线程调用 php动态程序解析服务器如果用

随便推点

一文看懂Linux内核!Linux内核架构和工作原理详解_linux内核基本原理-程序员宅基地

文章浏览阅读1.9w次,点赞43次,收藏421次。linux内核相关视频解析:5个方面分析linux内核架构,让你对内核不再陌生90分钟了解Linux内存架构,numa的优势,slab的实现,vmalloc的原理手把手带你实现一个Linux内核文件系统简介作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。Linux进程1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init_linux内核基本原理

Android音乐播放器_登录即可查找最新的android应用、游戏、电影、音乐等精彩内容-程序员宅基地

文章浏览阅读939次。该音乐播放器是我研究生开学前做出来的,花了我将近一个月的闲余时间,算是有模有样的了。现在算起来,应该有一年多没搞Android,所以现在看回以前的程序已经比较模糊了,整个工程的代码量还是比较庞大的,就不把代码贴出来了,感兴趣的可以自行下载代码。欢迎先体验我的App,来一场听觉与视觉的享受吧!视觉????嗯,你没看错,安装后有惊喜,让你欲罢不能!(貌似有点夸张了)Apk下载地址:ht_登录即可查找最新的android应用、游戏、电影、音乐等精彩内容

无法注册 URL http://+:8735/Service/。另一应用程序已使用 HTTP.SYS 注册了该 URL。的解决办法。_无法注册应用去处理url地址-程序员宅基地

文章浏览阅读1.1w次。 弄了一上午,终于把使用NetTcpBinding的双工通讯给弄清楚了,也算是对wcf有所掌握了,为了解决穿透防火墙的问题,所以决定尝试一下WsDualHttpBinding的双工通信,结果问题来了。。。 “无法注册 URL http://+:8735/Service/。另一应用程序已使用 HTTP.SYS 注册了该 URL。” 晕了一种个下午,百_无法注册应用去处理url地址

Python学习资料全面总结,真的对零基础很有用-程序员宅基地

文章浏览阅读4.5k次,点赞5次,收藏52次。把手里积累了这么久的Python入门资料整理了一下,发现其实,有了这些,python入门真的不难,每天花点时间学,真的不会影响工作。下面一起来看看这些资料吧!可以学习python的地方 Python学习资料全部整理 Python可以做的事情 关于python的一些文章一、可以学习Python的地方1、实验楼:【Python基础+项目实战课程】https://www.lanqiao.cn/courses/13302、《笨办法学 Python》:这本书绝对是最简单的学习 Pyth.._python学习资料

Linux Centos yum/rpm 设置代理_linux 代理 rpm-程序员宅基地

文章浏览阅读1.2k次。yum 设置代理:vim /etc/yum.conf添加形如:proxy = http://user:pass@ip:portrpm 设置代理sudo rpm -Uvh https://xxxxx.rpm --httpproxy ip --httpport portreference: https://www.lightnetics.com/topic/3698/how-do-i-install-an-rpm-package-using-a-http-proxy..._linux 代理 rpm

Android中的图片处理(包括缓存、大小、优化等)_android 每秒收到30张图片怎么处理-程序员宅基地

文章浏览阅读3.1k次。加载一副位图到你的用户界面是很简单的,然而如果你需要马上加载一组更大的图片的话就会复杂的多.在许多情况下(例如有些组件像ListView,GridView以及ViewPager等),出现在屏幕上的图片总量,其中包括可能马上要滚动显示在屏幕上的那些图片,实际上是无限的. 那些通过回收即将移除屏幕的子视图的组件,内存使用得以保留.如果你不长期保持你对象的引用的话,垃圾收集器也会释放你所加载的位图内_android 每秒收到30张图片怎么处理

推荐文章

热门文章

相关标签