Java使用POI解析Excel表格

摘要:
概述Excel表格是常用的数据存储工具。在项目中经常会遇到导入和导出Excel函数。常见的Excel格式为xls和xlsx。在2007版本之后,基于XML的压缩格式主要用作默认文件格式xlsx。新格式主要使用OpenXML标准,并结合了XML和Zip压缩技术。我不在这里详述。感兴趣的读者可以自行查找相关知识。本文将重点分析这两种文件格式。Excel主要由以下部分组成:Excel

概述

Excel表格是常用的数据存储工具,项目中经常会遇到导入Excel和导出Excel的功能。
常见的Excel格式有xls和xlsx。07版本以后主要以基于XML的压缩格式作为默认文件格式xlsx。新格式主要是使用了OpenXML标准,结合了XML与Zip压缩技术。在这里就不细说,感兴趣的读者可以自行去查找相关知识。本文将重点以这两种文件格式的解析来展开。
Excel主要有以下部分组成:
一个Excel相当于一个工作簿(WorkBook);
每个sheet相当于一张表格;
sheet里面又由单元格Cell组成;

操作Excel的方式

Java提供了操作Excel的api JXL(Java Excel API),但是JXL只支持07版本以前,也就是xls后缀的Excel。因此使用中通常使用apache的POI

maven中的POI依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.1</version>
</dependency>
<!-- 07版本以后的格式 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.1</version>
</dependency>

其中最顶层接口Workbook;主要有三个实现类XSSFWorkbook、HSSFWorkbook、SXSSFWorkbook。

XSSFWorkbook

XSSFWorkbook主要用于解析xlsx。

@Test
public void testXlsx(){
        File file = new File("C:\Users\Administrator\Desktop\pdf\test.xlsx");
        if(!file.exists()){
            System.out.println("文件不存在");
            return ;
        }
        FileInputStream fis = null;
        Workbook workBook = null;
        try {
            fis = new FileInputStream(file);
            workBook = new XSSFWorkbook(fis); // 使用XSSFWorkbook
            dealWorkBook(workBook); // 将代码封装复用,见下一个方法

        } catch (Exception e) {
            e.printStackTrace();
        } finally{ //关流
            if(fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(workBook != null){
                try {
                    workBook.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
public void dealWorkBook(Workbook workBook){
        Sheet sheet = workBook.getSheetAt(0); // 获取第一个sheet
        Map<Integer, List<String>> map = new HashMap<Integer, List<String>>(); //第一个参数表示行数 第二个List保存该行的cell数据
        int i = 0;
        for(Row row : sheet){
            map.put(i, new ArrayList<String>());
            for(Cell cell : row){ // 遍历当前行的所有cell
                switch(cell.getCellType()) {
                    case STRING:
                        map.get(i).add(cell.getRichStringCellValue().getString()); // 如果是字符串则保存
                        break;
                    case _NONE:
                        break;
                    case NUMERIC:
                        map.get(i).add(cell.getNumericCellValue()+""); //将数值转换为字符串
                        break;
                    case BOOLEAN:
                        break;
                    case FORMULA:
                        break;
                    case BLANK:
                        break;
                    case ERROR:
                        break;
                }
            }
            i++;
        }
        Set<Integer> keys = map.keySet(); // 以下为遍历 Map看解析结果
        Iterator<Integer> it = keys.iterator();
        while(it.hasNext()){
            List<String> list = map.get(it.next());
            for(String s : list){
                System.out.print(s+"      ");
            }
            System.out.println();
        }
    }

运行结果如下

1.0      2.0      3.0      4.0      
a      b      c      d      
7.0      8.0      9.0      10.0      
e      f      g      h      

HSSFWorkbook

HSSFWorkbook主要用于解析xls
代码如下

    @Test
    public void testXls() throws Exception{
        File file = new File("D:\excelTest\test2.xls");
        if(!file.exists()){
            System.out.println("文件不存在");
            return ;
        }
        FileInputStream fis = new FileInputStream(file);
        Workbook workBook = new HSSFWorkbook(fis, true); // 使用HSSFWorkbook 构造函数略有不同 true表示转化成为Nodes
        dealWorkBook(workBook); // 复用上面的方法
        workBook.close();
        fis.close();
    }

解析结果如下

1.0      2.0      3.0      4.0      
a      b      c      d      
7.0      8.0      9.0      10.0      
e      f      g      h      
11.0      12.0      13.0      14.0  

本文参考了https://blog.csdn.net/holmofy/article/details/82532311

免责声明:文章转载自《Java使用POI解析Excel表格》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇手把手:使用service principal连接Azure Media Service[CSAPP-II] 链接[符号解析和重定位] 静态链接 动态链接 动态链接接口下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C#中NPOI操作excel之读取和写入excel数据

一、下载引用 下载需要引用的dll,即:NPOI.dll,NPOI.OOXML.dll,NPOI.OpenXml4Net.dll,ICSharpCode.SharpZipLib.dll(office2007版需要此dll)。 二、excel转datatable类 [csharp]view plaincopy usingSystem; usingSy...

C#实现office文档转换为PDF或xps的一些方法

这段时间一直在研究office文档转为PDF或xps格式的方法。查找了一些资料。 一下是我所知道的一些方法 代码支持任意office格式 需要安装office 2007 还有一个office2007的插件OfficeSaveAsPDFandXPS 下载地址 [url]http://www.microsoft.com/downloads/details.a...

【百度地图】显示从某站点出发的所有公交车路线

需要在一个新的地方租房子或者买房子的时候,一个重要的考虑因素就是交通是否便利,我在租房子的时候就很想知道从我周边的公交车站,能够不换乘到达哪些地方,我当时有这个需求之后上网搜,并没有找到类似的功能,而且麻烦的是,百度地图最基本的API也没有同时显示多条线路的接口,所以只能借助百度地图的覆盖层来画折线,比较麻烦。于是就用百度地图的API简单实现了一个。效果图...

导出EXCEL出现折行问题

  在项目中,导出EXCEL时,由于数据库字段中存在换行字符(可能在我们查询时仅仅可以看到的是空字符),这样在导出到EXCEL时,会出现折行显示,比如我们导出EXCEL时,从表中导出的备注(NOTE)字段里由于有换行字符,所以在我们导出的EXCEL中会出现一行数据从备注这里折成了2行,解决方法就是在数据库查询时,把这里的备注字段的换行字符给替换掉,如:RE...

python xlrd,xlwt 读写excel文件

python 读excel文件,需要xlrd库。下载地址:https://pypi.python.org/pypi/xlrd python 写excel文件,需要xlwt库。下载地址:https://pypi.python.org/pypi/xlwt/1.1.2 下载后修改扩展名为rar, 解压后安装: 安装成功后就可以引用了。如下代码: # -*- c...

如何用Apache POI操作Excel文件-----如何在已有的Excel文件中插入一行新的数据?

在POI的第一节入门中,我们提供了两个简单的例子,一个是如何用Apache POI新建一个工作薄,另外一个例子是,如果用Apache POI新建一个工作表。那么在这个章节里面,我将会给大家演示一下,如何用Apache POI在已有的Excel文件中插入一行新的数据。具体代码,请看下面的例子。 [java]view plaincopy importj...