使用easysexcel数据导入

本文介绍了如何在前端使用Element-UI组件配合EasyExcel库实现Excel文件的上传,后端通过解析Excel数据并将内容存储到数据库的过程,包括ExcelProperty注解的使用和数据验证。
摘要由CSDN通过智能技术生成

使用表格导入easysexcel

前端

用到element-ui组件


        <!-- 导入 -->

        <el-upload class="upload-demo" multiple="" method="post" action="http://localhost:8080/question/updown"
            style="margin-left: 10px;float: left;" accept=".xlsx,.xls" :show-file-list="false"
            :on-success="function (resp) { scc = resp.code }" name="files">

            <el-button type="info" style="height: 40px; width: 100px;  margin-left: -110px; margin-top: 50px;"
                slot="trigger">导入</el-button>

        </el-upload>

后端

1.导入依赖

      <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>3.1.1</version>
        </dependency>

2.在对应的domain层操作(ExcelProperty)

package com.yjha.domain;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

@Data
public class ExcelToQuestion {

    @ExcelProperty("科目")
    private String subjectName;

    @ExcelProperty("试题")
    private String questionText;

    @ExcelProperty("正确答案")
    private String rightText;

    @ExcelProperty("选项")
    private String optionText;
}

3. 创建一个监听器类(listerner)

	package com.yjha.listerner;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.exception.ExcelDataConvertException;
import com.alibaba.excel.metadata.CellExtra;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.Field;
import java.util.List;

    /**
     * @Description 导入表格程序 使用EasyExcel
     * @Author
     * @Date Created in 2021/9/27
     * @E-mail 862166318@qq.com
     */
    @Slf4j
    public class EasyExcelUtils {

        // 使用静态内部类 (这里使用泛型为例支持各种数据的导入)
        public static class EasyEventListener<T> extends AnalysisEventListener<T> {
            private List<T> excels;

            // 从第几行读取 默认为空,如果又合并的单元格就去获取EasyExcel 内置ReadSheetHolder 然后获取读取的开始行。
            // 没有合并的单元格,则用不上该属性
            private Integer headRowNumber = null;

            //单例模式
            public EasyEventListener(List<T> cityExcels) {
                this.excels = cityExcels;
            }

            // 这个是每行的数据(每一行都会执行这个)
            @Override
            public void invoke(T data, AnalysisContext context) {
//            System.out.println(JSONObject.toJSON(data));
                excels.add(data);
            }

            // 这个是全部读取完成后的回调
            @Override
            public void doAfterAllAnalysed(AnalysisContext context) {
                log.info("地址读取完毕!");
            }

            // 这个是读取异常是的回调
//            @Override
//            public void onException(Exception exception, AnalysisContext context) throws Exception {
//                System.err.println("解析失败,但是继续解析下一行: " + exception.getMessage());
//                // 如果是某一个单元格的转换异常 能获取到具体行号
//                if (exception instanceof ExcelDataConvertException) {
//                    ExcelDataConvertException excelDataConvertException = (ExcelDataConvertException)exception;
//                    System.err.println("第{}行,第{}列解析异常" + excelDataConvertException.getRowIndex() +
//                            excelDataConvertException.getColumnIndex());
//                }
            super.onException(exception, context);
//            }

            // 这个是读取单元格和并时的信息
//            @SneakyThrows
//            @Override
//            public void extra(CellExtra extra, AnalysisContext context) {
//                // 解析合并单元格的信息 利用反射给合并的单元格读不到值时,进行赋值
//                if(headRowNumber==null){
//                    headRowNumber = context.readSheetHolder().getHeadRowNumber();
//                }
//                // 获取合并后的第一个索引
//                Integer index = extra.getFirstRowIndex() - headRowNumber;
//                // 获取合并后的最后一个索引
//                Integer lastRowIndex = extra.getLastRowIndex() - headRowNumber;
//                // 获取合并后的第一个值
//                T t = excels.get(index);
//                // 利用反射获取所有私有属性
//                Field[] fields = t.getClass().getDeclaredFields();
//                for (Field field:fields) {
//                    // 让该属性可操作
//                    field.setAccessible(true);
//                    // 获取EasyExcel 原有注解
//                    ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
//                    // 循环遍历空缺的值
//                    for (int i = index+1; i <= lastRowIndex; i++) {
//                        // 当读取的列索引等于注解的索引时,表示就是该属性赋值
//                        if (extra.getFirstColumnIndex().equals(annotation.index())){
//                            // 利用反射赋值
//                            field.set(excels.get(i),field.get(t));
//                        }
//                    }
//                }
//            }
//        }
        }
    }



4.对应的controller层进行逻辑编写

 /**
     * Excel 试题导入
     * @param files
     * @throws IOException
     */
    @PostMapping("/updown")
    public void addQuestions(@RequestParam("files")MultipartFile files) throws IOException {

        List<ExcelToQuestion> questions = new ArrayList<>();

        EasyExcel.read(files.getInputStream(), ExcelToQuestion.class,new EasyExcelUtils.EasyEventListener(questions))

                .extraRead(CellExtraTypeEnum.MERGE).excelType(ExcelTypeEnum.XLSX).headRowNumber(1).sheet(0).doRead();



        String questionId = null;

        String uuid2 = null;

        String rr = "123";

        for (ExcelToQuestion questionList:questions) {


            if (questionList.getQuestionText() != null){

                //获取科目ID
                int subjectId = subjectsService.findSubjectIdByName(questionList.getSubjectName());

                // 题目对应的uuid
                 questionId = CreatUuid.getUUID();

                //正确答案的uuid
                String uuid = CreatUuid.getUUID();

                questionsService.insertQuestions(questionId,questionList.getQuestionText(),subjectId,uuid);

                 rr =  questionList.getRightText();

                 uuid2 = uuid;

                if (rr.equals(questionList.getOptionText())){

                    optionsService.insertOptions(questionList.getRightText(),uuid2,questionId);

                }else {

                    String uuid1 = CreatUuid.getUUID();
                    optionsService.insertOptions(questionList.getOptionText(),uuid1,questionId);
                }

                continue;
            }

            if (rr.equals(questionList.getOptionText())){

                optionsService.insertOptions(questionList.getOptionText(),uuid2,questionId);

            }else {

                String uuid1 = CreatUuid.getUUID();
                optionsService.insertOptions(questionList.getOptionText(),uuid1,questionId);
            }

        }

    }
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值