zoukankan      html  css  js  c++  java
  • Excel表格数据导入

    导入maven依赖

    地址:https://mvnrepository.com/artifact/com.xuxueli/xxl-excel/1.1.1

    <!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-excel -->
    <dependency>
        <groupId>com.xuxueli</groupId>
        <artifactId>xxl-excel</artifactId>
        <version>1.1.1</version>
    </dependency>

    接下来看看,表格的结构

    先贴上,工具类

    import com.xuxueli.poi.excel.annotation.ExcelSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.springframework.stereotype.Component;
    import org.springframework.web.multipart.MultipartFile;
    
    import javax.servlet.http.HttpServletResponse;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.net.URLEncoder;
    import java.util.List;
    
    @Component
    public class MyExcelUtil {
    
    
        /**
         * 导出Excel文件到磁盘
         */
        public static void exportToFile(Class clazz, List<?> dataList, HttpServletResponse response){
            // workbook
            XSSFWorkbook workbook = MyExcelExportUtil.exportWorkbook(dataList);
            OutputStream out = null;
            try {
                response.setContentType("APPLICATION/OCTET-STREAM");
    
                // set headers for the response
                String headerKey = "Content-Disposition";
                ExcelSheet excelSheet = (ExcelSheet)clazz.getAnnotation(ExcelSheet.class);
                String filename = excelSheet.name();
                String fileNameWithExt = filename + ".xlsx";
                String headerValue = null;
    
                headerValue = String.format("attachment; filename="%s"", URLEncoder.encode(fileNameWithExt, "utf-8"));
                response.setHeader(headerKey, headerValue);
    
    
                out = response.getOutputStream();
                // workbook 2 FileOutputStream
                workbook.write(out);
                // flush
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(e);
            } finally {
                try {
                    if (out!=null) {
                        out.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
    
        /**
         * 导入
         */
        public static List importFromFile(Class clazz, MultipartFile file){
            InputStream inputStream =null;
            try{
                inputStream = file.getInputStream();
                List objects = MyExcelImportUtil.importExcel(clazz, inputStream);
                return objects;
            }catch (Exception e){
                e.printStackTrace();
                throw new RuntimeException(e);
            }finally {
                try {
                    if (inputStream!=null) {
                        inputStream.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    throw new RuntimeException(e);
                }
            }
        }
    }
    import com.xuxueli.poi.excel.ExcelExportUtil;
    import com.xuxueli.poi.excel.annotation.ExcelField;
    import com.xuxueli.poi.excel.annotation.ExcelSheet;
    import org.apache.poi.hssf.util.HSSFColor;
    import org.apache.poi.ss.usermodel.*;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import org.springframework.util.StringUtils;
    
    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    import java.lang.reflect.Modifier;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    public class MyExcelExportUtil extends ExcelExportUtil {
    
        public static XSSFWorkbook exportWorkbook(List<?> dataList) {
            if (dataList != null && dataList.size() != 0) {
                Class sheetClass = dataList.get(0).getClass();
                ExcelSheet excelSheet = (ExcelSheet) sheetClass.getAnnotation(ExcelSheet.class);
                String sheetName = dataList.get(0).getClass().getSimpleName();
                HSSFColor.HSSFColorPredefined headColor = null;
                if (excelSheet != null) {
                    if (excelSheet.name() != null && excelSheet.name().trim().length() > 0) {
                        sheetName = excelSheet.name().trim();
                    }
    
                    headColor = excelSheet.headColor();
                }
    
                ArrayList fields = new ArrayList();
                if (sheetClass.getDeclaredFields() != null && sheetClass.getDeclaredFields().length > 0) {
                    Field[] workbook = sheetClass.getDeclaredFields();
                    int sheet = workbook.length;
    
                    for (int headStyle = 0; headStyle < sheet; ++headStyle) {
                        Field headRow = workbook[headStyle];
                        ExcelField rowData = (ExcelField) headRow.getAnnotation(ExcelField.class);
                        if (rowData == null) {
                            continue;
                        }
                        String name = rowData.name().trim();
                        if (StringUtils.isEmpty(name)) {
                            continue;
                        }
                        if (!Modifier.isStatic(headRow.getModifiers())) {
                            fields.add(headRow);
                        }
                    }
                }
    
                if (fields != null && fields.size() != 0) {
                    XSSFWorkbook var19 = new XSSFWorkbook();
                    Sheet var20 = var19.createSheet(sheetName);
                    CellStyle var21 = null;
                    if (headColor != null) {
                        var21 = var19.createCellStyle();
                        var21.setFillForegroundColor(headColor.getIndex());
                        var21.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                        var21.setFillBackgroundColor(headColor.getIndex());
                    }
    
                    Row var22 = var20.createRow(0);
    
                    int dataIndex;
                    for (dataIndex = 0; dataIndex < fields.size(); ++dataIndex) {
                        Field rowIndex = (Field) fields.get(dataIndex);
                        ExcelField rowData = (ExcelField) rowIndex.getAnnotation(ExcelField.class);
                        if (rowData == null) {
                            continue;
                        }
                        String name = rowData.name().trim();
                        if (StringUtils.isEmpty(name)) {
                            continue;
                        }
                        String rowX = rowData != null && rowData.name() != null && rowData.name().trim().length() > 0 ? rowData.name() : rowIndex.getName();
                        Cell i = var22.createCell(dataIndex, 1);
                        if (var21 != null) {
                            i.setCellStyle(var21);
                        }
    
                        i.setCellValue(String.valueOf(rowX));
                    }
    
                    for (dataIndex = 0; dataIndex < dataList.size(); ++dataIndex) {
                        int var23 = dataIndex + 1;
                        Object var24 = dataList.get(dataIndex);
                        Row var25 = var20.createRow(var23);
    
                        for (int var26 = 0; var26 < fields.size(); ++var26) {
                            Field field = (Field) fields.get(var26);
                            ExcelField rowData = (ExcelField) field.getAnnotation(ExcelField.class);
                            if (rowData == null) {
                                continue;
                            }
                            String name = rowData.name().trim();
                            if (StringUtils.isEmpty(name)) {
                                continue;
                            }
                            try {
                                field.setAccessible(true);
                                Object e = field.get(var24);
                                Cell cellX = var25.createCell(var26, 1);
                                if (e == null) {
                                    cellX.setCellValue("");
                                } else {
                                    Class<?> aClass = e.getClass();
                                    Date date = new Date();
                                    if (aClass == date.getClass()) {
                                        cellX.setCellValue(DateUtil.formatTimestamp((Date) e));
                                    } else if(aClass.isEnum()){
                                        try {
                                            Method getDesc = aClass.getMethod("getDesc");
                                            Object invoke = getDesc.invoke(e);
                                            cellX.setCellValue(String.valueOf(invoke));
                                        } catch (Exception e1) {
    
                                            cellX.setCellValue("");
                                        }
    
    
                                    } else {
                                        cellX.setCellValue(String.valueOf(e));
                                    }
                                }
                            } catch (IllegalAccessException var18) {
                                throw new RuntimeException(var18);
                            }
                        }
                    }
    
                    return var19;
                } else {
                    throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data field can not be empty.");
                }
            } else {
                throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data can not be empty.");
            }
        }
    }
    import com.xuxueli.poi.excel.ExcelImportUtil;
    import com.xuxueli.poi.excel.annotation.ExcelField;
    import com.xuxueli.poi.excel.annotation.ExcelSheet;
    import com.xuxueli.poi.excel.util.FieldReflectionUtil;
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.ss.usermodel.*;
    import org.springframework.util.StringUtils;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.lang.reflect.Field;
    import java.lang.reflect.Modifier;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    public class MyExcelImportUtil extends ExcelImportUtil {
    
        public static List<Object> importExcel(Class<?> sheetClass, Workbook workbook) {
            try {
                ExcelSheet excelSheet = (ExcelSheet) sheetClass.getAnnotation(ExcelSheet.class);
                String sheetName = excelSheet != null && excelSheet.name() != null && excelSheet.name().trim().length() > 0 ? excelSheet.name().trim() : sheetClass.getSimpleName();
                List<Field> fields = new ArrayList();
                int rowIndex;
                if (sheetClass.getDeclaredFields() != null && sheetClass.getDeclaredFields().length > 0) {
                    Field[] var5 = sheetClass.getDeclaredFields();
                    int var6 = var5.length;
    
                    for (rowIndex = 0; rowIndex < var6; ++rowIndex) {
                        Field field = var5[rowIndex];
                        if (!Modifier.isStatic(field.getModifiers())) {
                            fields.add(field);
                        }
                    }
                }
    
                if (fields != null && fields.size() != 0) {
                    Sheet sheet = workbook.getSheet(sheetName);
                    Iterator<Row> sheetIterator = sheet.rowIterator();
                    rowIndex = 0;
    
                    ArrayList dataList;
    
                    ArrayList headList = new ArrayList();
                    for1:
                    for (dataList = new ArrayList(); sheetIterator.hasNext(); ++rowIndex) {
    
                        Row rowX = (Row) sheetIterator.next();
                        if (rowIndex == 0) {
                            Iterator<Cell> cellIterator = rowX.cellIterator();
                            while (cellIterator.hasNext()) {
                                Cell cell = cellIterator.next();
                                //cell.setCellType(CellType.STRING);
                                String stringCellValue = cell.getStringCellValue();
                                if (!StringUtils.isEmpty(stringCellValue)) {
                                    headList.add(stringCellValue);
                                }
                            }
                        }
                        if (rowIndex > 0) {
                            Object rowObj = sheetClass.newInstance();
                            for2:
                            for (int i = 0; i < fields.size(); ++i) {
                                Field field = (Field) fields.get(i);
                                ExcelField excelField = field.getAnnotation(ExcelField.class);
                                if (excelField == null) {
                                    continue;
                                }
                                String name = excelField.name().trim();
                                if (StringUtils.isEmpty(name)) {
                                    continue;
                                }
                                int index = headList.indexOf(name);
                                if (index < 0) {
                                    continue;
                                }
                                Cell cell = rowX.getCell(index);
                                if (cell != null) {
    
                                    try {
                                        cell.setCellType(CellType.STRING);
                                        String fieldValueStr = cell.getStringCellValue();
                                        if (i == 0 && StringUtils.isEmpty(fieldValueStr)) {
                                            break for1;
                                        }//当前行第一列为空跳出循环for1
                                        Object fieldValue = FieldReflectionUtil.parseValue(field, fieldValueStr);
                                        field.setAccessible(true);
                                        field.set(rowObj, fieldValue);
                                    } catch (Exception ex) {
                                        field.setAccessible(true);
                                        field.set(rowObj, null);
                                    }
                                } else {
                                    if (i == 0) {
                                        break for1;
                                    }//当前行第一列为空跳出循环for1
                                }
                            }
    
                            dataList.add(rowObj);
                        }
                    }
    
                    return dataList;
                } else {
                    throw new RuntimeException(">>>>>>>>>>> xxl-excel error, data field can not be empty.");
                }
            } catch (Exception var15) {
                throw new RuntimeException(var15);
            }
        }
    
        public static List<Object> importExcel(Class<?> sheetClass, InputStream inputStream) {
            try {
                Workbook workbook = WorkbookFactory.create(inputStream);
                List<Object> dataList = importExcel(sheetClass, workbook);
                return dataList;
            } catch (IOException var4) {
                throw new RuntimeException(var4);
            } catch (InvalidFormatException var5) {
                throw new RuntimeException(var5);
            }
        }
    }

    定义实体类接收表格数据,注意列名要对应

    @Data
    @ExcelSheet(name = "Sheet1")
    public class CompetitionUserEntity implements Serializable {
    
        @ExcelField(name = "电话")
        private String loginId;
    
        @ExcelField(name = "姓名")
        private String academicName;
    
        @ExcelField(name = "年级")
        private String grade;
    
        @ExcelField(name = "学校")
        private String school;
    
        @ExcelField(name = "省份")
        private String belongProvince;
    
        @ExcelField(name = "城市")
        private String belongCity;
    
        @ExcelField(name = "区县")
        private String district;
    
    }

    调用:

    Postman 调用:

    service代码:

    返回的list 自己断点看看数据,就知道是否成功

    public Result importData(MultipartFile file) {
            List<CompetitionUserEntity> list = MyExcelUtil.importFromFile(CompetitionUserEntity.class, file);return null;
        }
  • 相关阅读:
    Adding Swap Files
    Creating a Swap Partition
    linux删除或隐藏命令历史记录history
    Unix系统解压tar包时出现@LongLink错误
    【白话经典算法系列之十七】 数组中只出现一次的数 其他三次
    MapReduce原理及其主要实现平台分析
    二叉搜索树转换为有序双向链表
    实现O(1)获取最大最小值的栈----java
    对线性回归,logistic回归和一般回归的认识
    SMO优化算法(Sequential minimal optimization)
  • 原文地址:https://www.cnblogs.com/nongzihong/p/14177845.html
Copyright © 2011-2022 走看看