Java使用poi包讀取Excel文檔

項目須要解析Excel文檔獲取數據,就在網上找了一些資料,結合本身此次使用,寫下心得:java

一、maven項目需加入以下依賴:apache

<dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.10-FINAL</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.10-FINAL</version>
    </dependency>

 

直接上測試類,類裏有完善的註釋:數組

package shindo.Java;

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

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
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 ExcelUtil {

    public static void main(String[] args) {
        String path = "D:\\IDE\\workspace-Neon\\Java\\src\\refund.xls";
        try {
            List<List<String>> result = new ExcelUtil().readXls(path);
            System.out.println(result.size());
            for (int i = 0; i < result.size(); i++) {
                List<String> model = result.get(i);
                System.out.println("orderNum:" + model.get(0) + "--> orderAmount:" + model.get(1));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 
    * @Title: readXls 
    * @Description: 處理xls文件
    * @param @param path
    * @param @return
    * @param @throws Exception    設定文件 
    * @return List<List<String>>    返回類型 
    * @throws
    * 
    * 從代碼不難發現其處理邏輯:
    * 1.先用InputStream獲取excel文件的io流
    * 2.而後穿件一個內存中的excel文件HSSFWorkbook類型對象,這個對象表示了整個excel文件。
    * 3.對這個excel文件的每頁作循環處理
    * 4.對每頁中每行作循環處理
    * 5.對每行中的每一個單元格作處理,獲取這個單元格的值
    * 6.把這行的結果添加到一個List數組中
    * 7.把每行的結果添加到最後的總結果中
    * 8.解析完之後就獲取了一個List<List<String>>類型的對象了
    * 
     */
    private List<List<String>> readXls(String path) throws Exception {
        InputStream is = new FileInputStream(path);
        // HSSFWorkbook 標識整個excel
        HSSFWorkbook hssfWorkbook = new HSSFWorkbook(is);
        List<List<String>> result = new ArrayList<List<String>>();
        int size = hssfWorkbook.getNumberOfSheets();
        // 循環每一頁,並處理當前循環頁
        for (int numSheet = 0; numSheet < size; numSheet++) {
            // HSSFSheet 標識某一頁
            HSSFSheet hssfSheet = hssfWorkbook.getSheetAt(numSheet);
            if (hssfSheet == null) {
                continue;
            }
            // 處理當前頁,循環讀取每一行
            for (int rowNum = 1; rowNum <= hssfSheet.getLastRowNum(); rowNum++) {
                // HSSFRow表示行
                HSSFRow hssfRow = hssfSheet.getRow(rowNum);
                int minColIx = hssfRow.getFirstCellNum();
                int maxColIx = hssfRow.getLastCellNum();
                List<String> rowList = new ArrayList<String>();
                // 遍歷改行,獲取處理每一個cell元素
                for (int colIx = minColIx; colIx < maxColIx; colIx++) {
                    // HSSFCell 表示單元格
                    HSSFCell cell = hssfRow.getCell(colIx);
                    if (cell == null) {
                        continue;
                    }
                    rowList.add(getStringVal(cell));
                }
                result.add(rowList);
            }
        }
        return result;
    }

    /**
     * 
    * @Title: readXlsx 
    * @Description: 處理Xlsx文件
    * @param @param path
    * @param @return
    * @param @throws Exception    設定文件 
    * @return List<List<String>>    返回類型 
    * @throws
     */
    private 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) {
            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>();
                for (int colIx = minColIx; colIx < maxColIx; colIx++) {
                    XSSFCell cell = xssfRow.getCell(colIx);
                    if (cell == null) {
                        continue;
                    }
                    rowList.add(cell.toString());
                }
                result.add(rowList);
            }
        }
        return result;
    }

    // 存在的問題
    /*
     * 其實有時候咱們但願獲得的數據就是excel中的數據,但是最後發現結果不理想
     * 若是你的excel中的數據是數字,你會發現Java中對應的變成了科學計數法。
     * 因此在獲取值的時候就要作一些特殊處理來保證獲得本身想要的結果
     * 網上的作法是對於數值型的數據格式化,獲取本身想要的結果。
     * 下面提供另一種方法,在此以前,咱們先看一下poi中對於toString()方法:
     * 
     * 該方法是poi的方法,從源碼中咱們能夠發現,該處理流程是:
     * 1.獲取單元格的類型
     * 2.根據類型格式化數據並輸出。這樣就產生了不少不是咱們想要的
     * 故對這個方法作一個改造。
     */
    /*public String toString(){
        switch(getCellType()){
            case CELL_TYPE_BLANK:
                return "";
            case CELL_TYPE_BOOLEAN:
                return getBooleanCellValue() ? "TRUE" : "FALSE";
            case CELL_TYPE_ERROR:
                return ErrorEval.getText(getErrorCellValue());
            case CELL_TYPE_FORMULA: 
                return getCellFormula();
            case CELL_TYPE_NUMERIC:
                if(DateUtil.isCellDateFormatted(this)){
                    DateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy")
                    return sdf.format(getDateCellValue());
                }
                return getNumericCellValue() + "";
            case CELL_TYPE_STRING:  
                return getRichStringCellValue().toString();
            default :
                return "Unknown Cell Type:" + getCellType();
        }
    }*/

    /**
     * 改造poi默認的toString()方法以下
    * @Title: getStringVal 
    * @Description: 1.對於不熟悉的類型,或者爲空則返回""控制串
    *               2.若是是數字,則修改單元格類型爲String,而後返回String,這樣就保證數字不被格式化了
    * @param @param cell
    * @param @return    設定文件 
    * @return String    返回類型 
    * @throws
     */
    public static String getStringVal(HSSFCell 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 "";
        }
    }
}

 

執行以上測試類,原Excel文檔的內容以下:xss

執行後結果控制檯輸出結果以下:maven

相關文章
相關標籤/搜索