基于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

相关文章

Java 正则表达式URL 匹配与源码全解析

《Java正则表达式URL匹配与源码全解析》在Web应用开发中,我们经常需要对URL进行格式验证,今天我们结合Java的Pattern和Matcher类,深入理解正则表达式在实际应用中... 目录1.正则表达式分解:2. 添加域名匹配 (2)3. 添加路径和查询参数匹配 (3) 4. 最终优化版本5.设计思

C#实现将Excel表格转换为图片(JPG/ PNG)

《C#实现将Excel表格转换为图片(JPG/PNG)》Excel表格可能会因为不同设备或字体缺失等问题,导致格式错乱或数据显示异常,转换为图片后,能确保数据的排版等保持一致,下面我们看看如何使用C... 目录通过C# 转换Excel工作表到图片通过C# 转换指定单元格区域到图片知识扩展C# 将 Excel

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

QT进行CSV文件初始化与读写操作

《QT进行CSV文件初始化与读写操作》这篇文章主要为大家详细介绍了在QT环境中如何进行CSV文件的初始化、写入和读取操作,本文为大家整理了相关的操作的多种方法,希望对大家有所帮助... 目录前言一、CSV文件初始化二、CSV写入三、CSV读取四、QT 逐行读取csv文件五、Qt如何将数据保存成CSV文件前言

Java字符串处理全解析(String、StringBuilder与StringBuffer)

《Java字符串处理全解析(String、StringBuilder与StringBuffer)》:本文主要介绍Java字符串处理全解析(String、StringBuilder与StringBu... 目录Java字符串处理全解析:String、StringBuilder与StringBuffer一、St

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Java中使用Hutool进行AES加密解密的方法举例

《Java中使用Hutool进行AES加密解密的方法举例》AES是一种对称加密,所谓对称加密就是加密与解密使用的秘钥是一个,下面:本文主要介绍Java中使用Hutool进行AES加密解密的相关资料... 目录前言一、Hutool简介与引入1.1 Hutool简介1.2 引入Hutool二、AES加密解密基础