利用@Excel实现复杂表头导入

news2024/11/25 15:33:50

EasyPoi导入

<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl"
          @change="handleImportExcel">
  <a-button type="primary" icon="import">导入数据</a-button>
</a-upload>
data() {
    return {
      url: {
        importExcelUrl: 'cs/csBalanceAgent/importExcel'
      }
    }
  },
methods: {
    importExcelUrl: function() {
      return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`
    },
    /* 导入 */
    handleImportExcel(info) {
      console.log('info-----------------', info)
      this.loading = true
      if (info.file.status !== 'uploading') {
        console.log('file==================', info.file, info.fileList)
      }
      if (info.file.status === 'done') {
        this.loading = false
        if (info.file.response.success) {
          // this.$message.success(`${info.file.name} 文件上传成功`);
          if (info.file.response.code === 201) {
            let { message, result: { msg, fileUrl, fileName } } = info.file.response
            let href = window._CONFIG['domianURL'] + fileUrl
            this.$warning({
              title: message,
              content: (<div>
                  <span>{msg}</span><br />
                  <span>具体详情请 <a href={href} target="_blank" download={fileName}>点击下载</a> </span>
                </div>
              )
            })
          } else {
            this.$message.success(info.file.response.message || `${info.file.name} 文件上传成功`)
          }
          // this.loadData()
          this.$refs.tablePage.refreshTable()
        } else {
          this.$message.error(`${info.file.name} ${info.file.response.message}.`)
        }
      } else if (info.file.status === 'error') {
        this.loading = false
        if (info.file.response.status === 500) {
          let data = info.file.response
          const token = Vue.ls.get(ACCESS_TOKEN)
          if (token && data.message.includes('Token失效')) {
            this.$error({
              title: '登录已过期',
              content: '很抱歉,登录已过期,请重新登录',
              okText: '重新登录',
              mask: false,
              onOk: () => {
                store.dispatch('Logout').then(() => {
                  Vue.ls.remove(ACCESS_TOKEN)
                  window.location.reload()
                })
              }
            })
          }
        } else {
          this.$message.error(`文件上传失败: ${info.file.msg} `)
        }
      }
    },
}	

Controller

/**
 * 通过excel导入数据
 *
 * @return
 */
@RequestMapping(value = "/importExcel", method = RequestMethod.POST)
public Result<?> importExcel(@RequestParam("file") MultipartFile file) {
 return csBalanceAgentService.importExcelData(file);
}

实现类

@Override
public Result<?> importExcelData(MultipartFile file) {
    List<CsBalanceAgent> list = null;

    ImportParams importParams = new ImportParams();
    importParams.setTitleRows(1);
    importParams.setHeadRows(2);

    try {
        list = ExcelImportUtil.importExcel(file.getInputStream(), CsBalanceAgent.class, importParams);
    } catch (Exception e) {
        e.printStackTrace();
    }

    if (list == null) {
        return Result.error("没有有效的数据,导入数据失败");
    }

    this.saveBatch(list);
    return Result.OK("导入成功");
}

实体类处理

复杂表头导入

  • 通过needMerge属性实现表头合并多行

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

  • 再开始分组的第一列属性添加groupName属性即可解决导入为空的现象

在这里插入图片描述
在这里插入图片描述

实体类

@Data
@TableName("cs_balance_agent")

@ApiModel(value = "cs_balance_agent对象", description="平衡剂")
public class CsBalanceAgent {
    
   /**主键*/
   @TableId(type = IdType.ASSIGN_ID)
    @ApiModelProperty(value = "主键")
   private String id;
   /**公司名称*/
   @Excel(name = "公司名称", width = 35, needMerge = true)
    @ApiModelProperty(value = "公司名称")
   private String companyName;
   /**装置*/
   @Excel(name = "装置", width = 35, needMerge = true)
    @ApiModelProperty(value = "装置")
   private String device;
   /**样品类型*/
   @Excel(name = "样品类型", width = 35, needMerge = true)
    @ApiModelProperty(value = "样品类型")
   private String sampleType;
   /**样品编号*/
   @Excel(name = "样品编号", width = 35, needMerge = true)
    @ApiModelProperty(value = "样品编号")
   private String sampleNum;
   /**采样日期*/
   @Excel(name = "采样日期", width = 20, format = "yyyy-MM-dd", needMerge = true)
    @ApiModelProperty(value = "采样日期")
   private Date sampleDate;
   /**分析日期*/
   @Excel(name = "分析日期", width = 20, format = "yyyy-MM-dd", needMerge = true)
    @ApiModelProperty(value = "分析日期")
   private Date analyseDate;
   /**报送时间*/
   @Excel(name = "报送时间", width = 20, format = "yyyy-MM-dd", needMerge = true)
    @ApiModelProperty(value = "报送时间")
   private Date submitTime;
   /**比表面积*/
   @Excel(name = "比表面积(m2/g)", width = 35, groupName = "物理性质")
    @ApiModelProperty(value = "比表面积(m2/g)")
   private Integer bSurfaceArea;
   /**孔体积*/
   @Excel(name = "孔体积 (ml/g)", width = 35)
    @ApiModelProperty(value = "孔体积 (ml/g)")
   private BigDecimal holeHole;
   /**表观密度*/
   @Excel(name = "表观密度 (g/ml)", width = 35)
    @ApiModelProperty(value = "表观密度 (g/ml)")
   private BigDecimal surfaceDensity;
   /**充气密度*/
   @Excel(name = "充气密度(g/mL)", width = 35)
    @ApiModelProperty(value = "充气密度(g/mL)")
   private BigDecimal aerateDensity;
   /**压实密度*/
   @Excel(name = "压实密度(g/mL)", width = 35)
    @ApiModelProperty(value = "压实密度(g/mL)")
   private BigDecimal compactDensity;
   /**沉降密度*/
   @Excel(name = "沉降密度(g/mL)", width = 35)
    @ApiModelProperty(value = "沉降密度(g/mL)")
   private BigDecimal settleDensity;
   /**APS*/
   @Excel(name = "APS(μm)", width = 35)
    @ApiModelProperty(value = "APS(μm)")
   private BigDecimal aps;
   /**0-20μm*/
   @Excel(name = "0-20μm(%(v/v))", width = 35)
    @ApiModelProperty(value = "0-20μm(%(v/v))")
   private BigDecimal zeroToTwenty;
   /**20-40μm*/
   @Excel(name = "20-40μm(%(v/v))", width = 35)
    @ApiModelProperty(value = "20-40μm(%(v/v))")
   private BigDecimal twentyToForty;
   /**40-60μm*/
   @Excel(name = "40-60μm(%(v/v))", width = 35)
    @ApiModelProperty(value = "40-60μm(%(v/v))")
   private BigDecimal fortySixty;
   /**60-80μm*/
   @Excel(name = "60-80μm(%(v/v))", width = 35)
    @ApiModelProperty(value = "60-80μm(%(v/v))")
   private BigDecimal sixtyEighty;
   /**80-110μm*/
   @Excel(name = "80-110μm(%(v/v))", width = 35)
    @ApiModelProperty(value = "80-110μm(%(v/v))")
   private BigDecimal eightyHundredTen;
   /**>111μm*/
   @Excel(name = ">111μm(%(v/v))", width = 35)
    @ApiModelProperty(value = ">111μm(%(v/v))")
   @TableField(value = "g_oneoneone")
   private BigDecimal goneoneone;
   /**RE2O3*/
   @Excel(name = "RE2O3(μg/g)", width = 35, groupName = "化学性质")
    @ApiModelProperty(value = "RE2O3(μg/g)")
   private Integer retwoo3;
   /**AL2O3*/
   @Excel(name = "AL2O3(μg/g)", width = 35)
    @ApiModelProperty(value = "AL2O3(μg/g)")
   private Integer altwoothree;
   /**NA2O*/
   @Excel(name = "NA2O(μg/g)", width = 35)
    @ApiModelProperty(value = "NA2O(μg/g)")
   private Integer natwoo;
   /**Ca*/
   @Excel(name = "Ca(μg/g)", width = 35)
    @ApiModelProperty(value = "Ca(μg/g)")
   private Integer ca;
   /**Cu*/
   @Excel(name = "Cu(μg/g)", width = 35)
    @ApiModelProperty(value = "Cu(μg/g)")
   private Integer cu;
   /**Fe*/
   @Excel(name = "Fe(μg/g)", width = 35)
    @ApiModelProperty(value = "Fe(μg/g)")
   private Integer fe;
   /**Na*/
   @Excel(name = "Na(μg/g)", width = 35)
    @ApiModelProperty(value = "Na(μg/g)")
   private Integer na;
   /**Ni*/
   @Excel(name = "Ni(μg/g)", width = 35)
    @ApiModelProperty(value = "Ni(μg/g)")
   private Integer ni;
   /**Sb*/
   @Excel(name = "Sb(μg/g)", width = 35)
    @ApiModelProperty(value = "Sb(μg/g)")
   private Integer sb;
   /**V*/
   @Excel(name = "V(μg/g)", width = 35)
    @ApiModelProperty(value = "V(μg/g)")
   private Integer v;
   /**C*/
   @Excel(name = "C(μg/g)", width = 35)
    @ApiModelProperty(value = "C(μg/g)")
   private BigDecimal c;
   /**微活*/
   @Excel(name = "微活(%)", width = 35)
    @ApiModelProperty(value = "微活(%)")
   private Integer microactivity;
   /**创建人*/
   @ExcelIgnore
    @ApiModelProperty(value = "创建人")
   private String createBy;
   /**创建时间*/
   @ExcelIgnore
    @ApiModelProperty(value = "创建时间")
   private Date createTime;
   /**修改人*/
   @ExcelIgnore
    @ApiModelProperty(value = "修改人")
   private String updateBy;
   /**修改时间*/
   @ExcelIgnore
    @ApiModelProperty(value = "修改时间")
   private Date updateTime;
}

@excel中都有哪些属见 https://blog.csdn.net/m0_63686648/article/details/126429863

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/778732.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【软件测试】如何选择回归用例

目录 如何在原始用例集中挑选测试用例 具体实践 总结 本文讨论一下在回归测试活动中&#xff0c;如何选择测试用例集。 回归测试用例集包括基本测试用例集&#xff08;原始用例&#xff09;迭代新增测试用例集&#xff08;修复故障引入的用例和新增功能引入的用例集&#xf…

洛必达法则和分部积分的应用之计算数学期望EX--概率论浙大版填坑记

如下图所示&#xff0c;概率论与数理统计浙大第四版有如下例题&#xff1a; 简单说就是&#xff1a;已知两个相互独立工作电子装置寿命的概率密度函数&#xff0c;将二者串联成整机&#xff0c;求整机寿命的数学期望。 这个题目解答中的微积分部分可谓是相当的坑爹&#xff0c;…

【1++的C++初阶】之适配器

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C初阶】 文章目录 一&#xff0c;什么是适配器二&#xff0c;栈与队列模拟实现三&#xff0c;优先级队列四&#xff0c;reverse_iterator 一&#xff0c;什么是适配器 适配器作为STL的六大组…

【高阶数据结构】跳表

文章目录 一、什么是跳表二、跳表的效率如何保证&#xff1f;三、skiplist的实现四、skiplist跟平衡搜索树和哈希表的对比 一、什么是跳表 skiplist本质上也是一种查找结构&#xff0c;用于解决算法中的查找问题&#xff0c;跟平衡搜索树和哈希表的价值是 一样的&#xff0c;可…

Windows环境Docker安装

目录 安装Docker Desktop的步骤 Docker Desktop 更新WSL WSL 的手动安装步骤 Windows PowerShell 拉取&#xff08;Pull&#xff09;镜像 查看已下载的镜像 输出"Hello Docker!" Docker Desktop是Docker官方提供的用于Windows的图形化桌面应用程序&#xff0c…

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测

区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测 目录 区间预测 | MATLAB实现QRBiLSTM双向长短期记忆神经网络分位数回归多输入单输出区间预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 区间预测 | MATLAB实现QRBiLSTM…

odoo16 用好计量单位中的激活功能

odoo16 用好计量单位中的激活功能 根据国内常用&#xff0c;把不常用的单位去除&#xff0c;删除不了&#xff0c;提示已用&#xff0c;其实不用删除&#xff0c;每个单位后有个激活功能&#xff0c;选一下就可以了&#xff0c;显示成整洁的界面了 第一次用时&#xff0c;小伙伴…

解决spring cloud 中使用spring security全局异常处理器失效

写auth认证模块实现忘记密码与注册功能时&#xff0c;用异常抛出&#xff0c;全局异常处理器无法捕获。 无法进行异常捕捉 解决方案&#xff1a;使用WebSecurityConfigurerAdapter.configure中http实现自定义异常&#xff1a; EnableWebSecurity EnableGlobalMethodSecurity(…

87、springcloud核心组件及其作用

spring Eureka: 服务注册与发现 注册:&#xff1a;每个服务都向Eureka登记自己提供服务的元数据&#xff0c;包括服务的ip地址、端口号、版本号、通信协议等 eureka将各个服务维护在了一个服务清单中 (双层Map&#xff0c;第一层key是服务名&#xff0c;第二层key是实例名&…

macOS 源码编译 qpress

╰─➤ git clone https://github.com/PierreLvx/qpress.git ╰─➤ cd qpress ╰─➤ make g -O3 -o qpress -x c quicklz.c -x c qpress.cpp aio.cpp utilities.cpp -lpthread -Wall -Wextra -Werror ╰─➤ sudo make install …

Vue--》打造个性化医疗服务的医院预约系统(三)

今天开始使用 vue3 + ts 搭建一个医院预约系统的前台页面,因为文章会将项目的每一个地方代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的GithHub上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关…

Java基础小知识(待续)

类型转换、ASCII码、除法取余、三元表达式 long x 100;//int->long自动类型转换&#xff08;隐式) 1&#xff0e;特点:代码不需要进行特殊处理&#xff0c;自动完成。2&#xff0e;规则:数据范围从小到大。double y 2.5F;//2.5 float->double自动类型转换&#xff08…

pyqt5-Ctrl+鼠标滚轮实现文本区文字大小调整

技术简介 在 PyQt5 中&#xff0c;你可以使用 QTextEdit 的 wheelEvent 方法和 QKeyEvent 的 key() 方法来检测 Ctrl 键和鼠标滚轮事件&#xff0c;从而实现按下 Ctrl 键并滚动鼠标滚轮时&#xff0c;调整 QTextEdit 的字体大小。 这个示例中&#xff0c;我们创建了一个窗口&am…

模板方法模式(java)

目录 结构 案例 代码实现 抽象类 具体子类 测试类 优缺点 优点 缺点 结构 模板方法&#xff08;Template Method&#xff09;模式包含以下主要角色&#xff1a; 抽象类&#xff08;Abstract Class&#xff09;&#xff1a;负责给出一个算法的轮廓和骨架。它由一个模板…

基于SPDK-vhost的云原生Kubevirt虚拟化存储IO的优化方案

摘要 本文主要介绍针对云原生kubernetes虚拟化IO的应用场景&#xff0c;在Kubevirt中引入SPDK-vhost的支持&#xff0c;来加速虚机中IO存储性能。同时基于Intel开源的Workload Service Framework[1]平台集成部署一套端到端虚拟化IO的应用场景做基本的性能对比测试。 云原生Kube…

Failed to load response data:No data found for resource with given identifier

前言 关于跨域的另一种解释 前端Ajax访问后端&#xff0c;表单提交&#xff0c;有一个接口报错&#xff0c;其他都没问题 网上看了很多案例方法&#xff0c;均不适用&#xff1b;早上改代码过程中&#xff0c;改好了&#xff0c;话不多说&#xff0c;上原因 原因 提前关闭页…

CentOS7系统下Docker容器基于TensorFlow测试GPU

前言 当基于nvidia gpu开发的docker镜像在实际部署时&#xff0c;需要先安装nvidia docker。安装nvidia docker前需要先安装原生docker compose 1. CentOS7安装docker详细教程 安装docker 1. Docker 要求 CentOS 系统的内核版本高于 3.10 &#xff0c;查看本页面的前提条件来验…

辅助笔记-linux新增硬盘

linux新增硬盘 文章目录 linux新增硬盘步骤1&#xff1a;添加硬盘步骤2&#xff1a;对硬盘进行分区步骤3&#xff1a;对硬盘分区进行格式化步骤4&#xff1a;将硬盘分区挂载到目录上步骤5&#xff1a;设置“永久挂载” 本文主要参考B站视频“P59_韩顺平Linux_增加磁盘应用实例”…

IDEA: 将第三方依赖打入jar包

文章目录 一、添加自定义的jar包到lib目录下二、将自定义依赖包打入jar包方式1、使用springboot自带的插件 一、添加自定义的jar包到lib目录下 参考往期文章&#xff1a;IDEA中Java项目创建lib目录(添加依赖jar包代替maven依赖) 二、将自定义依赖包打入jar包 方式1、使用spr…

centos7下载mysql5.7,jdk1.8

前言&#xff1a;最近公司服务器从阿里云换到腾讯云了&#xff08;为了省钱啧啧&#xff09;&#xff0c;所以这个相关环境的配置工作&#xff0c;由我来负责了。 1.Mysql 1.下载 第一步&#xff1a; rpm -ivh https://dev.mysql.com/get/mysql57-community-release-el7-11…