一、安装 axios
1.1 安装 axios
npm install axios -S
1.2 安装 vue-axios
npm install vue-axios -S
在 package.json 中的 dependencies检查是否成功安装好。
1.3 全局引入 axios
在 main.js中 import 和引入。
import axios from 'axios'const app = createApp(App)// 引入app.config.globalProperties.$axios = axios
二、编写上传界面
<template><el-uploadref="uploadRef"class="upload-demo"action="/uploadExcel"accept=".xls,.xlsx,.csv":on-success="handleFileUploadSuccess":on-change="handleChange":before-upload="handleBeforeUpload":auto-upload="false":limit="5":file-list="fileList"><template #trigger><el-button type="primary">选择 Excel 文件</el-button></template><el-button class="ml-3" type="success" @click="submitUpload">生成</el-button></el-upload></template>export default {name: 'App',components: {HelloWorld},data(){return {fileList: [], // 定义一个空数组}},methods: {/*** 上传之前的处理* @returns {boolean}*/handleBeforeUpload(rawFile) {return true;},/*** 上传成功的处理*/handleFileUploadSuccess(file){},/*** 提交上传的文件*/submitUpload(){// 判断是否有文件再上传if (this.fileList.length === 0) {return this.$message.warning('请选取文件后再上传')}// 下面的代码将创建一个空的 FormData 对象:const formData = new FormData();// 参数的键名为 'file'this.fileList.forEach((file) => {formData.append('file', file.raw);})// 通过 axios 进行上传// uploadExcelFile 后端处理的路径this.params = formData;axios({method: 'post',url: 'http://localhost:8080/uploadExcelFile',data: this.params,headers: {'Content-Type': 'application/x-www-form-urlencoded'}})},/*** 过滤上传的文件类型*/handleChange(file, fileList){if (!/\.(xlsx|xls|XLSX|XLS|csv)$/.test(file.name)) {this.$message({type: 'warning',message: '上传文件只能为 Excel 文件!'})this.fileList = []return false}// 手动上传需要保存 file.rawthis.file = file.raw}}}</script>
三、后端处理 Post 请求
3.1 后端处理函数
@CrossOrigin@Controllerpublic class ExcelController {@Autowiredprivate UploadDAO uploadDAO;/*** 读取用户上传过来的 Excel 文件* @param file 上传的 Excel 文件* @param response*/@PostMapping(value = "/uploadExcelFile")@ResponseBodypublic void readUploadExcel(@RequestParam("file") MultipartFile file) throws IOException {EasyExcel.read(file.getInputStream(), ExcelEntity.class, new ExcelEntityListener(uploadDAO)).sheet(0).doRead();}}
file 就是传递过来的 Excel 文件。
为了获取到 Excel 里面的值,我们还需要一个 Excel 处理框架,我选择了阿里的 easyExcel。
3.2 添加 dependency
<!-- 导入 easyexcel 用来做 excel 处理--><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>3.0.5</version></dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version></dependency>
一块添加 fastjson后面会用来处理获取到的数据,把它 json化。
3.3 创建 Excel 文件的实体类 ExcelEntity.java
@Datapublic class ExcelEntity{@ExcelProperty("订单号")private String orderId; // 订单号private String externalOrderId; // 外部订单号private String orderCommodityState; // 重要:订单商品状态:「待发货」private Date tradeSuccessTime; // 交易成功时间private String commodityName; // 重要:商品名称private String commodityType; // 商品类型private String commodityCategory; // 商品类目private String commoditySpecification; // 重要:商品规格private String specificationCode; // 规格编码, 默认为 ""private String commodityCode; // 商品编码,默认为 ""private double commodityUnitPrice; // 商品单价private String commodityCostPrice; // 商品成本价private String commodityPromotionMethod; // 商品优惠方式private double commodityPromotionAfterPrice; // 商品优惠后价格private int commodityNumber; // 重要:商品数量private double commodityMoneyTotal; // 商品金额小计private String shopPromotion; // 店铺优惠private String commodityActualDealPrice; // 商品实际成交金额private String commodityCreditIntegralNumber; // 商品抵用积分数private String commodityMessage; // 商品留言private String consignee; // 重要:收货人private String consigneeTel; // 重要:收货人手机号private String consigneeProvince; // 重要:收货人所在省份private String consigneeCity; // 重要:收货人所在城市private String consigneeDistrict; // 重要:收货人所在地区private String consigneeDetailAddress; // 重要:收货人所在地址private String buyerRemark; // 买家备注private String commodityShipState; // 商品发货状态private String commodityShipStyle; // 商品发货方式private String commodityShipLogisticsCompany; // 商品发货物流公司private String commodityShipLogisticsId; // 商品发货物流单号private String commodityShipEmployee; // 发货员工private Date commodityShipTime; // 发货时间private String commodityRefundState; // 商品退款状态private String commodityRefundMoney; // 商品已退款金额private String businessmanOrderRemark; // 商家订单备注private Date checkInTime; // 入住时间}
这个会将 Excel 文件中列的数据与类的字段绑定在一块,按照声明的顺序,如果不想按照顺序可以使用 @ExcelProperty("列名")来绑定在一块。
3.4 创建 ExcelEntityListener.java 监听器
/**** @Author 云胡* @Description Excel 工具类* @Date 2022-04-15*/@Slf4jpublic class ExcelEntityListener implements ReadListener<ExcelEntity> {public ExcelEntityListener(UploadDAO uploadDAO) {this.uploadDAO = uploadDAO;}/*** 这个每一条数据解析都会来调用** @param context*/@Overridepublic void invoke(ExcelEntity data, AnalysisContext context) {log.info("解析到一条数据:{}", JSON.toJSONString(data));}/*** 所有数据解析完成了 都会来调用* @param context*/@Overridepublic void doAfterAllAnalysed(AnalysisContext context) {log.info("所有数据解析完成!");}}
3.5 创建 UploadDao.java
@Repositorypublic class UploadDAO {public void save(List<ExcelEntity> list) {// 如果是mybatis,尽量别直接调用多次insert,自己写一个mapper里面新增一个方法batchInsert,所有数据一次性插入}}
目前没有使用,后续可以存到数据库里。
四、结果展示
4.1 本地 Excel 测试数据
| 订单号 | 外部订单号 | 订单商品状态 | 交易成功时间 | 商品名称 | 商品类型 | 商品类目 | 商品规格 | 规格编码 | 商品编码 | 商品单价 | 商品成本价 | 商品优惠方式 | 商品优惠后价格 | 商品数量 | 商品金额小计 | 店铺优惠(分摊) | 商品实际成交金额 | 商品抵用积分数 | 商品留言 | 收货人/提货人 | 收货人手机号/提货人手机号 | 收货人省份 | 收货人城市 | 收货人地区 | 详细收货地址/提货地址 | 买家备注 | 商品发货状态 | 商品发货方式 | 商品发货物流公司 | 商品发货物流单号 | 发货员工 | 商品发货时间 | 商品退款状态 | 商品已退款金额 | 商家订单备注 | 入住时间 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| E20220331142238091806171 | C1728795398635640 | 待发货 | Muchshow美腹贴 塑形新科技 | 普通类型商品 | 其他 | 美腹贴女士2盒 | 278.8 | 278.8 | 1 | 278.8 | 69.20(分销商等级折扣:47.80) | 348 | 0 | 孙悟空 | 13666666666 | 云南省 | 昆明市 | 盘龙区 | 云南省昆明市盘龙区佛寺 | 未发货 | 快递 | 0 | ||||||||||||||
| E20220330182239081300015 | C1728719896969425 | 待发货 | 【环保袋中的爱马仕】德国单肩时尚环保袋 超轻便携 创意礼品 博物馆系列 | 普通类型商品 | 其他 | 麦田 | 73.5 | 73.5 | 1 | 73.5 | 24.50(分销商等级折扣:9.80) | 98 | 0 | 猪八戒 | 13999999999 | 山东省 | 淄博市 | 张店区 | 山东省淄博市张店区佛寺 | 未发货 | 快递 | 0 |
4.2 上传

点击选择 Excel 文件,将本地 Excel 文件上传,然后点击生成。
4.3 log 输出的 Excel 数据
2022-04-15 18:40:29.964 INFO 17068 --- [nio-8080-exec-1] c.e.c.Util.ExcelEntityListener : 解析到一条数据:{"commodityActualDealPrice":"348","commodityCategory":"其他","commodityCreditIntegralNumber":"0","commodityMoneyTotal":278.8,"commodityName":"Muchshow美腹贴 塑形新科技","commodityNumber":1,"commodityPromotionAfterPrice":278.8,"commodityRefundMoney":"0","commodityShipState":"未发货","commodityShipStyle":"快递","commoditySpecification":"美腹贴女士2盒","commodityType":"普通类型商品","commodityUnitPrice":278.8,"consignee":"孙悟空","consigneeCity":"昆明市","consigneeDetailAddress":"云南省昆明市盘龙区佛寺","consigneeDistrict":"盘龙区","consigneeProvince":"云南省","consigneeTel":"13666666666","externalOrderId":"C1728795398635640","orderCommodityState":"待发货","orderId":"E20220331142238091806171","shopPromotion":"69.20(分销商等级折扣:47.80)"}2022-04-15 18:40:29.967 INFO 17068 --- [nio-8080-exec-1] c.e.c.Util.ExcelEntityListener : 解析到一条数据:{"commodityActualDealPrice":"98","commodityCategory":"其他","commodityCreditIntegralNumber":"0","commodityMoneyTotal":73.5,"commodityName":"【环保袋中的爱马仕】德国单肩时尚环保袋 超轻便携 创意礼品 博物馆系列","commodityNumber":1,"commodityPromotionAfterPrice":73.5,"commodityRefundMoney":"0","commodityShipState":"未发货","commodityShipStyle":"快递","commoditySpecification":"麦田","commodityType":"普通类型商品","commodityUnitPrice":73.5,"consignee":"猪八戒","consigneeCity":"淄博市","consigneeDetailAddress":"山东省淄博市张店区佛寺","consigneeDistrict":"张店区","consigneeProvince":"山东省","consigneeTel":"13999999999","externalOrderId":"C1728719896969425","orderCommodityState":"待发货","orderId":"E20220330182239081300015","shopPromotion":"24.50(分销商等级折扣:9.80)"}2022-04-15 18:40:29.968 INFO 17068 --- [nio-8080-exec-1] c.e.c.Util.ExcelEntityListener : 所有数据解析完成!
