Excel 解析,通过Excel的地址和MultipartFile进行解析

2023-10-26

目录

两种方法都用到了read()和getValue()方法对数据进行解析,只是二者传入的Excel数据格式不一样。

第一种方法:通过Excel地址进行解析Excel的数据

第二种方法:解析Excel的MultipartFile数据流获取数据。 

HSSFWorkbook

操作Excel2003以前(包括2033)的版本,扩展名是 .xls    行数限制65535行,超出会报错;

XSSWorkbook

操作Excel2007以后的版本,扩展名是 .xlsx;  最多104万行,  回出现OOM的内存溢出问题;

1.通过Excel的地址来进行解析Excel的数据 

导入pom文件

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.15</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml</artifactId>
      <version>3.15</version>
    </dependency>

第一种方法:通过Excel地址进行解析Excel的数据


//使用Excel的path地址进行解析
public static void main(String[] args){
    String excelPath="c:\\*\\*.xlsx";
    File excel = new File(excelPath);
    if(excel.isFile() && excel.exists()){
    List<Map> array = null;
    try {
                String[] split = excel.getName().split("\\.");
                Workbook work =null;
                if ( "xlsx".equals(split[1])){
                    work = new XSSFWorkbook(new FileInputStream(excel));
                }else if ("xls".equals(split[1])){
                    POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(excel));
                    work =new HSSFWorkbook(poifsFileSystem);
                }
                array = read(work);
                List<Map> sheet1 =  array;

                //System.out.println(sheet1);
            } catch (IOException e) {
                e.printStackTrace();
            }
}
}
 public static List<Map> pathExcel(String path){
        File excel= new File(path);
        if(excel.isFile() &&excel.exists()){
            List<Map> array = null;
            String[] split= excel.getName().split("\\.");
            try {
            Workbook workbook =null;
            if("xlsx".equals(split[1])){
                workbook = new XSSFWorkbook(new FileInputStream(excel));
            }else if("xls".equals(split[1])){
                POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(excel));
                workbook =new HSSFWorkbook(poifsFileSystem);
            }
            array =read(workbook);
            return array;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

第二种方法:解析Excel的MultipartFile数据流获取数据。 

//使用MultipartFile 流进行的Excel的解析
public static List<Map> IOexcel(MultipartFile file){
        //流要转换整文件
        File file1= mutipartFile(file);
        List<Map> array =null;
        try {
        String fileName =file.getName().toLowerCase();
            Workbook work =null;
        if (fileName.endsWith(XLSX)){
            work = new XSSFWorkbook(new FileInputStream(file1));
        }else if (fileName.endsWith(XLS)){
            POIFSFileSystem poifsFileSystem = new POIFSFileSystem(new FileInputStream(file1));
            work =new HSSFWorkbook(poifsFileSystem);
        }else{
            return array;
        }
            array = read(work);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return array;
    }
//MultipartFile转换成为File
 public static File mutipartFile(MultipartFile file){
        File toFile = null;
        if(file.equals("")||file.getSize()<=0){
            file =null;
        }else {
            InputStream InputStream = null;
            try {
                InputStream = file.getInputStream();
                toFile =new File(file.getOriginalFilename());
                inputStreamToFile(InputStream,toFile);
                InputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return toFile;
    }

 //获取流文件
    private static void inputStreamToFile(InputStream inputStream, File file) {
        OutputStream os =null;
        try {
            os = new FileOutputStream(file);
            int bytesRead =0;
            byte[] butter =new byte[1024];
            while((bytesRead = ins.read(butter, 0,1024))!=-1){
                os.write(butter,0,bytesRead);
            }
                os.close();
                inputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                os.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

public static void deleteTempFile(File file){
    if(file != null){
        File del = new File(file.toURI());
        del.delete
    }
}

 解析Excel中的数据

private static List<Map>  read(Worknook book) throws IOException{
    List<Map> list= new ArrayList<>();
    for(int i=0;i<book.geNumberOfSheets();i++){
        Sheet sheet = book.getSheetAt(i);
        int rowStart =sheet.getFirstRowNum(); //首行下标
        int rowEnd =sheet.getLastRowNum(); //尾行下标
        
        Row firstRow =sheet.getRow(rowStart);
        int cellStart = firstRow.getFirstCellNum();  //获取一行中的开始索引
        int cellEnd = firstRow.getLastCellNum();// 获取一行中的结束索引
        Map<Integer,String> keyMap =new HashMap<>();
        for(int j= cellStart;j<cellEnd;j++){
            // 对表头数据进行解析 获取当前单元格中的数据
            String val = getValue(firstRow.getCell(j));
            if(val == null || val.trim().length == 0){    //val.trim() 去除空格
            cellEnd = j;
            break;
            }
            keyMap.put(j,val);
    }    
    if(keyMap.isEmpty()){
        return (JSONArray) Collections.emptyList();
    }
    //获取每行JSON对象的值
    List<Map> array = new ArrayList<>();
    //如果首行与尾行相同,表明只有一行,返回表头数据
    if(rowStart == rowEnd){
        Map<Object,String> object = new HashMap<>();
        for(int i: keyMap.keySet()){
        object.put(keyMap.get(i),"");
        }
        array.add(object);
    }
    //解析表中全部数据
    for(int i= rowStart+1;i<=rowEnd;i++){
        Row eachRow = Sheet.getRow(i);
        Map<Object,String> obj =new HashMap<>();
        StringBuffer sb =new StringBUffer();
        for(int k = cellStart;k<cellEnd;k++){
            if(eachRow != null){
            String val =getValue(eachRow.getCell(k));
            sb.append(val);//所有数据添加到里面,用于判断该行是否为空
            obj.put(keyMap.get(k),val);
        }
        }
     if(sb.toString().length()>0){
        array.add(obj);
    }
    }
    Map map = new HashMap();
    map.put("sheet",array);
    list.add(map);
    }
    return list;
}

获取单元格的数据 

//获取单元格数据
 private static String getValue(Cell cell){
        // 空白或空
        if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK ) {
            return "";
        }
        // 布尔值 CELL_TYPE_BOOLEAN
        if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) {
            return cell.getBooleanCellValue()+"";
        }
        //  数字 类型
        if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) {
            if (HSSFDateUtil.isCellDateFormatted(cell)) {
                Date date = cell.getDateCellValue();
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return df.format(date);
            }
            cell.setCellType(Cell.CELL_TYPE_STRING);
            String val = cell.getStringCellValue()+"";
            val = val.toUpperCase();
            if (val.contains("E")) {
                val = val.split("E")[0].replace(".", "");
            }
            return val;
        }
        //  公式 CELL_TYPE_FORMULA
        if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
            return cell.getCellFormula();
        }
        // String类型
        if (cell.getCellType() == Cell.CELL_TYPE_STRING) {
            String val = cell.getStringCellValue();
            if (val == null || val.trim().length() == 0) {
                return "";
            }
            return val.trim();
        }
        
        //  错误 CELL_TYPE_ERROR
        if(cell.getCellType() == CELL_TYPE_ERROE){
            return "错误";
        }
            
        return "";
    }

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Excel 解析,通过Excel的地址和MultipartFile进行解析 的相关文章

  • 从 java servlet 运行长进程的最佳方法是什么?

    我想问从 java servlet 运行长进程的最佳方法是什么 我有一个网络应用程序 当客户端发出请求时 它会运行一个 servlet 该 servlet 应该从请求中获取一些参数 然后运行一个进程 这个过程可能需要很长时间 所以我需要单独
  • Maven:在项目之间共享源

    我有两个项目 它们是一个共同父项目的子项目 还有一个生成器项目和生成器对应的maven插件项目 此外 两个子项目都使用相同的输入文件 该文件用于代码生成 parent pom child1 jar src main generator in
  • 如何设置评分栏的星星颜色?

    如何设置评分栏的星星颜色 我想要黄色星星 最简单的方法 android progressTint color color 光滑有光泽
  • 禁用特定的 ServletContextListener 以防止在 tomcat 上启动

    我的项目正在使用spring boot with webflux tomcat 我有一个内部库类 它是ServletContextListener WebListener public class DevIoServletContextLi
  • Java程序在没有定义main方法的情况下如何运行?

    我正在浏览一些 Java 源代码并注意到main方法未定义 Java如何编译源码却无从下手 The main方法仅在 Java 虚拟机执行代码时使用 没有 a 则无法执行代码main方法 但仍然可以编译 编译代码时 通常在命令行上指定一组文
  • Servlet 包含 Tomcat 中的 HTTP 标头

    我有一个 servlet 它的请求调度程序包含另一个 servlet 包含的 servlet 设置了我想在包括小服务程序 因此 我在 include 方法中传入一个自定义 HTTPResponse 对象 该对象捕获来自 servlet 的所
  • GWT 和 Web 服务 (wsdl)

    谁能告诉我一种从 GWT 客户端访问 WSDL Web 服务的方法 这可能吗 Thanks 智能网关 http www smartclient com product index jsp支持 WSDL 数据源 除此之外 您始终可以将 WSD
  • 我的代码中出现 ArrayIndexOutOfBoundsException 的原因是什么?

    我正在 Java 中实现凸包的格雷厄姆扫描算法 我在运行代码时收到此错误 对于输入字符串 10 18 Exception in thread main java lang ArrayIndexOutOfBoundsException 0 a
  • 更改单击后退按钮上的 BottomNavigationView 图标

    在我的布局的底部有一个底部导航视图与三个片段 如果我单击后退按钮 片段将切换 但底部图标不会切换 我该如何修复它 addToBackStack 有效 也许您有一些关于美化代码的建议 在活动或片段中添加片段标签是一个好的做法吗 public
  • Swing 是否支持 Windows 7 风格的文件选择器?

    我刚刚添加了一个标准 打开文件 与我正在编写的一个小型桌面应用程序的对话 基于JFileChooserSwing 教程的入口 http download oracle com javase tutorial uiswing componen
  • 在 JSON 转换为 CSV 期间保持 JSON 键的顺序

    我正在使用此处提供的 JSON 库http www json org java index html http www json org java index html为了将 json 字符串转换为 CSV 但我遇到的问题是 转换后键的顺序
  • 如何设置 Eclipse 以停止发生异常的线路?

    如何设置 Eclipse 在发生异常时停止 我有一个 Eclipse 断点设置来在异常时中断 在下面的代码示例中 我遇到的问题是 Eclipse 尝试打开 Integer 源代码 有没有办法让调试器在我的代码示例中显示的位置中断 如果我向下
  • 当从搜索表单动态构建 WHERE 子句时,如何防止 SQL 注入?

    我知道在 Java 中保护 SQL 查询免受 SQL 注入的唯一真正正确的方法是使用准备好的语句 然而 这样的语句要求基本结构 选择的属性 连接的表 WHERE条件的结构 不会改变 我这里有一个 JSP 应用程序 其中包含一个带有大约十几个
  • 将 XML 转换为 Java 对象 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • GAE、JPA、XG 事务、实体组过多异常

    我知道 GAE 上的 XG 交易有 5 个实体组的限制 但我认为我在一项交易中仅使用 3 个组 商品 类别 商品类别 但仍然遇到此异常 引起原因 java lang IllegalArgumentException 在单个事务中对太多实体组
  • 编写代码以:启动 R 会话、运行 R 脚本、终止会话、重复

    我正在寻找一种简单的 设置后就忘记它 的方式 无论是作为终端中的单个参数字符串还是简单的 Java 程序 来自动执行以下操作 1 启动R会话 2 告诉 R 源 R 文件包含冗长的并行模拟代码 3 完成后终止R会话 4 开始一个新的R会话 5
  • Spring Data 中 IQueryable 的等效项

    我习惯了 Net 和 LINQtoEntities 尤其是 IQueryable 部分 它允许在获取结果之前通过不同的函数传送请求 Spring数据中是否存在类似的东西 或者任何其他 java ORM 我希望能够做的基本示例 private
  • Android:如何获取小数点后的两位数?不想截断值

    如何获取小数点后仅两位数的双精度值 例如 如果 a 190253 80846153846 那么结果值应该像 a 190253 80 尝试 我尝试过这个 public static DecimalFormat twoDForm new Dec
  • struts2中如何访问url参数

    我正在做一个struts2项目 我在项目中创建了 url 并使用标签传递了参数 我的问题是如何读取操作中的参数 另外 如果执行相同的操作 我将能够将参数视为查询字符串 我问是因为我无法做到 而且我在其中一个教程中看到了它 通常 您将通过使用
  • 使用 jar 外部的配置启动 .jar,但能够从任何当前目录执行此操作

    我一直在努力解决一个特定的问题 我在 jar 文件中有一个 Java 程序 并且在 jar 之外有一个 lib 目录和一个 config 目录 但与 jar 本身所在的目录位于同一目录中 我正在尝试参考config foo config从代

随机推荐

  • C/C++和Python混合编程

    1 首先需要下载python源代码进行编译 源代码编译的过程访问如下链接 编译python源码 2 创建一个win32控制台项目 项目名称为 InvokePython 如图 3 然后将python源代码中的Include文件夹拷贝到该项目
  • 天线长度计算

    首先 理想天线的长度是半波长 平时说的四分之一波长天线 实际上需要考虑 地 才能构成完整的天线 也就是我们常说的 非平衡天线 天线本身只是天线的一部分 天线长度是波长的四分之一 波长 光速c 频率f 1 如 5GHz wifi天线长度计算
  • 二进制转换

    我们平时使用的十进制 十进制转二进制 整数情况 11表示成二进制数 11 2 5 余 1 5 2 2 余 1 2 2 1 余 0 1 2 0 余 1 得0结束 11的二进制表示为 从下往上 1011 小数情况 0 9表示成二进制数 0 9
  • DLNA协议

    一 DLNA协议 多屏互动技术的核心 dlna协议 利用网络技术 有线或者无线 将各种各样的设备互联 通过标准的协议 主流的是dlna协议 进行数据交互 实现媒体资源共享 比如 生活中常用的视频投屏技术 dlna协议提供的是设备互联资源共享
  • 2022 第十三届蓝桥杯大赛软件赛决赛, 国赛,C/C++ 大学B组题解

    2022 第十三届蓝桥杯大赛软件赛决赛 国赛 C C 大学B组题解 文章目录 第1题 2022 5分 第2题 钟表 5分 第3题 卡牌 10分 第4题 最大数字 10分 第5题 出差 15分 第6题 费用报销 15分 第7题 故障 20分
  • 【进程间通信 之 通信的建立】

    目录 前言 进程间通信的目的 进程间通信的方式 管道 1 匿名管道 简单示例1 消息传输 五个特性 四种场景 简单示例2 进程控制 对管道的深入理解 2 命名管道 简单示例3 不相关进程间通信 system V 共享内存 简单示例4 通知事
  • loadrunner11目标场景

    目标场景 设置一个运行目标 通过Controller的自动加载功能进行自动化负载 如果测试的结果达到目标 说明系统的性能符合测试目标 否则就提示无法达到目标 编辑目标场景 目标类型有5种
  • python-图像边缘化处理

    本文由本人原创 仅作为自己的学习记录 主要利用Sobel 用作边缘检测 它是一离散性差分算子 用来运算图像亮度函数的灰度值 在图像的任何一点使用此算子 将会产生对应的灰度矢量或是其法矢量 Sobel边缘检测通常带有方向性 可以只检测竖直边缘
  • 【Linux0.11 源码历险记 2】《保护模式》

    继续跟着stup s 来看 lidt idt 48 load idt with 0 0 lgdt gdt 48 load gdt with whatever appropriate idt 48 word 0 idt limit 0 wor
  • 【Unity】 2D 游戏 库存模块实现

    库存模块主要参考了 youtube 上的视频 BMo 的 Flexible INVENTORY SYSTEM in Unity with Events and Scriptable Objects 和 Simple Inventory UI
  • DVWA SQL injection

    low 猜测表名 1 union select 1 group concat table name from information schema tables where table schema dvwa 如果出现问题 到MySQL里将
  • Java常用对象API——基本数据类型对象包装类

    基本数据类型对象包装类 为了方便操作基本数据类型值 将其封装成了对象 在对象中定义了属性和行为丰富了该数据的操作 用于描述该对象的类就称为基本数据类型对象包装类 byte Byte short Short int Integer long
  • EXCEL中数据透视表的(空白)如何不显示,并且不影响数据更新

    或许有碰到同样问题的 希望对大家有所帮助 1 数据透视表更新过来的数据显示 空白 不好看 开始将用户做了筛选 将空白的复选框去掉 可以达到效果 但是发现有数据更新时 新的数据不能被同步显示 除非手动去再次筛选用户将除空白外的数据勾选 2 点
  • Ble Mesh的Heatbeat(心跳)&地址&Model(模型)

    心跳 将节点配置为定期发送称为心跳消息的消息 Heartbeat 消息的目的 1 表示该节点仍然处于活动状态 2 允许根据传递 Heartbeat 消息所需的跳数确定其与接收者的距离 Heartbaeat的opcode 和Friend re
  • 主存储器的基本组成

    主存储器的基本组成 存储体 存储体也叫存储矩阵 是由一个个存储0或1的记忆单元 存储元 构成的 为了存取存储体中的信息 必须对存储单元进行编址 编址单位是指具有相同地址的那些存储元件构成的一个单位 常见有按字节编址 寻址访存 CPU首先把被
  • C#集合(泛型集合与非泛型)

    每日一句 自律 努力 方法 坚持 时间 优秀 集合特点 一种数据容器 一种数据结构 容纳多个数据 大小可变 空间不一定连续 命名空间 非泛型集合 System Collections 非泛型集合 System Collections Gen
  • 动态博客系统

    Halo 是我折腾过的众多博客系统里面 最好 最容易上手的动态博客系统之一 solo 也是 轻快 简洁 功能强大 正文 上周末正在募集团队一起写算法题 群里讨论需要一个网站来存放文章 恰巧我有一个已经备案但闲置的域名 马上开干 之前的网站是
  • 解惑React之this.setState({ [name]: value })

    react之this setState name value 疑问 学习React中文官方文档中的非空组件与受控组件中 遇到如下代码 class Reservation extends React Component constructor
  • 【面试系列】重排链表

    题意 原题链接 思路 快慢指针找到中点 或者先遍历得到长度 再遍历一半也可行 反转后半部分 归并两部分 代码 Definition for singly linked list struct ListNode int val ListNod
  • Excel 解析,通过Excel的地址和MultipartFile进行解析

    目录 两种方法都用到了read 和getValue 方法对数据进行解析 只是二者传入的Excel数据格式不一样 第一种方法 通过Excel地址进行解析Excel的数据 第二种方法 解析Excel的MultipartFile数据流获取数据 H