分享用Apache的POI操作Excel封裝的小工具類

 

需要做個導入excel數據到mysql,其實navicate工具就可以無腦導入辣,但是如果需要加些業務啥的那最好還是寫代碼操作了,其實很簡單,還是記錄下來,分享也方便自己日後直接拿來用~

開整~

當然第一步是先讀到內存裏啦,Apache的POI是個很好的工具,話不多少,貼代碼,修改下自己需要接收excel數據的Java類即可~

 

1.將相應maven依賴添加到pom.xml文件中:

<!-- poi:07版之前的二進制格式 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>4.0.0</version>
</dependency>
<!-- poi-ooxml:07版之後的OpenXML格式 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>4.0.0</version>
</dependency>

2.新建對應excel數據的接收類,這裏不再贅述遼

 

3.util 工具類(根據需要修改,只是操作excel部分通用)

package com.pacific.rsp.phone.util;
import com.pacific.rsp.phone.exception.PhoneException;
import com.pacific.rsp.phone.model.request.EmpParam;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.springframework.web.multipart.MultipartFile;
import java.lang.reflect.Field;
import java.text.DecimalFormat;
import java.util.*;

/**
 * @author: Hason
 * @Description:Excel上傳: 針對單元格數據類型轉換數據格式
 * @Date: Created in  2019/5/24   14:14
 */
public class ExcelUtils {

    public static List<EmpParam> readPhoneUserImportScores(MultipartFile file) throws Exception {
        if(file == null || file.getSize() == 0)
            return null;

        List<EmpParam> datas = new ArrayList<EmpParam>();
        // 文件名
        String fileName = file.getOriginalFilename();
        if (fileName.endsWith(".xlsx")||fileName.endsWith(".xls")) {
            // 獲取Excel文件對象
            Workbook wb = WorkbookFactory.create(file.getInputStream());
            // 獲取文件指定工作表,默認第一個
            Sheet sheet = wb.getSheetAt(0);
            // 遍歷行數(行記錄,從0開始,首行記錄數+1)
            w: for (int i = 2; i < sheet.getLastRowNum() + 1; i++) {
                // 每一行對應一個list
                List<Object> list = new ArrayList<Object>();
                // 創建一個行對象
                Row row = sheet.getRow(i);
                if (row == null || row.getLastCellNum() == -1) {
                    break w;
                }
                if(!CheckRowNull(row)){
                    continue;
                }
                //表格列名校驗開始
                List checkTitleList = new ArrayList<Object>();
                Row checkTitleListrow = sheet.getRow(1);
                for (int j = 0; j < checkTitleListrow.getLastCellNum(); j++) {
                    // 爲每一個字段創建一個單元格對象
                    Cell checkTitleListcell = checkTitleListrow.getCell((short) (j));
                    if (checkTitleListcell == null || "".equals(checkTitleListcell)) {
                        checkTitleList.add("");
                        continue ;
                    }
                    // 獲取cell數據
                    Object data = getCellValue(checkTitleListcell);
                    checkTitleList.add(data);
                }

                if(!checkTitleList.get(0).equals("姓名") || !checkTitleList.get(1).equals("工號")  || !checkTitleList.get(2).equals("手機號") )throw new PhoneException("表格列名稱錯誤,請選擇正確的模板導入!","PH00001");

                // 遍歷一行中的每個字段
                for (int j = 0; j < row.getLastCellNum(); j++) {
                    // 爲每一個字段創建一個單元格對象
                    Cell cell = row.getCell((short) (j));
                    if (cell == null || "".equals(cell)) {
                        list.add("");
                        continue;
                    }
                    // 獲取cell數據
                    Object data = getCellValue(cell);
                    list.add(data);
                }
//此部分用自己的實體類接收數據
//                EmpParam param =new EmpParam();
//               param.setName(list.get(0).toString());
//                param.setEmpNo(list.get(1).toString());
//               param.setMobile(list.get(2).toString());
//                param.setChannel(list.get(3).toString());
                datas.add(param);
            }
            wb.close();
        }
        return datas;
    }

