POI使用介紹


POI介紹:

    1.什么是POI?
        Apache POI是用Java編寫的免費開源的跨平台的Java API,Apache POI提供API給Java程序對Microsoft Office格式檔案讀和寫的功能,
        其中使用最多的就是使用POI操作Excel文件。
        
    2.POI的使用:
        1.導入依賴:
            <dependency>
              <groupId>org.apache.poi</groupId>
              <artifactId>poi</artifactId>
              <version>3.14</version>
            </dependency>
            <dependency>
              <groupId>org.apache.poi</groupId>
              <artifactId>poi-ooxml</artifactId>
              <version>3.14</version>
            </dependency>
            
        2.POI結構:
            HSSF - 提供讀寫Microsoft Excel XLS格式檔案的功能
            XSSF - 提供讀寫Microsoft Excel OOXML XLSX格式檔案的功能(2007版以后的Excel)
            HWPF - 提供讀寫Microsoft Word DOC格式檔案的功能
            HSLF - 提供讀寫Microsoft PowerPoint格式檔案的功能
            HDGF - 提供讀Microsoft Visio格式檔案的功能
            HPBF - 提供讀Microsoft Publisher格式檔案的功能
            HSMF - 提供讀Microsoft Outlook格式檔案的功能
            
        3.入門:
            1.讀取Excel文件:
                步驟:
                    1:創建工作簿對象
                    2:獲得工作表對象
                    3:遍歷工作表對象 獲得行對象
                    4:遍歷行對象 獲得單元格(列)對象
                    5:獲得數據
                    6:關閉
                代碼演示:
                    注:
                        XSSFWorkbook:工作簿
                        XSSFSheet:工作表
                        XSSFRow:行
                        XSSFCell:單元格
                        
                    方式1:
                    @Test
                    public void exportExcel() throws IOException {
                        //創建工作簿
                        XSSFWorkbook workbook = new XSSFWorkbook("D:\\hello.xlsx");
                        //獲取工作表,既可以根據工作表的順序獲取,也可以根據工作表的名稱獲取
                        XSSFSheet sheet = workbook.getSheetAt(0);
                        //遍歷工作表獲得行對象
                        for (Row row : sheet) {
                            //遍歷行對象獲取單元格對象
                            for (Cell cell : row) {
                                //獲得單元格中的值
                                String value = cell.getStringCellValue();
                                System.out.println(value);
                            }
                        }
                        workbook.close();
                    }
                    
                    方式2:
                    // 導出excel,獲取最后一行
                    @Test
                    public void exportExcel_lastRow() throws IOException {
                        //創建工作簿
                        XSSFWorkbook workbook = new XSSFWorkbook("D:\\hello.xlsx");
                        //獲取工作表,既可以根據工作表的順序獲取,也可以根據工作表的名稱獲取
                        XSSFSheet sheet = workbook.getSheetAt(0);
                        //獲取當前工作表最后一行的行號,行號從0開始
                        int lastRowNum = sheet.getLastRowNum();
                        for(int i=0;i<=lastRowNum;i++){
                            //根據行號獲取行對象
                            XSSFRow row = sheet.getRow(i);
                            short lastCellNum = row.getLastCellNum();
                            for(short j=0;j<lastCellNum;j++){
                                String value = row.getCell(j).getStringCellValue();
                                System.out.println(value);
                            }
                        }
                        workbook.close();
                    }
            
            2.向Excel文件寫入數據:
                1.步驟:
                    1.創建工作簿對象
                    2.創建工作表對象
                    3.創建行對象
                    4.創建列(單元格)對象, 設置內容
                    5.通過輸出流將workbook對象下載到磁盤
                2.代碼演示:
                    @Test
                    public void importExcel() throws IOException {
                        //在內存中創建一個Excel文件
                        XSSFWorkbook workbook = new XSSFWorkbook();
                        //創建工作表,指定工作表名稱
                        XSSFSheet sheet = workbook.createSheet("華為");

                        //創建行,0表示第一行
                        XSSFRow row = sheet.createRow(0);
                        //創建單元格,0表示第一個單元格
                        row.createCell(0).setCellValue("編號");
                        row.createCell(1).setCellValue("姓名");
                        row.createCell(2).setCellValue("年齡");

                        XSSFRow row1 = sheet.createRow(1);
                        row1.createCell(0).setCellValue("1");
                        row1.createCell(1).setCellValue("小明");
                        row1.createCell(2).setCellValue("10");

                        XSSFRow row2 = sheet.createRow(2);
                        row2.createCell(0).setCellValue("2");
                        row2.createCell(1).setCellValue("小王");
                        row2.createCell(2).setCellValue("20");

                        //通過輸出流將workbook對象下載到磁盤
                        FileOutputStream out = new FileOutputStream("D:\\itcast.xlsx");
                        workbook.write(out);
                        out.flush();//刷新
                        out.close();//關閉
                        workbook.close();
                    }
        
        4.POI工具類:
            import org.apache.poi.hssf.usermodel.HSSFWorkbook;
            import org.apache.poi.ss.usermodel.Cell;
            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.xssf.usermodel.XSSFWorkbook;
            import org.springframework.web.multipart.MultipartFile;

            import java.io.FileNotFoundException;
            import java.io.IOException;
            import java.io.InputStream;
            import java.text.SimpleDateFormat;
            import java.util.ArrayList;
            import java.util.List;

            public class POIUtils {
                private final static String xls = "xls";
                private final static String xlsx = "xlsx";
                private final static String DATE_FORMAT = "yyyy/MM/dd";
                /**
                 * 讀入excel文件,解析后返回
                 * @param file
                 * @throws IOException
                 */
                public static List<String[]> readExcel(MultipartFile file) throws IOException {
                    //檢查文件
                    checkFile(file);
                    //獲得Workbook工作薄對象
                    Workbook workbook = getWorkBook(file);
                    //創建返回對象,把每行中的值作為一個數組,所有行作為一個集合返回
                    List<String[]> list = new ArrayList<String[]>();
                    if(workbook != null){
                        for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){
                            //獲得當前sheet工作表
                            Sheet sheet = workbook.getSheetAt(sheetNum);
                            if(sheet == null){
                                continue;
                            }
                            //獲得當前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.getPhysicalNumberOfCells();
                                String[] cells = new String[row.getPhysicalNumberOfCells()];
                                //循環當前行
                                for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){
                                    Cell cell = row.getCell(cellNum);
                                    cells[cellNum] = getCellValue(cell);
                                }
                                list.add(cells);
                            }
                        }
                        workbook.close();
                    }
                    return list;
                }

                //校驗文件是否合法
                public static void checkFile(MultipartFile file) throws IOException{
                    //判斷文件是否存在
                    if(null == file){
                        throw new FileNotFoundException("文件不存在!");
                    }
                    //獲得文件名
                    String fileName = file.getOriginalFilename();
                    //判斷文件是否是excel文件
                    if(!fileName.endsWith(xls) && !fileName.endsWith(xlsx)){
                        throw new IOException(fileName + "不是excel文件");
                    }
                }
                public static Workbook getWorkBook(MultipartFile file) {
                    //獲得文件名
                    String fileName = file.getOriginalFilename();
                    //創建Workbook工作薄對象,表示整個excel
                    Workbook workbook = null;
                    try {
                        //獲取excel文件的io流
                        InputStream is = file.getInputStream();
                        //根據文件后綴名不同(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) {
                        e.printStackTrace();
                    }
                    return workbook;
                }
                public static String getCellValue(Cell cell){
                    String cellValue = "";
                    if(cell == null){
                        return cellValue;
                    }
                    //如果當前單元格內容為日期類型,需要特殊處理
                    String dataFormatString = cell.getCellStyle().getDataFormatString();
                    if(dataFormatString.equals("m/d/yy")){
                        cellValue = new SimpleDateFormat(DATE_FORMAT).format(cell.getDateCellValue());
                        return cellValue;
                    }
                    //把數字當成String來讀,避免出現1讀成1.0的情況
                    if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
                        cell.setCellType(Cell.CELL_TYPE_STRING);
                    }
                    //判斷數據的類型
                    switch (cell.getCellType()){
                        case Cell.CELL_TYPE_NUMERIC: //數字
                            cellValue = String.valueOf(cell.getNumericCellValue());
                            break;
                        case Cell.CELL_TYPE_STRING: //字符串
                            cellValue = String.valueOf(cell.getStringCellValue());
                            break;
                        case Cell.CELL_TYPE_BOOLEAN: //Boolean
                            cellValue = String.valueOf(cell.getBooleanCellValue());
                            break;
                        case Cell.CELL_TYPE_FORMULA: //公式
                            cellValue = String.valueOf(cell.getCellFormula());
                            break;
                        case Cell.CELL_TYPE_BLANK: //空值
                            cellValue = "";
                            break;
                        case Cell.CELL_TYPE_ERROR: //故障
                            cellValue = "非法字符";
                            break;
                        default:
                            cellValue = "未知類型";
                            break;
                    }
                    return cellValue;
                }
            }

                    
                    
                    
                    
                
  批量導入實現思路:

  1:前台代碼

 
         

  (1)提供模板文件

 
         

  (2)實現模板文件下載(填寫數據)

 
         

  (3)文件上傳(讀取excel的數據,批量導入到數據庫)

后台:

1.采用POI工具類讀取Excel文件,獲取字符串數組;

2.遍歷字符串數組,獲取對應的值並設置pojo的屬性值為該值;

 

    
                  
                    
                    
                    
        

 


免責聲明!

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



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