专栏首页23号杂货铺Springboot中Excel的解析操作(一)

Springboot中Excel的解析操作(一)

机遇与挑战并存,努力的人会更加幸运。相信。 —— 23号老板

原创:凌空夜望,CSDN

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

内容概要:

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

一、项目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

    <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层

 /**
 * 上传Excel文件
 * @param request
 * @return
 * @throws Exception
 */
@PostMapping(value = "excel/upload")
@ResponseBody
public String uploadExcel(HttpServletRequest request) throws Exception {
    MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;

    MultipartFile file = multipartRequest.getFile("filename");
    if (file.isEmpty()) {
        return "文件不能为空";
    }
    InputStream inputStream = file.getInputStream();
    List<List<Object>> list = HandleFile.parseExcel(inputStream,file.getOriginalFilename());
    inputStream.close();

    for (int i = 0; i < list.size(); i++) {
        List<Object> lo = list.get(i);
        //TODO 随意发挥
        //可以将数据遍历出来后,存储到数据库中
        System.out.println(lo);

    }
    return "上传成功";
}

三、HandleFile工具类

/**
 * 解析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;

}

四、测试:增加静态页面和测试文件

目录结构:

静态页面:index.html

测试文件:test.xlsx

注意:访问静态页面的前端端口是在下图定义的,和访问项目的端口不是同一个

具体的访问路径是:http://localhost:8081/自己的项目名/templates/index.html

五、最终测试的结果:

本文分享自微信公众号 - 23号杂货铺(sharontang0323),作者:bboyHan

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-01-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Springboot中Excel的下载操作(二)

    最近在做SpringBoot项目,项目中需要上传Excel文件,对Excel文件中的内容进行解析,然后将需要的数据存入数据库,同时还要根据用户的需求,将需要的内...

    23号杂货铺
  • Java之自定义排序工具类

    在项目开发中,经常会遇到需要对一个复杂对象的集合进行规则排序,可能需要根据某一字段排序,也可能需要根据某些字段排序,导致冗余的代码看起来既复杂又繁琐。因此,我们...

    23号杂货铺
  • 数据分析之路—数据的描述性统计

    数据的集中趋势描 述是寻找反映事物特征的数据集合的代表值或中心值,这个代表值或中 心值可以很好地反映事物目前所处的位置和发展水平,通过对事物集中 趋势指标的多次...

    23号杂货铺
  • 如何插入或 Visio 中粘贴的 Excel 工作表

    嵌入或链接 Excel 工作表通过对象命令在插入菜单上的绘图在 Visio loadTOCNode(2, 'summary'); 使用 插入 菜单上 对象 命...

    cloudskyme
  • 后缀数组(suffix array)在字符串匹配中的应用

    首先抛出一个问题: 给定300w字符串A, 之后给定80w字符串B, 需要求出 B中的每一个字符串, 是否是A中某一个字符串的子串. 也就是拿到80w个boo...

    呼延十
  • python 枚举法选择最优策略参数

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡
  • 利用FFmpeg对火眼一体摄像机的回调数据进行处理:YUV转H264,H264封装flv,所有输入都是在内存中。

    整个工程代码下载地址 http://download.csdn.net/download/gongluck93/10175326 Code //#define ...

    _gongluck
  • 如何像巫师那样隔空操作——聊聊迷你雷达的原理和应用

    用户1737318
  • 2728 整数帝国问题

    2728 整数帝国问题 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 白银 Silver 题目描述 Description   ...

    attack
  • Linux内核的冷热缓存

    如果是CPU发起的,在CPU的硬件缓存中,就会保存相应的页内容。如果这个页本来没有存在于硬件缓存中,那么它的到来,势必会将原本为其他的页缓存的内容挤出硬件缓存。

    233333

扫码关注云+社区

领取腾讯云代金券