我的编程笔记
  • 云胡的编程笔记
  • 后端
    • Spring Boot 配置 MySQL 数据库
    • MyBatis-Plus 实现增删改查操作
    • Java 后端将上传的 csv 文件转为 Excel xlsx 文件
  • JavaScript
    • JavaScript 三种循环方法
    • JavaScript 箭头函数
    • JavaScript 高阶函数
    • JavaScript 变量作用域
    • JavaScript 操作 DOM
  • Vue3
    • Vue3 搭配 Element-Plus
    • Vue3 实现路由跳转
    • Vue3 上传 Excel 文件
  • Cpp
    • C++ Vector 易错点
  • Qt
    • Qt 实时显示鼠标位置
  • Python
  • 编辑器
    • Visual Studio Code 使用
  • 其他
    • 网站和软件推荐
  • 数据结构与算法
由 GitBook 提供支持
在本页
  • 一、安装 axios
  • 二、编写上传界面
  • 三、后端处理 Post 请求
  • 3.5 创建 UploadDao.java
  • 四、结果展示
  • 4.3 log 输出的 Excel 数据
在GitHub上编辑
  1. Vue3

Vue3 上传 Excel 文件

一、安装 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-upload
      ref="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.raw
      this.file = file.raw 
    }
  }
}
</script>

三、后端处理 Post 请求

3.1 后端处理函数

@CrossOrigin
@Controller
public class ExcelController {
    @Autowired
    private UploadDAO uploadDAO;
	
    /**
     * 读取用户上传过来的 Excel 文件
     * @param file 上传的 Excel 文件
     * @param response
     */
    @PostMapping(value = "/uploadExcelFile")
    @ResponseBody
    public 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

@Data
public 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
 */

@Slf4j
public class ExcelEntityListener implements ReadListener<ExcelEntity> {
    public ExcelEntityListener(UploadDAO uploadDAO) {
        this.uploadDAO = uploadDAO;
    }

    /**
     * 这个每一条数据解析都会来调用
     *
     * @param context
     */
    @Override
    public void invoke(ExcelEntity data, AnalysisContext context) {
        log.info("解析到一条数据:{}", JSON.toJSONString(data));
    }

    /**
     * 所有数据解析完成了 都会来调用
     * @param context
     */
    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

        log.info("所有数据解析完成!");
    }
}

3.5 创建 UploadDao.java

@Repository
public 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 上传

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             : 所有数据解析完成!
上一页Vue3 实现路由跳转下一页Cpp

最后更新于3年前

点击选择 Excel 文件,将本地 Excel 文件上传,然后点击生成。

image.png