讀取Excel數據

讀取Excel技術說明
                                                  
一、項目情況


       巴斯夫項目需要實現Excel的相關操作:Excel的上傳讀取。


二、添加依賴
<!-- 讀取excel用到的-->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.15</version>
</dependency>
<!--是java開發者用到的一個組件,這個組件可以完美解決讀取excel時報錯的問題,加載後就可以進行word、excel文檔的讀取操作了-->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml-schemas</artifactId>
   <version>3.15</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.15</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-scratchpad</artifactId>
   <version>3.2-FINAL</version>
</dependency>




三、讀取Excel的原理
第一步:在Controller層使用MultipartFile 獲取上傳的文件。
第二步:獲取上傳文件的文件名稱,並保存到服務器本地。使用POIUtil工具類的readExcelFromWorkbook方法讀取excel對象的數據。


//獲取excel文件名稱
String realFileName = excelFile.getOriginalFilename();
//將excel文件轉爲輸入流
InputStream is = excelFile.getInputStream();
//保存文件(上傳到本地),返回文件全路徑名
String wholefilename = testService.saveUploadfile(excelFile.getBytes(), realFileName);
//使用POIUtil工具類,根據文件後綴名獲取對應實現類
Workbook workbook = POIUtil.getWorkBookbyinputstream(is,realFileName);
//獲取該excel對象中的數據
List<ExcelFormBean> exceldata = POIUtil.readExcelFromWorkbook(workbook);


 第三步:將讀取的excel數據存儲到數據庫


//將excel數據存入數據庫
 recordid=testService.saveWorkbook(wholefilename, exceldata, realFileName);




四、說明
1.要讀取excel中的數據,需要將上傳的文件對象按照文件的後綴轉換爲指定的Workbook實現類。使用的方法如下:
public static Workbook getWorkBookbyinputstream(InputStream is,String  fileName) {
    //創建Workbook工作薄對象,表示整個excel
    Workbook workbook = null;
    try {
        //根據文件後綴名不同(xls和xlsx)獲得不同的Workbook實現類對象
        if(fileName.endsWith(xls)){
            //2003
            workbook = new HSSFWorkbook(is);
        }else if(fileName.endsWith(xlsx)){
            //2007
            workbook = new XSSFWorkbook(is);
        }
    } catch (IOException e) {
       /* logger.info(e.getMessage());*/
        System.out.println(e.getMessage());
    }
    return workbook;
}
 2.讀取Excel的方法,傳入Workbook對象,循環遍歷使用getCellValue方法返回單元格值。並添加到List<ExcelFormBean>中返回到Controller
public static List<ExcelFormBean> readExcelFromWorkbook(Workbook workbook) throws IOException{
    List<ExcelFormBean> datalist = new ArrayList<>();
    if(workbook != null){
        for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
            //獲得當前sheet工作表
            Sheet sheet = workbook.getSheetAt(sheetNum);
            if(sheet == null){
                continue;
            }
            ExcelFormBean exceldata = new ExcelFormBean();
            exceldata.setSheetname(sheet.getSheetName());
            //創建返回對象,把每行中的值作爲一個數組,所有行作爲一個集合返回
            List<String[]> list = new ArrayList<>();
            //獲得當前sheet的開始行
            int firstRowNum  = sheet.getFirstRowNum();
            //獲得當前sheet的結束行
            int lastRowNum = sheet.getLastRowNum();
            //循環除了第一行的所有行
            for(int rowNum = firstRowNum+1;rowNum <= lastRowNum;rowNum++){
                //獲得當前行
                Row row = sheet.getRow(rowNum);
                if(row == null){
                    continue;
                }
                //獲得當前行的開始列
                int firstCellNum = row.getFirstCellNum();
                //獲得當前行的列數
                int lastCellNum = row.getLastCellNum();
                String[] cells = new String[lastCellNum];
                //循環當前行
                for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
                    Cell cell = row.getCell(cellNum);
                    cells[cellNum] = getCellValue(cell);
                }
                list.add(cells);
            }
            exceldata.setDatalist(list);
            datalist.add(exceldata);
        }


        workbook.close();
    }


    return datalist;
}
3.最後保存讀取出的excel數據到數據庫中:循環遍歷List<ExcelFormBean>,使用對應表的Entity來封裝數據,在Dao層訪問數據庫持久化數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章