Java讀取Excel數據


Java讀取Excel數據,解析文本並格式化輸出

Java讀取Excel數據,解析文本並格式化輸出

Java讀取Excel數據,解析文本並格式化輸出

下圖是excel文件的路徑和文件名

下圖是excel文件里面的內容

下面是Java讀取Excel數據的代碼

package excel_driver;

import java.util.List;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class excel_driver {
    private static List<List<String>> readXlsx(String path) throws Exception {
        InputStream is = new FileInputStream(path);
        XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
        List<List<String>> result =new ArrayList<List<String>>();
        //循環每一頁,並處理當前循環頁
        //for(XSSFSheet xssfSheet : xssfWorkbook){
        for(int numSheet=0; numSheet < xssfWorkbook.getNumberOfSheets(); numSheet++){
            XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(numSheet);
            if (xssfSheet==null)
                continue;
            //處理當前頁,循環讀取每一行
            for(int rowNum=1; rowNum<=xssfSheet.getLastRowNum();rowNum++){
                XSSFRow xssfRow = xssfSheet.getRow(rowNum);
                
                int minColIx = xssfRow.getFirstCellNum();
                int maxColIx = xssfRow.getLastCellNum();
                List<String> rowList = new ArrayList<String>();
//                System.out.println("\t");
                //遍歷該行獲取處理每個cell元素
                for(int colIx=minColIx;colIx<maxColIx; colIx++){
                    XSSFCell cell= xssfRow.getCell(colIx);
//                    System.out.println("\t");
                    if (cell==null){
//                        System.out.println("\t");
                        continue;
                    }
                    
                    rowList.add(getString.getStringVal(cell));
//                    System.out.println("\t");
                }

                result.add(rowList);
            }
        }
        return result;
    }
    
    public static void main(String[] args) throws Exception {
        List<List<String>> a = readXlsx("C:\\Users\\chenjia\\Desktop\\excel_driver.xlsx");
//        for (int i = 0; i < a.size(); i++) {
//            System.out.println(a.[i]);
//        }
        for(List list:a)
        {
            System.out.println(list);
        }
        System.out.println(a);
        System.out.println(a.size());
//        System.out.println(a.[1]);
    }
    

}

 

package excel_driver;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.xssf.usermodel.XSSFCell;

public class getString {
    public static String getStringVal (XSSFCell cell){
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_BOOLEAN:
            return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
        case Cell.CELL_TYPE_FORMULA://公式格式
            return cell.getCellFormula();
        case Cell.CELL_TYPE_NUMERIC://數字格式
            cell.setCellType(Cell.CELL_TYPE_STRING);
            return cell.getStringCellValue();
        case Cell.CELL_TYPE_STRING:
            return cell.getStringCellValue();
        

        default:
            return "????";
        }
    }

}

運行結果是:

[張三, 111111, 會計1班, 20150505, 13113131313, 4111]
[李四, 222222, 文法2班, 20160606, 15215215212, 4222]
[王五, 3333333, 英語3班, 20170707, 13313313333, 4333]
[[張三, 111111, 會計1班, 20150505, 13113131313, 4111], [李四, 222222, 文法2班, 20160606, 15215215212, 4222], [王五, 3333333, 英語3班, 20170707, 13313313333, 4333]]
3

 

 

 

下面是原文章:

相關技術

使用的POI解析Excel需要使用的jar包 
這里寫圖片描述 
注(使用的maven.我就添加了右邊的兩個依賴就可以了)

分析

解析Excel首先就要解析Excel的結構.然后用面向對象的思想分析一下 
這里寫圖片描述 
這是一個excel文件.下面我們就來分析一下如果讓你寫這個poi框架,那么你會怎么設計. 
1. 首先要有一個對象表示這整個Excel文件. 
2. 可是這個excel文件中有好多頁.Sheet1, Sheet2等等,所以我們還需要一個對象表示頁. 
3. 在頁中,有行,所以還需要一個對象表示行. 
4. 在行中,最后細分到格cell. 
5. 格cell中數據還有好多類型.有字符串,數字,時間等等.

POI中的對象與excel對象的對應

excel文件就有多種類型了.后綴有 xls 與 xlsx 
這里寫圖片描述 
所以對於不同類型的文件,就需要使用不同的poi中的對象了. 
1. 如果你要解析的是xls文件 
這里寫圖片描述 
從代碼不難發現,這里的處理邏輯是 
1>. 先用inputstream獲取excel文件的io流 
2>. 然后創建一個內存中的excel文件HSSFWorkbook類型對象.這個對象表示了整個excel文件. 
3>. 對這個excel文件的每頁做循環處理 
4>. 對每頁中的每行做循環處理. 
5>. 對每行中的每個單元格做做處理,獲取這個單元格的值. 
6>. 把這行的結果添加到一個List數組中. 
7>. 把每行的結果添加到最后的總結果中. 
8>. 解析完以后就獲取了一個List< List < String > > 類型的對象了. 
2. 如果你要處理xlsx類型的文件則 
這里寫圖片描述 
和上面一樣,我就不說了.

存在的問題

其實有時候我們希望得到的數據就是excel中的數據,可是最后發現結果不理想 
如果你的excel中的數據是數字,你會發現Java中對應的變成了科學計數法的. 
所以在獲取值的時候就要做一些特殊處理. 
這樣就能保證獲取的值是我想要的值. 
網上的做法是對於數值類型的數據格式化,獲取自己想要的結果. 
其實也沒有那么麻煩.我在做的時候突然想到了一種處理解決方案.供參考 
我們看一下poi中對於的toString()方法 
這里寫圖片描述 
該方法是poi的方法,從源碼中我們可以發現,該處理流程是 
1. 獲取單元格的類型 
2. 根據類型格式化數據並輸出.這不一下子就造成了很多不是我們想要的. 
所以我們就要改造一下這個方法例如這樣 
這里寫圖片描述 
我的做法是這樣的 
1. 對於不熟悉的類型,或者為空則返回”” 控制串. 
2.如果是數字,則修改單元格類型為String,然后返回String.這樣就保證數字不被格式化了. 
3. 雖然不知道這么做有什么后果,可是成功了. 
這里寫圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM