java導入excel數據,2003/2007(xls/xlsx)通用,並且帶數據重複性、唯一性、長度、非空、正則校驗,並且輸出提示。

 

導入excel的請求代碼,直接copy的代碼,改改就能用了

@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
    @ResponseBody
    public String importExcel(@RequestParam("file") MultipartFile file)
            throws Exception {
        Json result=new Json();
        RestExcelMsg restExcelMsg = new RestExcelMsg();

        try {
            if (file.isEmpty()) {
                result.put("success", false);
                result.put("reason", String.format( "導入excel爲空文件"));
                return result.toString();
            }
            String type = ImportExcelUtil.checkFileType(file.getOriginalFilename());
            if ("".equals(type)) {
                result.put("success", false);
                result.put("reason", String.format( "excel格式不正確"));
                return result.toString();
            }

            String sheetId = "machine";
            List<MgMachine> excelList = null;

            excelList = (List<MgMachine>) ImportExcelUtil.parseExcel(sheetId, file.getInputStream(), type, restExcelMsg);
            String msg = restExcelMsg.getMsg();
            if(!"".equals(msg)){
                result.put("success", false);
                result.put("reason", msg);
                return result.toString();
            }else{
                MgMachine obj = null;
                MgMachine mm = null;
                String deptName = "";
                int len = excelList.size();
                for(int i = 0; i < len; i++){
                    mm = new MgMachine();
                    mm.setMachineId(excelList.get(i).getMachineId());
                    obj = machineService.getByParam(mm);
                    if(obj != null && !"".equals(obj.getMachineId())){
                        msg += "第" + Integer.valueOf(i+2).toString() + " 行 " + "編號" + "已存在\n";
                        result.put("success", false);
                        result.put("reason", msg);
                        return result.toString();
                    } else if(obj == null){
                        mm = new MgMachine();
                        mm.setIpAddress(excelList.get(i).getIpAddress());
                        obj = machineService.getByParam(mm);
                        if(obj != null && !"".equals(obj.getIpAddress())) {
                            msg += "第" + Integer.valueOf(i+2).toString() + " 行 " + " IP地址" + "已存在\n";
                            result.put("success", false);
                            result.put("reason", msg);
                            return result.toString();
                        }
                    }
                    deptName = departmentService.getName(excelList.get(i).getDeptId());
                    if(deptName == null || "".equals(deptName)){
                        msg += "第" + Integer.valueOf(i+2).toString() + " 行 " + "編號" + "不存在\n";
                        result.put("success", false);
                        result.put("reason", msg);
                        return result.toString();
                    }else if(!excelList.get(i).getDeptName().equals(deptName)){
                        msg += "第" + Integer.valueOf(i+2).toString() + " 行 " + "名稱和編號不匹配" + "\n";
                        result.put("success", false);
                        result.put("reason", msg);
                        return result.toString();
                    }
                }
            }

            List<MgMachine> list = new ArrayList<MgMachine>();
            if(!CollectionUtils.isEmpty(excelList)){
                for(int i =0; i< excelList.size(); i++){
                    MgMachine obj = excelList.get(i);
                    obj.setCreateBy(requestContext.getUser().getUsername());
                    obj.setOperatorName(requestContext.getUser().getUsername());
                    obj.setCreateOn(date);
                    obj.setId(UUID.randomUUID().toString());
                    list.add(obj);
                }
            }
            machineService.batchSave(list);
            result.put("success", true);
            result.put("reason", "導入成功");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result.toString();
    }
package com.xxx.util;

import com.xxx.RestExcelMsg;
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.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.util.ResourceUtils;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;


public class ImportExcelUtil {

    public static List parseExcel(String sheetId, InputStream input, String type, RestExcelMsg restExcelMsg) throws Exception {
        // 根據sheetId解析xml,獲取Excel模板
        String msg = "";
        Element element = readXML(sheetId);
        String clazzString = element.attributeValue("class");

        // 從哪行開始解析
        int start = Integer.valueOf(element.attributeValue("startRow"));

        // 反射創建對象實例
        Class<? extends Object> clazz = Class.forName(clazzString);

        List<Element> columns = element.elements();

        Object instance = null;
        // 結果集
        List resultList = new ArrayList();
        // 要調用的方法
        Method method = null;
        // 調用Set方法要傳遞的參數
        Class<?>[] args = null;

        Cell cell = null;
        Workbook wb=null;
        Sheet sheet = null;
       if("xlsx".equals(type)){
           wb=new XSSFWorkbook(input);
           sheet =  wb.getSheetAt(0);

        }else{
            wb=new HSSFWorkbook(input);
           sheet =  wb.getSheetAt(0);
        }
        try
        {
            if(sheet.getLastRowNum() <= 0){

                msg += "導入excel爲空文件\n";
                restExcelMsg.setMsg(msg);
                return resultList;
            }

            String cname = "";
            String name = "";
            int columnSize = columns.size();
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Map<String, Map<String, String>> mapList = new HashMap<String, Map<String, String>>();
            Map<String, String> map = new HashMap<>();

            // 獲取第一個Sheet頁
            for (int i = start; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
                if(row == null)
                {
                    continue;
                }
                instance = clazz.newInstance();

                StringBuffer buf = new StringBuffer();
                for (int j = 0; j < columnSize; j++) {
                    cname = columns.get(j).attributeValue("cname");
                    name = columns.get(j).attributeValue("name");
                    cell = row.getCell(j);
                    if (cell == null) {
                        if("N".equals(columns.get(j).attributeValue("isnull"))){
                            msg += "第 " + Integer.valueOf(i+1).toString() + " 行 " + cname + "不能爲空\n";
                        }
                        continue;
                    }
                    args = new Class[1];
                    args[0] = getParameterType(columns.get(j).attributeValue("type"));
                    Object value = getCellValue(cell,args[0],dateFormat);

                    //累計字符串內容
                    buf.append(getStringValue(value));

                    //Date情況轉成String,其他類型保持原樣
                    args[0] = Date.class.equals(args[0]) ? String.class : args[0];


                    if(value !=null && !"".equals(value.toString().trim()) && value.toString().length() < Integer.valueOf(columns.get(j).attributeValue("length").split(",")[0]) || value.toString().length() > Integer.valueOf(columns.get(j).attributeValue("length").split(",")[1])){
                        cname = columns.get(j).attributeValue("cname");
                        msg += "第 " + Integer.valueOf(i+1).toString() + " 行 " + cname + "字符長度應在" + Integer.valueOf(columns.get(j).attributeValue("length").split(",")[0]) + "到" + Integer.valueOf(columns.get(j).attributeValue("length").split(",")[1]) + "之間";
                    }else if(!"".equals(columns.get(j).attributeValue("reg")) && Pattern.matches(columns.get(j).attributeValue("reg"), String.valueOf(value))){
                        msg += "第 " + Integer.valueOf(i+1).toString() + " 行 " + cname + "格式不正確";
                    }else{
                        if("Y".equals(columns.get(j).attributeValue("unique"))){
                            if(mapList != null && mapList.containsKey(name) && mapList.get(name).containsKey(value)){
                                msg += "第 " + Integer.valueOf(i+1).toString() + " 行 " + cname + "重複\n";
                            }else{
                                map = new HashMap<>();
                                map.put(value.toString(), "");
                                mapList.put(name, map);
                            }
                        }
                        method = clazz.getDeclaredMethod("set" + name, args);
                        method.invoke(instance, value);

                    }

                }

                //整行爲空時丟棄該行數據
                if ("".equals(buf.toString().trim()))
                {
                    continue;
                }
                //加到集合中
                resultList.add(instance);
            }
        } catch (Exception e) {
            throw e;
        } finally {
            if (wb != null) {
                wb.close();
            }
        }
        System.out.println(msg);
        restExcelMsg.setMsg(msg);

        return resultList;
    }

    public static String checkFileType(String filename) {
        if ((filename == null) || (filename.length() == 0)) {
            return "";
        }

        String type = "";
        int dot = filename.lastIndexOf('.');
        if ((dot > -1) && (dot < (filename.length() - 1))) {
            type = filename.substring(dot + 1);
        }
        if (!"xlsx".equalsIgnoreCase(type) && !"xls".equalsIgnoreCase(type)) {
            return "";
        }
        return type;
    }

    @SuppressWarnings("unchecked")
    private static Element readXML(String sheetId) throws DocumentException, FileNotFoundException {
        File file = ResourceUtils.getFile("classpath:excel/Sheet.xml");
        SAXReader reader = new SAXReader();
        Document document = reader.read(file);
        Element root = document.getRootElement();
        Iterator<Element> iterator = root.elementIterator();
        Element element = null;
        while (iterator.hasNext()) {
            element = iterator.next();
            if (sheetId.equals(element.attributeValue("id"))) {
                break;
            }
        }
        return element;
    }

    private static Object getCellValue(Cell cell,Class<? extends Object> clazz,SimpleDateFormat dateFormat) {
        Object obj = null;
        switch (cell.getCellType()) {
            case Cell.CELL_TYPE_BOOLEAN:
                obj = cell.getBooleanCellValue();
                break;
            case Cell.CELL_TYPE_ERROR:
                obj = cell.getErrorCellValue();
                break;
            case Cell.CELL_TYPE_NUMERIC:
                //用戶自定義類型檢測
                if(String.class.equals(clazz))
                {
                    DecimalFormat df = new DecimalFormat("#.#########"); // 數字格式,防止長數字成爲科學計數
                    obj = df.format(cell.getNumericCellValue());
                }else if(Date.class.equals(clazz))
                {
                    obj = dateFormat.format(cell.getDateCellValue());
                }else if(Double.class.equals(clazz)) {
                    obj = cell.getNumericCellValue();
                }else if(Integer.class.equals(clazz)) {
                    DecimalFormat df = new DecimalFormat("#.#########"); // 數字格式,防止長數字成爲科學計數
                    String val = df.format(cell.getNumericCellValue());
                    obj = Integer.parseInt(val);
                }
                break;
            case Cell.CELL_TYPE_STRING:
                String cellValue = cell.getStringCellValue();

                if (Double.class.equals(clazz)) {
                    Double d = Double.valueOf(cellValue);
                    obj = d;
                }else if(Integer.class.equals(clazz)) {
                    obj = Integer.parseInt(cellValue);
                }else {
                    obj=cellValue;
                }
                break;
            default:
                break;
        }

        return obj;
    }
    /**
     * 獲取參數類型,默認爲String
     *
     * @param parameterType
     * @return
     */
    private static Class<?> getParameterType(String parameterType) {
        switch (parameterType) {
            case "Byte":
                return Byte.class;
            case "Short":
                return Short.class;
            case "Integer":
                return Integer.class;
            case "Long":
                return Long.class;
            case "Float":
                return Float.class;
            case "Double":
                return Double.class;
            case "char":
                return char.class;
            case "String":
                return String.class;
            case "Date":
                return Date.class;
            default:
                return String.class;
        }
    }

    /**
     * 獲取字符串內容
     * @param obj
     * @return
     */
    private static String getStringValue(Object obj)
    {
        if (obj != null)
        {
            return String.valueOf(obj);
        }
        return "";
    }



}

public class RestExcelMsg {


    private String msg;

    public RestExcelMsg() {
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<import>
    <!-- type類型:Byte,Short,Integer,Long,Float,Double,char,String,缺省爲String -->
    <sheet id="machine" startRow="1" class="com.xxx.MgMachine">
        <column name="DeptId"  type="String" isnull="N" length="2,20" unique="N" reg="" cname="機編號"></column>
        <column name="DeptName"  type="String" isnull="N" length="2,50" unique="N" reg="" cname="名稱"></column>
        <column name="MachineId"  type="String" isnull="N" length="2,20" unique="Y" reg="" cname="編號"></column>
        <column name="IpAddress"  type="String" isnull="N" length="7,15" unique="Y" reg="" cname="IP地址"></column>
        <column name="Description"  type="String" isnull="Y" length="2,200" unique="N" reg="" cname="描述"></column>
        <column name="WorkingDays" type="String" isnull="N" length="2,20" unique="N" reg="" cname="工作日"></column>
        <column name="WorkingHours" type="String" isnull="N" length="2,20" unique="N" reg="" cname="工作時間"></column>
        <column name="ServiceTime" type="String" isnull="N" length="2,20" unique="N" reg="" cname="上傳時間"></column>
    </sheet>
</import>

這裏需要注意的是com.xxx.MgMachine實體類中的私有屬性和Sheet.xml中的column中的name屬性必須保持一致性,cname就是屬性的名稱。

其中type表示數據類型,isnull,length,unique是否唯一,reg是正則表達式,cname就是名稱,對於校驗excel導入的數據格式有很好的作用,其實很多導入excel最重要的不是導入,而是數據校驗,重複性,格式,長度,唯一性,是否爲空這些纔是最主要的,demo沒有單獨寫,這些代碼已經足夠了,代碼肯定有不完善的地方,大家多多包涵,希望能夠幫助到各位,寫成更好的代碼。

excel的Sheet的路徑

pom依賴

        <!--execl解析-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.13</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.13</version>
        </dependency>
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

打賞二維碼,多謝支持

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