一、配置需要的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()); } } } }
執行結果