基于Apache poi hssf对xls(excel)文件进行解析

2024-05-10 00:48

本文主要是介绍基于Apache poi hssf对xls(excel)文件进行解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在美团实习的过程中,马上要做的功能有一项是前台上传文件后台获取文件对excel文件进行解析。之前做过后台从DB获取数据按照模板将查询的数据填入xls并返回给前台提供下载的功能,最后会给出一个工具类,里面包含这个功能的实现。

实现对excel文件的读写,比较主流的做法是使用Apache POI提供的各种类和方法,对Apache POI的理解可以参照这篇文章:POI基础

在对POI有足够的认识和理解后,可以预想对前台上传的文件进行解析,实际上就是在服务器端打开该文件,遍历里面的数据,将Excel里面存储的数据按照合适的对应关系存入正确的data object的field。接下来想做什么都可以了,不管是存储数据到DB或者进行相应的计算的都可以。感觉其实excel文件的结构通过POI提供的类来组织的话还比较简单,宏观的看其实一个Excel文件就是一个HSSFWorkbook类的实例,文件里的多个sheet各自对应HSSFSheet实例,每个sheet里面的一行行记录对应HSSFRow,一个个单元格就是一个个HSSFCell。

那么下面我将自己认为最主要的代码实现,在网上看到的,我做了一些修改。粘贴如下:

解析excel文件核心代码
public  class  PoiExcelParser { 
     private  Sheet sheet;     //表格类实例 
     LinkedList[] result;     //保存每个单元格的数据 ,是容器就好,看需求吧 
   
     //读取excel文件,创建表格实例 
     private  void  loadExcel(String filePath) { 
         FileInputStream inStream =  null
         try 
             inStream =  new  FileInputStream( new  File(filePath)); 
             Workbook workBook = WorkbookFactory.create(inStream); 
             sheet = workBook.getSheetAt( 0 );      //注意sheet以0开始计数          
         catch  (Exception e) { 
             e.printStackTrace(); 
         } finally
             try 
                 if (inStream!= null ){ 
                     inStream.close();    //关闭stream
                 }                 
             catch  (IOException e) {                 
                 e.printStackTrace(); 
            
        
    
     //获取某个单元格的值,统一以字符串形式返回 
     private  String getCellValue(Cell cell) { 
         String cellValue =  ""
         DataFormatter formatter =  new  DataFormatter(); 
         if  (cell !=  null ) { 
             //判断单元格数据的类型,不同类型调用不同的方法 
             switch  (cell.getCellType()) { 
                 //数值类型 
                 case  Cell.CELL_TYPE_NUMERIC: 
                     //进一步判断 ,单元格格式是日期格式  
                     if  (DateUtil.isCellDateFormatted(cell)) { 
                         cellValue = formatter.formatCellValue(cell); 
                     else 
                         //数值 
                         double  value = cell.getNumericCellValue(); 
                         int  intValue = ( int ) value; 
                         cellValue = value - intValue ==  0  ? String.valueOf(intValue) : String.valueOf(value); 
                    
                     break
                 case  Cell.CELL_TYPE_STRING: 
                     cellValue = cell.getStringCellValue(); 
                     break
                 case  Cell.CELL_TYPE_BOOLEAN: 
                     cellValue = String.valueOf(cell.getBooleanCellValue()); 
                     break
                     //判断单元格是公式格式,需要做一种特殊处理来得到相应的值 
                 case  Cell.CELL_TYPE_FORMULA: 
                     try
                         cellValue = String.valueOf(cell.getNumericCellValue()); 
                     } catch (IllegalStateException e){ 
                         cellValue = String.valueOf(cell.getRichStringCellValue()); 
                    
                     break
                 case  Cell.CELL_TYPE_BLANK: 
                     cellValue =  ""
                     break
                 case  Cell.CELL_TYPE_ERROR: 
                     cellValue =  ""
                     break
                 default
                     cellValue = cell.toString().trim(); 
                     break
            
        
         return  cellValue.trim(); 
    
   
   
   
     //初始化表格中的每一行,并得到每一个单元格的值 
     public  void  getData(){ 
         int  rowNum = sheet.getLastRowNum() +  1 ;
         result =  new  LinkedList[rowNum]; 
         for ( int  i= 0 ;i<rowNum;i++){ 
             Row row = sheet.getRow(i); 
             //每有新的一行,创建一个新的LinkedList对象 
             result[i] =  new  LinkedList(); 
             for ( int  j= 0 ;j<row.getLastCellNum();j++){ 
                 Cell cell = row.getCell(j); 
                 //获取单元格的值 
                 String str = getCellValue(cell); 
                 //将得到的值放入链表中,实际的使用过程中,也可以保存在dataobject里 
                 result[i].add(str); 
            
        
     }     

这段代码在实际工程中使用需谨慎,确保可用性,可能会做出相应的修改以适应工程的实际需要。

Update:

1.发现一个问题,就是作为解析前台上传的文件,控制用户上传的文件格式有一定难度,而前面用hssf实现的功能只对xls格式支持,如果万一用户上传的是xlsx就有问题。。。而这个问题,在很久之前就被很好的利用多态解决了,帖子链接如下:通过POI统一读取Excel文件(兼容97-2003和2007+两种格式)


 

这篇关于基于Apache poi hssf对xls(excel)文件进行解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/974963

相关文章

MySQL深分页进行性能优化的常见方法

《MySQL深分页进行性能优化的常见方法》在Web应用中,分页查询是数据库操作中的常见需求,然而,在面对大型数据集时,深分页(deeppagination)却成为了性能优化的一个挑战,在本文中,我们将... 目录引言:深分页,真的只是“翻页慢”那么简单吗?一、背景介绍二、深分页的性能问题三、业务场景分析四、

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

SpringBoot结合Docker进行容器化处理指南

《SpringBoot结合Docker进行容器化处理指南》在当今快速发展的软件工程领域,SpringBoot和Docker已经成为现代Java开发者的必备工具,本文将深入讲解如何将一个SpringBo... 目录前言一、为什么选择 Spring Bootjavascript + docker1. 快速部署与

linux解压缩 xxx.jar文件进行内部操作过程

《linux解压缩xxx.jar文件进行内部操作过程》:本文主要介绍linux解压缩xxx.jar文件进行内部操作,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、解压文件二、压缩文件总结一、解压文件1、把 xxx.jar 文件放在服务器上,并进入当前目录#

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1