下文介紹java解析Excel文件的方案
前置準備
1.第三方jar包或者Maven配置
org.apache.poi的jar包
Maven配置如下
? ? <groupId>org.apache.poi
? ? <artifactId>poi
? ? <version>3.15
</dependency>
分析
首先我們大概分析下,實現(xiàn)解析大概需要那幾步:
第一步、加載數(shù)據(jù)源文件
說明:把源文件以數(shù)據(jù)流的形式寫入可以操作解析Excel文件的對象中
第二步、獲取工作表頁數(shù)據(jù)
說明:利用可以操作解析Excel文件的對象,獲取工作表頁數(shù)據(jù)
第三步、獲取工作表頁中行數(shù)據(jù)
說明:工具類自帶方法獲取行數(shù)據(jù)
第四步、獲取工作表頁中指定行的指定列數(shù)據(jù)
說明:工具類自帶方法獲取列數(shù)據(jù)
實際說明
下面我們實際說明每一步所涉及到的代碼內(nèi)容,有些判斷細節(jié)就不一一列舉,請看后面的整體截圖。
第一步、加載數(shù)據(jù)源文件
//先把目標文件轉(zhuǎn)為文件流
File excel =new File("目標文件所處地址");
//創(chuàng)建輸出流對象
FileInputStream fis =new FileInputStream(excel);
//將輸出的流對象引入到解析excel文件的對象中
Workbook wb =new HSSFWorkbook(fis);
第二步、獲取工作表頁數(shù)據(jù)
?//讀取第三個工作表頁的數(shù)據(jù)(第一個工作表是0)
Sheet sheet = wb.getSheetAt(2);
第三步、獲取工作表頁中行數(shù)據(jù)
//讀取的行.如果sheet中一行數(shù)據(jù)都沒有則返回-1,只有第一行有數(shù)據(jù)則返回0,最后有數(shù)據(jù)的行是第n行則返回n-1
int firstRowIndex = sheet.getFirstRowNum();
//讀取的總的行數(shù)
int lastRowIndex = sheet.getLastRowNum();
//獲取指定行的數(shù)據(jù)
Row row = sheet.getRow(1);
可以通過for循環(huán),遍歷每一行并獲取行數(shù)據(jù),再在循環(huán)內(nèi)對列數(shù)據(jù)進行處理
第四步、獲取工作表頁中指定行的指定列數(shù)據(jù)
//當前行的第一個列數(shù)據(jù)的下標
int firstCellIndex = row.getFirstCellNum();
//row中一列數(shù)據(jù)都沒有則返回-1,只有第一列有數(shù)據(jù)則返回1,最后有數(shù)據(jù)的列是第n列則返回n
int lastCellIndex = row.getLastCellNum();
//獲取當前下標(列)的單元格數(shù)據(jù)
Cell cell = row.getCell(cIndex);
通過以上步驟就能解析到各行各列的數(shù)據(jù)值了,具體怎么存儲、使用就可以結(jié)合實際的業(yè)務場景搭配使用。
下面詳細說明下,解析過程中需要注意的一些細節(jié)點
源文件相關的一些判斷處理
//判斷是文件并且是存在的
if (excel.isFile() && excel.exists()) {
//拆分文件名和后綴
? ? String[] split = excel.getName().split("\\.");? //.是特殊字符,需要轉(zhuǎn)義
? ? //創(chuàng)建解析excel文件的對象類
? ? Workbook wb;
? ? //根據(jù)文件后綴(xls/xlsx)進行判斷
? ? if ("xls".equals(split[1])){
//創(chuàng)建輸出流對象
? ? ? ? FileInputStream fis =new FileInputStream(excel);? //文件流對象
? ? ? ? //將輸出的流對象引入到解析excel文件的對象中
? ? ? ? wb =new HSSFWorkbook(fis);
? ? }else if ("xlsx".equals(split[1])){
//將文件對象引入到解析excel文件的對象中
? ? ? ? wb =new XSSFWorkbook(excel);
? ? }else {
System.out.println("文件類型錯誤!");
return null;
? ? }