    /**
     * EXCEL中的CELL值轉換
     *
     * @param cell
     * @return
     */
    public static Object getCellValue(Cell cell) {
        Object result = null;
        switch (cell.getCellType()) {
            case XSSFCell.CELL_TYPE_NUMERIC: // 數字類型,日期類型
                result = dealNum(cell);
                break;
            case XSSFCell.CELL_TYPE_STRING: // 字符串類型
                result = cell.getStringCellValue();
                result = dealStr(result.toString());
                break;
            case XSSFCell.CELL_TYPE_FORMULA: // 公式
                result = cell.getCellFormula();
                break;
            default:
                result = String.valueOf(cell.getStringCellValue());
                break;
        }
        return result;
    }

    /**
     * 處理數值類型
     *
     * @param cell
     * @return
     */
    public static Object dealNum(Cell cell) {
        Object str = "";
        if (HSSFDateUtil.isCellDateFormatted(cell)) {
            Date cellDate = cell.getDateCellValue();
            //str = TimeUtils.formatAll(cellDate);
            return cellDate;
        } else {
            str = new DecimalFormat("#.##").format(cell.getNumericCellValue());
        }
        return str;
    }

    /**
     *
     * 根據後綴判斷是否爲 Excel 文件,後綴匹配xls和xlsx
     *
     * @param pathname
     * @return
     *
     */
    public static boolean isExcel(String pathname) {
        if (pathname == null) {
            return false;
        }
        return pathname.endsWith(".xls") || pathname.endsWith(".xlsx");
    }




    /**
     * 處理字符串
     *
     * @param str
     * @return
     */
    public static String dealStr(String str) {
        if (str.trim().equals("") || str.trim().length() < 0) {
            str = "";
        }
        return str;
    }

    /**
     *  檢查改行是不是全空
     * @param row
     * @return
     */
    public static boolean CheckRowNull(Row row){
        boolean flag = false;
        Iterator<Cell> iterator = row.cellIterator();
        while(iterator.hasNext()){

            Cell cell = iterator.next();
            if(cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK && !cell.equals("") )
                flag = true;

        }

        return flag;
    }

    public static boolean checkNumber(String number){

//        String regex = "^(\\d|[1-9]\\d|100)(\\.\\d{1,1})?$";
        String regex = "^(((\\d|[1-9]\\d)(\\.\\d{1,2})?)|100|100.0|100.00)$";

        if(number.matches(regex)){
            return  true;
        }else {
            return false;
        }
    }

    /**
     * 判斷字符串是否爲數字
     * @param str
     * @return
     */
    public static boolean isNumber(String str){
        return str.matches("-?[0-9]+.*[0-9]*");
    }
    public static boolean checkYear(String year){

        String regex = "[1-9]+\\d{3}\\-(?:0[1-9]|1[0-2])";
        StringBuffer str = new StringBuffer(year);
        str.insert(4, "-");
        String s = str.toString();
        if(s.matches(regex)){
            return  true;
        }else {
            return false;
        }
    }
    public static boolean isDone(String number1,String number2){

        Integer integer1 = Integer.valueOf(number1);

        Integer integer2 = Integer.valueOf(number2);

        if(integer1<integer2){
            return  true;
        }else {
            return  false;
        }
    }

    /**
     * 獲取利用反射獲取類裏面的值和名稱
     *
     * @param obj
     * @return
     * @throws IllegalAccessException
     */
    public static Map<String, Object> objectToMap(Object obj) throws IllegalAccessException {
        Map<String, Object> map = new HashMap<>();
        Class<?> clazz = obj.getClass();
        for (Field field : clazz.getDeclaredFields()) {
            field.setAccessible(true);
            String fieldName = field.getName();
            Object value = field.get(obj);
            map.put(fieldName, value);
        }
        return map;
    }

}

 

聽說有大神寫了個開源項目叫EasyExcel,還沒來得及看,應該很強大,有興趣可以看下~

GitHub:https://github.com/alibaba/easyexcel

 

 

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