基于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的volatile和sychronized底层实现原理解析

《Java的volatile和sychronized底层实现原理解析》文章详细介绍了Java中的synchronized和volatile关键字的底层实现原理,包括字节码层面、JVM层面的实现细节,以... 目录1. 概览2. Synchronized2.1 字节码层面2.2 JVM层面2.2.1 ente

Nginx如何进行流量按比例转发

《Nginx如何进行流量按比例转发》Nginx可以借助split_clients指令或通过weight参数以及Lua脚本实现流量按比例转发,下面小编就为大家介绍一下两种方式具体的操作步骤吧... 目录方式一:借助split_clients指令1. 配置split_clients2. 配置后端服务器组3. 配

Python Excel实现自动添加编号

《PythonExcel实现自动添加编号》这篇文章主要为大家详细介绍了如何使用Python在Excel中实现自动添加编号效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍简单的说,就是在Excel中有一列h=会有重复

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Redis 内存淘汰策略深度解析(最新推荐)

《Redis内存淘汰策略深度解析(最新推荐)》本文详细探讨了Redis的内存淘汰策略、实现原理、适用场景及最佳实践,介绍了八种内存淘汰策略,包括noeviction、LRU、LFU、TTL、Rand... 目录一、 内存淘汰策略概述二、内存淘汰策略详解2.1 ​noeviction(不淘汰)​2.2 ​LR

IDEA与JDK、Maven安装配置完整步骤解析

《IDEA与JDK、Maven安装配置完整步骤解析》:本文主要介绍如何安装和配置IDE(IntelliJIDEA),包括IDE的安装步骤、JDK的下载与配置、Maven的安装与配置,以及如何在I... 目录1. IDE安装步骤2.配置操作步骤3. JDK配置下载JDK配置JDK环境变量4. Maven配置下

使用Apache POI在Java中实现Excel单元格的合并

《使用ApachePOI在Java中实现Excel单元格的合并》在日常工作中,Excel是一个不可或缺的工具,尤其是在处理大量数据时,本文将介绍如何使用ApachePOI库在Java中实现Excel... 目录工具类介绍工具类代码调用示例依赖配置总结在日常工作中,Excel 是一个不可或缺的工http://

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel

Python中配置文件的全面解析与使用

《Python中配置文件的全面解析与使用》在Python开发中,配置文件扮演着举足轻重的角色,它们允许开发者在不修改代码的情况下调整应用程序的行为,下面我们就来看看常见Python配置文件格式的使用吧... 目录一、INI配置文件二、YAML配置文件三、jsON配置文件四、TOML配置文件五、XML配置文件

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C