前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Springboot中Excel的下载操作(二)

Springboot中Excel的下载操作(二)

作者头像
23号杂货铺
发布2019-09-27 16:26:45
7370
发布2019-09-27 16:26:45
举报
文章被收录于专栏:23号杂货铺23号杂货铺

培养一门兴趣,是踏往成功之路的基石。 —— 23号老板

原创:凌空夜望,CSDN

最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内容生成Excel文件,并下载下来。本篇主要是介绍Excel文件的生成以及下载,使用的开发工具是IDEA 。关于Excel文件的生成请移步SpringBoot项目中关于Excel的解析(一)

内容概要:

  • 项目maven依赖
  • Controller层代码
  • 工具类HandleFile代码
  • 静态页面和测试文件
  • 下载的Excel文件

一、项目maven依赖

需要注意的是:这里选择的poi-ooxml和poi的依赖版本最好一致,否则可能会有两个依赖会出现不匹配的问题。本人曾遇到过poi-ooxml的版本是3.9,poi的版本是3.13,最终在测试阶段报错:

java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log(ILjava/lang/Object;)V from class org.apache.poi.openxml4j.opc.PackageRelationshipCollection

代码语言:javascript
复制
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.9</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>

二、Controller层

代码语言:javascript
复制
@RestController
@RequestMapping("/handleFile/")
@Slf4j
public class HandleFileController{

    /**
     * excel生成下载
     * @param response
     * @return
     * @throws Exception
     */
   @GetMapping(value = "/createExcel")
    public String createExcel(HttpServletResponse response) throws Exception{
            Map<String,Object> excelMap = new HashMap<>();
        //1.设置Excel表头
        List<String> headerList = new ArrayList<>();
        headerList.add("用户id");
        headerList.add("用户名");
        headerList.add("性别");
        headerList.add("身份证号");
        headerList.add("注册时间");
        excelMap.put("header",headerList);
        //2.是否需要生成序号,序号从1开始(true-生成序号 false-不生成序)
        boolean isSerial = false;
        excelMap.put("isSerial",isSerial);
        //3.sheet名
        String sheetName = "统计表";
        excelMap.put("sheetName",sheetName);
        //4.需要放入Excel中的数据
        Map<String,Object> map = new HashMap<>();
        map.put("gender","男");
        List<User> rows = userMapper.selectUserInfo(map);
        List<List<String>> data= new ArrayList<>();
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        for (User user:rows){
            //所有的数据顺序必须和表头一一对应
            //list存放每一行的数据(让所有的数据类型都转换成String,这样就无需担心Excel表格中数据不对)
            List<String> list = new ArrayList<>();
            list.add(String.valueOf(user.getId()));
            list.add(String.valueOf(user.getUsername()));
            list.add(String.valueOf(user.getGender()));
            list.add(String.valueOf(user.getNationalId()));
            list.add(String.valueOf(format.format(user.getCreateTime())));
            //data存放全部的数据
            data.add(list);
        }
            excelMap.put("data",data);
        //Excel文件内容设置
        HSSFWorkbook workbook = HandleFile.createExcel(excelMap);
        String fileName = "导出excel例子.xls";
        //生成excel文件
        HandleFile.buildExcelFile(fileName, workbook);
        //浏览器下载excel
        HandleFile.buildExcelDocument(fileName,workbook,response);
        return "down excel";
    }
}

上述代码中:List<User> rows = userMapper.selectUserInfo(map);

数据内容是直接从数据库中查取的,具体实现较简单这里就不做代码详细展示。只展示下图数据库具体查询的内容。

三、HandleFile工具类

代码语言:javascript
复制
/**
 * 解析Excel文件
 *
 * @param in
 * @param fileName
 */
public static List<List<Object>> parseExcel(InputStream in, String fileName) throws Exception {
            List list = null;
        Workbook work = null;
        list = new ArrayList<>();
        //创建Excel工作薄
        work = getWorkbook(in, fileName);
        if (null == work) {
                throw new Exception("创建Excel工作薄为空!");
        }
            Sheet sheet = null;
        Row row = null;
        Cell cell = null;
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
                sheet = work.getSheetAt(i);
        if (sheet == null) {
                continue;
        }

            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
            if (row == null || row.getFirstCellNum() == j) {
                continue;
        }

            List<Object> li = new ArrayList<>();
        for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
                cell = row.getCell(y);
            li.add(cell);
        }
            list.add(li);
        }
        }
        return list;
}

四、测试结果

直接在浏览器中访问路径地址:

下载的Excel文件:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 23号杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档