SpringBoot下载xlsx模板,导出excel数据

简介: SpringBoot下载xlsx模板,导出excel数据

此文件功能使用SpringBoot来编写,包括写好的前端和后端代码。

使用SpringBoot+POI导出excel数据。

使用SpringBoot导出excel模板文件,防止用户导入错误。

先看是否需要在下载,功能演示都放在这篇文章了:

下载地址:点我下载

项目结构

controller层

package edu.sdjsjxy.jc.controller;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import edu.sdjsjxy.jc.dao.ImportJCFileDataDao;
import edu.sdjsjxy.jc.entity.ImportJCEntity;
import edu.sdjsjxy.jc.entity.JCEntity;
import edu.sdjsjxy.jc.entity.StudentEntity;
import edu.sdjsjxy.jc.service.ImportJCFileDataService;
import edu.sdjsjxy.jc.util.ExcelUtils;
import edu.sdjsjxy.jc.util.FileUtil;
import org.apache.ibatis.annotations.Param;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartException;
import org.springframework.web.multipart.MultipartFile;
import javax.activation.MimetypesFileTypeMap;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
@Controller
@RequestMapping("edu/sdjsjxy/jc/importExcel")
public class ImportExcelController {
    @RequestMapping("")
    public String index() {
        return "jc/importExcel";
    }
    @Autowired
    ImportJCFileDataService importJCFileDataService;
    /**
     * http://127.0.0.1:8080/edu/sdjsjxy/jc/index
     *
     * @param file     文件
     * @param seasonNo 季号
     * @param issue    期号
     * @return
     */
    @RequestMapping(value = "file/upload", method = RequestMethod.POST)
    @ResponseBody
    public String uploadFileCOntroller(@RequestParam("file") MultipartFile file, @RequestParam("seasonNo") int seasonNo, @RequestParam("issue") int issue) {
        if (file == null) {
            return ("上传的文件不允许为空");
        }
        String filename = file.getOriginalFilename();
        try {
            if (filename.length() < 6 || !filename.substring(filename.length() - 5).equals(".xlsx")) {
                return ("文件格式错误");
            }
        } catch (MultipartException m) {
            System.out.println("前台上传错误!");
        }
        try {
            //拿到上传文件中的数据
            List<ImportJCEntity> list = ExcelUtils.excelToShopIdList(file.getInputStream());//解析并拿到上传的数据
            //拿到数据库中的学生数据
            List<StudentEntity> studentDataAll = importJCFileDataService.getDataAll();
            List<JCEntity> jcEntities = new ArrayList<>();
            for (ImportJCEntity ijcEntity : list) {
                for (StudentEntity studentEntity : studentDataAll) {
                    //拿去读过的
                    if (ijcEntity.getStudentName().equals(studentEntity.getStudentName())) {
                        JCEntity jcEntity = new JCEntity();
                        jcEntity.setStudentNumber(studentEntity.getStudentNumber());
                        jcEntity.setPhoneNumber(ijcEntity.getPhoneNumber());
                        jcEntity.setAccessTime(ijcEntity.getAccessTime());
                        jcEntity.setSeasonNo(seasonNo);
                        jcEntity.setIssue(issue);
                        jcEntities.add(jcEntity);
                    }
                }
            }
            System.out.println("读过的:" + jcEntities.size());
            //JCEntity{studentNumber='201911101057', phoneNumber='151****7915', accessTime='17-三月-2020', seasonNo=8, issue=5}
            //正在插入数据
            importJCFileDataService.insertJCFileData(jcEntities);
            System.out.println("插入数据成功");
        } catch (IOException e) {
            System.out.println("上传文件出错,错误代码:" + e.getMessage());
        }
        return ("上传成功!");
    }
    /**
     * http://127.0.0.1:8080/edu/sdjsjxy/jc/index/getJCdata?seasonNo=8&issue=5&className=软测181&pageNum=1&pageSize=10&submitState=false
     *
     * @param pageNum     第几页
     * @param pageSize    每页有多少个
     * @param seasonNo    //第几季
     * @param issue       //第几期
     * @param className   //班级名
     * @param submitState //提交状态:已阅读或为阅读人员
     * @return
     */
    @RequestMapping("getJCdata")
    @ResponseBody
    public String getJCData(@Param("pageNum") Integer pageNum, @Param("pageSize") Integer pageSize, @Param("seasnoNo") Integer seasonNo, @Param("issue") Integer issue, @Param("className") String className, @Param("submitState") String submitState) {
        JSONObject json = new JSONObject();
        if (seasonNo == null || issue == null || className == null) {
            json.put("msg", "参数不允许为空");
            return json.toString();
        }
        System.out.println("查询的状态:" + submitState);
        //利用PageHelper分页查询 注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
        PageHelper.startPage(pageNum, pageSize);
        if (submitState.equals("true")) {
            List<JCEntity> jcEntityList = importJCFileDataService.getJCSelectTrueData(seasonNo, issue, className);
            PageInfo<JCEntity> pageInfo = new PageInfo<>(jcEntityList);
            json.put("pageInfo", pageInfo);
        } else {
            List<JCEntity> jcEntityList = importJCFileDataService.getJCSelectFalseData(seasonNo, issue, className);
            PageInfo<JCEntity> pageInfo = new PageInfo<>(jcEntityList);
            json.put("pageInfo", pageInfo);
        }
        return json.toString();
    }
    /**
     * 导出
     *
     * @param seasonNo
     * @param issue
     * @param className
     * @param submitState
     * @param response
     * @param request
     * @return
     * @throws IOException
     */
    @RequestMapping(value = "/exportJCExcelFileData")
    public String excel2007(@Param("seasnoNo") Integer seasonNo, @Param("issue") Integer issue,
                            @Param("className") String className, @Param("submitState") String submitState,
                            HttpServletResponse response, HttpServletRequest request) {
        JSONObject json = new JSONObject();
        if (seasonNo == null || issue == null || className == null) {
            json.put("msg", "参数不允许为空");
            return json.toString();
        }
        //利用PageHelper分页查询 注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
        List<JCEntity> jcEntityList = null;
        if (submitState.equals("true")) {
            jcEntityList = importJCFileDataService.getJCSelectTrueData(seasonNo, issue, className);
        } else {
            jcEntityList = importJCFileDataService.getJCSelectFalseData(seasonNo, issue, className);
        }
        Workbook workbook = null;
        try {
            workbook = ExcelUtils.exportDailyBill(jcEntityList, seasonNo, issue);
            response.setHeader("Content-type", "application/vnd.ms-excel");
            response.setCharacterEncoding("UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + System.currentTimeMillis() + ".xlsx");
            workbook.write(response.getOutputStream());
            workbook.close();
        } catch (IOException e) {
            System.out.println("错误了:" + e.getMessage());
        }
        return json.toString();
    }
    /**
     * 下载导入excel模板
     * @throws IOException
     */
    @RequestMapping(value = "downModel")
    public void download( ) throws IOException {
        ServletRequestAttributes requestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletResponse response = requestAttributes.getResponse();
        String filename = "导入模板.xlsx";
        // 设置信息给客户端不解析
        String type = new MimetypesFileTypeMap().getContentType(filename);
        // 设置contenttype,即告诉客户端所发送的数据属于什么类型
        response.setHeader("Content-type",type);
        // 设置编码
        String hehe = new String(filename.getBytes("utf-8"), "iso-8859-1");
        // 设置扩展头,当Content-Type 的类型为要下载的类型时 , 这个信息头会告诉浏览器这个文件的名字和类型。
        response.setHeader("Content-Disposition", "attachment;filename=" + hehe);
        FileUtil.download(filename, response);
    }
}

工具类

import javax.servlet.http.HttpServletResponse;
import java.io.*;
public class FileUtil {
    public static void download(String filename, HttpServletResponse res) throws IOException {
        // 发送给客户端的数据
        OutputStream outputStream = res.getOutputStream();
        byte[] buff = new byte[1024];
        BufferedInputStream bis = null;
        // 读取filename
        bis = new BufferedInputStream(new FileInputStream(new File("./file/" + filename)));
        int i = bis.read(buff);
        while (i != -1) {
            outputStream.write(buff, 0, buff.length);
            outputStream.flush();
            i = bis.read(buff);
        }
        bis.close();
        outputStream.close();
    }
}

文件存放位置

模板内容

前端

导入数据之前,先下载模板

下载成功:

导出

目录
相关文章
|
28天前
|
数据采集 存储 JavaScript
自动化数据处理:使用Selenium与Excel打造的数据爬取管道
本文介绍了一种使用Selenium和Excel结合代理IP技术从WIPO品牌数据库(branddb.wipo.int)自动化爬取专利信息的方法。通过Selenium模拟用户操作,处理JavaScript动态加载页面,利用代理IP避免IP封禁,确保数据爬取稳定性和隐私性。爬取的数据将存储在Excel中,便于后续分析。此外,文章还详细介绍了Selenium的基本设置、代理IP配置及使用技巧,并探讨了未来可能采用的更多防反爬策略,以提升爬虫效率和稳定性。
|
5天前
|
前端开发 Java easyexcel
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
SpringBoot操作Excel实现单文件上传、多文件上传、下载、读取内容等功能
36 8
|
26天前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
44 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
28天前
|
easyexcel Java UED
SpringBoot中大量数据导出方案:使用EasyExcel并行导出多个excel文件并压缩zip后下载
在SpringBoot环境中,为了优化大量数据的Excel导出体验,可采用异步方式处理。具体做法是将数据拆分后利用`CompletableFuture`与`ThreadPoolTaskExecutor`并行导出,并使用EasyExcel生成多个Excel文件,最终将其压缩成ZIP文件供下载。此方案提升了导出效率,改善了用户体验。代码示例展示了如何实现这一过程,包括多线程处理、模板导出及资源清理等关键步骤。
|
21天前
|
前端开发 JavaScript API
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
前端基于XLSX实现数据导出到Excel表格,以及提示“文件已经被损坏,无法打开”的解决方法
92 0
|
26天前
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
190 0
|
3月前
|
关系型数据库 MySQL Shell
不通过navicat工具怎么把查询数据导出到excel表中
不通过navicat工具怎么把查询数据导出到excel表中
41 0
|
2月前
|
数据采集 存储 数据挖掘
使用Python读取Excel数据
本文介绍了如何使用Python的`pandas`库读取和操作Excel文件。首先,需要安装`pandas`和`openpyxl`库。接着,通过`read_excel`函数读取Excel数据,并展示了读取特定工作表、查看数据以及计算平均值等操作。此外,还介绍了选择特定列、筛选数据和数据清洗等常用操作。`pandas`是一个强大且易用的工具,适用于日常数据处理工作。
|
3月前
|
SQL JSON 关系型数据库
n种方式教你用python读写excel等数据文件
n种方式教你用python读写excel等数据文件
|
3月前
|
存储 Java Apache