Java-讀取Excel


一、配置需要的jar包

1、需要在pom.xml中配置需要使用的包:org.apache.poi

    <!--poi-->
    <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>
    <!--poi-end-->

2、配置完成后,點擊Maven-install,Maven會自動下載包

二、准備一個Excel,數據如下

三、第一種實現方式:使用List<List<String>>來存放讀取的數據

1、創建一個java類:ExcelUtil

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.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.*;

import java.io.*;
import java.util.*;

public class ExcelUtil {
    Member member = new Member();

    public static List<List<String>> getExcel(String filePath, String sheetName) {
        List<List<String>> dataList = new ArrayList<>();//用來存放從Excel中讀取的數據
        Workbook wb = null;
        try {
            InputStream is = new FileInputStream(filePath);//打開Excel文件
            wb = WorkbookFactory.create(is);//創建一個Workbook對象
            is.close();//關閉輸入流
            if (wb != null) {
                Sheet sheet = wb.getSheet(sheetName);//根據sheet頁的名字來獲取sheet對象
                //Sheet sheet = wb.getSheetAt(0);//獲取下標為0的sheet頁
                int maxRownum = sheet.getLastRowNum();//獲取的是最后一行的編號(編號從0開始)。
                //int maxRownum = sheet.getPhysicalNumberOfRows();//獲取的是物理行數,也就是不包括那些空行(隔行)的情況。
                Row firstRow = sheet.getRow(0);//獲取第一行的row對象
                int maxColnum = firstRow.getPhysicalNumberOfCells();//獲取第一行的最大列的下標
                System.out.println(maxColnum);
                for (int i=0;i<=maxRownum;i++){//循環行
                    List<String> list = new ArrayList<>();//創建一個list用來存放每一行的值
                    String estr ="";//用來存放單元格的值
                    for (int j=0;j<maxColnum;j++){//循環列
                        if (sheet.getRow(i).getCell(j) != null) {//判斷單元格是否為空
                            estr = sheet.getRow(i).getCell(j).toString();//取出這個單元格的值
                        }else {
                            estr="";
                        }
                        //System.out.println(firstColumns+"---"+estr);
                        list.add(estr);//把單元格的值放到list里
                    }
                    dataList.add(list);//list添加到list里
                }
                //System.out.println(dataList);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dataList;//返回list
    }
}

2、寫一個ExcelTest類來測試

import java.util.List;

public class ExcelTest {
    public static void main(String[] args) {
        String filePath = "/Users/renli/PycharmProjects/untitled/testFile/SendCredit.xlsx";//Excel存放的路徑(我的電腦是macbook所以沒有盤符)
        String sheetName = "Sheet1";//需要獲取的sheetName
        List<List<String>> rows = ExcelUtil.getExcel(filePath, sheetName);//調用getExcel方法,獲取到一個List<List<String>>
        //System.out.println(rows);
        //System.out.println(rows.size());

        for (List<String> list:rows) {
            System.out.println(list.get(0) + "---->" + list);
            int i = 0;
            for (String s : list) {
                System.out.println("測試編碼為 " + list.get(0) + " 的第 " + (i + 1) + " 個值:" + s);
                i++;
            }
        }
    }
}

執行結果

三、第二種實現方式:使用Map<String, List<String>>來存放讀取的數據

1、創建一個java類:ExcelUtil

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.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

import java.io.*;
import java.util.*;

public class ExcelUtil {

    public static Map<String, List<String>> getExcel(String filePath, String sheetName) {
        Map<String, List<String>> dataList = new HashMap<>();//用來存放從Excel中讀取的數據
        Workbook wb = null;
        try {
            InputStream is = new FileInputStream(filePath);//打開Excel文件
            wb = WorkbookFactory.create(is);//創建一個Workbook對象
            is.close();//關閉輸入流
            if (wb != null) {
                Sheet sheet = wb.getSheet(sheetName);//根據sheet頁的名字來獲取sheet對象
                //Sheet sheet = wb.getSheetAt(0);//獲取下標為0的sheet頁
                //int rows = sheet.getLastRowNum();//獲取的是最后一行的編號(編號從0開始)。
                int maxRownum = sheet.getPhysicalNumberOfRows();//獲取的是物理行數,也就是不包括那些空行(隔行)的情況。
                Row firstRow = sheet.getRow(0);//獲取第一行的row對象
                int maxColnum = firstRow.getPhysicalNumberOfCells();//獲取第一行的最大列的下標
                //System.out.println(maxColnum);
                for (int i=0;i<maxRownum;i++){//循環行
                    List<String> list = new ArrayList<>();//創建一個list用來存放每一行的值
                    String firstColumns = sheet.getRow(i).getCell(0).toString();//獲取每一行的第一列的值,用來做map的Key
                    String estr ="";//用來存放單元格的值
                    for (int j=0;j<maxColnum;j++){//循環列
                        if (sheet.getRow(i).getCell(j) != null) {//判斷單元格是否為空
                            estr = sheet.getRow(i).getCell(j).toString();//取出這個單元格的值
                        }else {
                            estr="";
                        }
                        //System.out.println(firstColumns+"---"+estr);
                        list.add(estr);//把單元格的值放到list里
                    }
                    dataList.put(firstColumns,list);//把list存放到map里
                }
                //System.out.println(dataList);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return dataList;//返回map
    }
}

2、寫一個ExcelTest類來測試

import java.util.List;
import java.util.Map;

public class ExcelTest {
    public static void main(String[] args) {
        String filePath = "/Users/renli/PycharmProjects/untitled/testFile/SendCredit.xlsx";//Excel存放的路徑(我的電腦是macbook所以沒有盤符)
        String sheetName = "Sheet1";//需要獲取的sheetName
        Map<String, List<String>> rows = ExcelUtil.getExcel(filePath, sheetName);//調用getExcel方法,獲取到一個Map<String, List<String>>
        //System.out.println(rows);
        //System.out.println(rows.size());

        //第一種方式:推薦,尤其是容量大時
        System.out.println("\n通過Map.entrySet遍歷key和value");
        for (Map.Entry<String, List<String>> entry : rows.entrySet()) {
            String key = entry.getKey();
            List<String> list = entry.getValue();
            System.out.println(key + "---->" + list);
            int i = 0;
            for (String s : list) {
                System.out.println("測試編碼為 " + key + " 的第 " + (i + 1) + " 個值:" + s);
                i++;
            }
        }

        //第二種方式:普通使用,二次取值(性能差)
        System.out.println("\n通過Map.keySet遍歷key和value:");
        for (String key : rows.keySet()) {//取出Map中所有的Key的值,遍歷
            System.out.println(key + "---->" + rows.get(key));
            List<String> list = rows.get(key);//取出Map中Key為key的value的值,賦值給一個list
            for (int i = 0; i < list.size(); i++) {//循環遍歷list
                //list.get(i)根據下標獲取值
                System.out.println("測試編碼為 " + key + " 的第 " + (i + 1) + " 個值:" + list.get(i).toString());
            }
        }
    }
}

執行結果


免責聲明!

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



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