SpringBoot+VUE 导入导出excel表格

背景需求:在后台管理系统中批量导入教师信息,如图:

下载的excel模板如图所示:

 前端代码:

<template>
  <div>
    <avue-form :option="excelOption" v-model="excelForm" :upload-after="uploadAfter" class="uploadFiles">
      <template slot="excelTemplate">
        <el-button type="primary" @click="handleTemplate">
          点击下载<i class="el-icon-download el-icon--right"></i>
        </el-button>
      </template>
    </avue-form>
    <el-row>
      <div style="font-size: 10px;color: #76797c;margin-left: 30px;">
        提示:导入的时候,默认跳过标题栏,所以不用手动去掉。手机号是唯一字段,如果重复导入会更新原来的数据。
        <p>如果导入数据包含系统未录入的院系、专业、班级,则会跳过</p>
      </div>
    </el-row>
  </div>
</template>

<script>
  import {mapGetters} from "vuex";
  import {getToken} from '@/util/auth';
  import {jdConst} from "@/api/jd/jd.js"

  export default {
    props: {
      tabType: {
        type: String,
        default: "",
      }
    },
    data() {
      return {
        loading: true,
        excelForm: {},
        excelOption: {
          submitBtn: false,
          emptyBtn: false,
          column: [
            {
              label: '模板上传',
              prop: 'excelFile',
              type: 'upload',
              drag: true,
              loadText: '模板上传中,请稍等',
              span: 24,
              propsHttp: {
                res: 'data'
              },
              tip: '请上传 .xls,.xlsx 标准格式文件;',
              action: jdConst.url + "/import_data/import-result?type=" + this.tabType
            },
            {
              label: '模板下载',
              prop: 'excelTemplate',
              formslot: true,
              span: 24,
            }
          ]
        },
      };
    },
    computed: {
      ...mapGetters(["permission"]),
      permissionList() {
        return {
          addBtn: false,
          viewBtn: false,
          delBtn: false,
          editBtn: false
        };
      },
    },
    watch: {
      "tabType"() {
        if (this.tabType !== '') {
          const column = this.findObject(this.excelOption.column, "excelFile");
          column.action = jdConst.url + `/import_data/import-result?type=${this.tabType}`;
        }
      }
    },
    methods: {

      // 导出模板
      handleTemplate() {
        if (this.tabType === '' || this.tabType == null) {
          return;
        }
        window.open(jdConst.url + `/import_data/export-template?${this.website.tokenHeader}=${getToken()}&type=${this.tabType}`);
      },

      // uploadAfter(res, done, loading, column) {
      //   window.console.log(column);
      //   done();
      // },

    }
  };
</script>

<style scoped lang="scss">
  .uploadFiles {
    /deep/ .el-upload-list {
      display: none;
    }
  }
</style>

Java代码:

首先在maven中导入excel包

<dependency>
    <groupId>org.springblade</groupId>
    <artifactId>blade-starter-excel</artifactId>
</dependency>

导出模板代码:

 excel模板类:

@Data
@ColumnWidth(25)
@HeadRowHeight(20)
@ContentRowHeight(18)
public class TeacherTemplate implements Serializable {

    private static final long serialVersionUID = 1L;

    @ColumnWidth(30)
    @ExcelProperty("院系")
    private String collegeName;

    @ColumnWidth(30)
    @ExcelProperty("专业")
    private String majorName;

    @ColumnWidth(30)
    @ExcelProperty("教师名字")
    private String teacherName;

    @ColumnWidth(30)
    @ExcelProperty("手机号")
    private String mobile;

}

导入数据:

教师数据导入类:
@RequiredArgsConstructor
public class TeacherImporter implements ExcelImporter<TeacherTemplate> {

    private final ITeacherService teacherService;

    @Override
    public void save(List<TeacherTemplate> data) {
        teacherService.importResult(data);
    }
}

 将数据存入数据库:

    @Override
	public void importResult(List<TeacherTemplate> data) {
		data.forEach(teacherExcel -> {

			// 获取院系id
			Long collegeId = collegeService.getCollegeId(teacherExcel.getCollegeName());
			// 获取专业id
			Long majorId = majorService.getMajorId(teacherExcel.getMajorName());

			if (Func.isEmpty(collegeId)) {
				return;
			}
			if (Func.isEmpty(majorId)) {
				return;
			}

			// 判断某院系下是否存在该专业
			if (!majorService.isExitMajor(collegeId, majorId)) {
				return;
			}

			// 根据手机号码和教师姓名查询是否该教师存在
			Teacher teacher = this.getOne(Wrappers.<Teacher>lambdaQuery()
                .eq(Teacher::getMobile, teacherExcel.getMobile())
                .eq(Teacher::getTeacherName, teacherExcel.getTeacherName()));

			if (Func.isNotEmpty(teacher)) {// 如果教师存在,更新院系和专业
				teacher.setCollegeId(collegeId);
				teacher.setMajorId(majorId);
				this.updateById(teacher);// 更新数据
			} else {
				Teacher teacherNew = new Teacher();
				teacherNew.setCollegeId(collegeId);
				teacherNew.setMajorId(majorId);
				teacherNew.setTeacherName(teacherExcel.getTeacherName());
				teacherNew.setMobile(teacherExcel.getMobile());
				this.save(teacherNew);// 新增数据
			}

		});
	}

导入导出大概流程如上所述,完成!!!!!!

参考资料:

写excel · 语雀EasyExcel写Excel的示例https://www.yuque.com/easyexcel/doc/write

  • 2
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值