1. 程式人生 > >關於Excel表格的匯入

關於Excel表格的匯入

Excel表格的匯入

功能描述

Excel的匯入就是在java後端對Excel的表格的內容進行解析,將解析的內容存放進資料庫當中就可以了
這其中涉及的技術點有兩個:
1.檔案的傳輸:即在前端獲取檔案的資訊,將檔案的資訊傳給後端
2.後端獲取前端的檔案資訊,將檔案進行解析,然後將解析的資料存放進資料庫當中

結構描述

Excel表格的結構

檔案傳輸

檔案的傳輸我瞭解的有兩種方式:
1.利用ajaxFileUpload外掛
2.利用bootstrap的fileinput外掛
因為本文的重點是對excel的解析,所以對於檔案傳輸的部分不做講解

需要匯入的jar

1.commons-collections4-4.1.jar

2.poi-3.17-beta1.jar

3.poi-ooxml-3.17-beta1.jar

4.poi-ooxml-schemas-3.17-beta1.jar

5.xmlbeans-2.6.0.jar

主要API

1.import org.apache.poi.ss.usermodel.Workbook,對應Excel文件;

2.import org.apache.poi.hssf.usermodel.HSSFWorkbook,對應xls格式的Excel文件;

3.import org.apache.poi.xssf.usermodel.XSSFWorkbook,對應xlsx格式的Excel文件;

4.import org.apache.poi.ss.usermodel.Sheet,對應Excel文件中的一個sheet;

5.import org.apache.poi.ss.usermodel.Row,對應一個sheet中的一行;

6.import org.apache.poi.ss.usermodel.Cell,對應一個單元格。

Excel解析

解析按照以下幾個步驟來:

  1. 獲取檔案
  2. 讀取檔案,判斷檔案型別
//讀取excel
    public static Workbook readExcel(String filePath){
        Workbook wb = null;
        if(filePath==null){
            return null;
        }
        String extString = filePath.substring(filePath.lastIndexOf("."));
        InputStream is = null;
        try {
            is = new FileInputStream(filePath);
            if(".xls".equals(extString)){
                return wb = new HSSFWorkbook(is);
            }else if(".xlsx".equals(extString)){
                return wb = new XSSFWorkbook(is);
            }else{
                return wb = null;
            }
            
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return wb;
    }
  1. 開始解析資料,解析由sheet–>row–>cell的順序
  2. 儲存資料
@RequestMapping(value = "/importExcel",method=RequestMethod.POST)
	@ResponseBody
	public Result importExcel(HttpServletRequest request,HttpServletResponse response) {
		System.out.println("進入了測試方法!");
		Result result=new Result();
		Workbook wb =null;
        Sheet sheet = null;
        Row row = null;
        List<Map<String,String>> list = null;
        String cellData = null;
        String filePath = "C:\\Users\\admin\\Desktop\\學生資訊匯入模板.xlsx";
        String columns[] = {"name","age","address"};
        wb = readExcel(filePath);
        if(wb != null){
            //用來存放表中資料
            list = new ArrayList<Map<String,String>>();
            //獲取第一個sheet
            sheet = wb.getSheetAt(0);
            //獲取最大行數
            int rownum = sheet.getPhysicalNumberOfRows();
            //獲取第一行
            row = sheet.getRow(0);
            //獲取最大列數
            int colnum = row.getPhysicalNumberOfCells();
            for (int i = 1; i<rownum; i++) {
                Map<String,String> map = new LinkedHashMap<String,String>();
                row = sheet.getRow(i);
                if(row !=null){
                    for (int j=0;j<colnum;j++){
                        cellData = (String) getCellFormatValue(row.getCell(j));
                        map.put(columns[j], cellData);
                    }
                }else{
                    break;
                }
                list.add(map);
            }
        }
        
        
        //遍歷解析出來的list
        for (Map<String,String> map : list) {
        	Student student=new Student();
        	UUID uuid = UUID.randomUUID();
    		String str = uuid.toString();
    		String uuidStr = str.replace("-", "");
            student.setId(uuidStr);
            for (Entry<String,String> entry : map.entrySet()) {
                System.out.print(entry.getKey()+":"+entry.getValue()+",");
                if(entry.getKey().equals("name")){
                	student.setName(entry.getValue());
                }else if(entry.getKey().equals("age")){
                	student.setAge(Integer.parseInt(entry.getValue().substring(0,entry.getValue().indexOf("."))));
                }else if(entry.getKey().equals("address")){
                	student.setAddress(entry.getValue());
                }
            }
            result = studentService.addStudent(student);
            System.out.println();
        }
        result.setStatus(1);
        return result;
    }
	

這裡還需要一個解析單元格的工具類:

 public static Object getCellFormatValue(Cell cell){
        Object cellValue = null;
        if(cell!=null){
            //判斷cell型別
            switch(cell.getCellType()){
            case Cell.CELL_TYPE_NUMERIC:{
                cellValue = String.valueOf(cell.getNumericCellValue());
                break;
            }
            case Cell.CELL_TYPE_FORMULA:{
                //判斷cell是否為日期格式
                if(DateUtil.isCellDateFormatted(cell)){
                    //轉換為日期格式YYYY-mm-dd
                    cellValue = cell.getDateCellValue();
                }else{
                    //數字
                    cellValue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            }
            case Cell.CELL_TYPE_STRING:{
                cellValue = cell.getRichStringCellValue().getString();
                break;
            }
            default:
                cellValue = "";
            }
        }else{
            cellValue = "";
        }
        return cellValue;
    }

總結

我做的時候大概就是這麼個流程,主要使用了apache的poi外掛,該外掛對於操作office的檔案非常厲害,大家可以作為參考,去學習學習.