Java使用POI解析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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章