若依ruoyi-vue实现excel导入导出

文章目录

  • @Excel注解
  • excel数据导入
    • 前端实现
    • 后端实现
  • 下载模板
    • 前端实现
    • 后端实现
  • excel数据导出
    • 前端实现
    • 后端实现
  • 自定义标题信息
    • 导出用户管理表格新增标题(用户列表)
    • 导入表格包含标题处理方式
  • 自定义数据处理器
  • 自定义隐藏属性列
  • 导入对象的子对象
  • 导出对象的子列表

@Excel注解

在实际开发中经常需要使用导入导出功能来加快数据的操作。在项目中可以使用注解来完成此项功能。 在需要被导入导出的实体类属性添加@Excel注解。
在使用@Excel注解时,通常可以使用的参数包括:

  1. name:指定Excel列的标题名称,用于导出时生成Excel文件的表头。
  2. orderNum:指定Excel列的顺序,从0开始,用于导出时确定列的顺序。
  3. type:指定导入导出时的数据类型转换,例如可以指定日期格式、数字格式等。
  4. width:指定Excel列的宽度,用于导出时设置列宽。
  5. height:指定Excel行的高度,用于导出时设置行高。
  6. format:指定导入导出时的数据格式,例如可以指定日期的格式化方式。
  7. replace:指定导入导出时的值替换规则,例如可以将特定的值替换为另一个值。
  8. exportFormat:指定导出时的数据格式,例如可以指定数字的格式化方式。
  9. importFormat:指定导入时的数据格式,例如可以指定日期的解析方式。

以上参数中,nameorderNum通常是必需的,其他参数根据实际需求进行选择。在使用时,可以根据具体情况来决定是否需要设置这些参数。

excel数据导入

目前若依的版本是在用户管理页面有数据导入的功能:
在这里插入图片描述
在这里插入图片描述

前端实现

导入功能前端的实现和之前文件上传差不多。

<!-- 用户导入对话框 -->
<el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body><el-uploadref="upload":limit="1"accept=".xlsx, .xls":headers="upload.headers":action="upload.url + '?updateSupport=' + upload.updateSupport":disabled="upload.isUploading":on-progress="handleFileUploadProgress":on-success="handleFileSuccess":auto-upload="false"drag><i class="el-icon-upload"></i><div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div><div class="el-upload__tip text-center" slot="tip"><div class="el-upload__tip" slot="tip"><el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的用户数据</div><span>仅允许导入xls、xlsx格式文件。</span><el-link type="primary" :underline="false" style="font-size:12px;vertical-align: baseline;" @click="importTemplate">下载模板</el-link></div></el-upload><div slot="footer" class="dialog-footer"><el-button type="primary" @click="submitFileForm">确 定</el-button><el-button @click="upload.open = false">取 消</el-button></div>
</el-dialog>
// 文件上传中处理
handleFileUploadProgress(event, file, fileList) {this.upload.isUploading = true;
},
// 文件上传成功处理
handleFileSuccess(response, file, fileList) {this.upload.open = false;this.upload.isUploading = false;this.$refs.upload.clearFiles();this.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "导入结果", { dangerouslyUseHTMLString: true });this.getList();
},// 提交上传文件
submitFileForm() {this.$refs.upload.submit();
}

后端实现

在实体变量上添加@Excel注解,默认为导出导入,也可以单独设置仅导入Type.IMPORT

@Excel(name = "用户序号")
private Long id;@Excel(name = "部门编号", type = Type.IMPORT)
private Long deptId;@Excel(name = "用户名称")
private String userName;/** 导出部门多个对象 */
@Excels({@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),@Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)
})
private SysDept dept;/** 导出部门单个对象 */
@Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT)
private SysDept dept;

在Controller添加导入方法,updateSupport属性为是否存在则覆盖(可选)

@Log(title = "用户管理", businessType = BusinessType.IMPORT)
@PreAuthorize("@ss.hasPermi('system:user:import')")
@PostMapping("/importData")
public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);List<SysUser> userList = util.importExcel(file.getInputStream());String operName = getUsername();String message = userService.importUser(userList, updateSupport, operName);return success(message);
}

下载模板

下载模板实际上就是将一张空表返回给前端。

前端实现

/** 下载模板操作 */
importTemplate() {this.download('system/user/importTemplate', {}, `user_template_${new Date().getTime()}.xlsx`)
},

后端实现

注意this.init(null, sheetName, title, Type.IMPORT); null表示数据为空,只返回了表头。

/*** 对list数据源将其里面的数据导入到excel表单* * @param sheetName 工作表的名称* @param title 标题* @return 结果*/
public void importTemplateExcel(HttpServletResponse response, String sheetName, String title)
{response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");response.setCharacterEncoding("utf-8");this.init(null, sheetName, title, Type.IMPORT);exportExcel(response);
}

excel数据导出

导出默认流程是先创建一个临时文件,等待前端请求下载结束后马上删除这个临时文件。

前端实现

<el-col :span="1.5"><el-buttontype="warning"plainicon="el-icon-download"size="mini"@click="handleExport"v-hasPermi="['system:fileNotice:export']">导出</el-button>
</el-col>
/** 导出按钮操作 */
handleExport() {this.download('system/fileNotice/export', {...this.queryParams}, `fileNotice_${new Date().getTime()}.xlsx`)
}

后端实现

@PreAuthorize("@ss.hasPermi('system:fileNotice:export')")
@Log(title = "系统文件", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, FileNotice fileNotice)
{List<FileNotice> list = fileNoticeService.selectFileNoticeList(fileNotice);ExcelUtil<FileNotice> util = new ExcelUtil<FileNotice>(FileNotice.class);util.exportExcel(response, list, "系统文件数据");
}

自定义标题信息

有时候我们希望导出表格包含标题信息,我们可以这样做。

导出用户管理表格新增标题(用户列表)

public AjaxResult export(SysUser user)
{List<SysUser> list = userService.selectUserList(user);ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);return util.exportExcel(list, "用户数据", "用户列表");
}

导入表格包含标题处理方式

util.importExcel(file.getInputStream(), 1);
其中1表示标题占用行数,根据实际情况填写。

/*** 对excel表单默认第一个索引名转换成list* * @param is 输入流* @param titleNum 标题占用行数* @return 转换后集合*/
public List<T> importExcel(InputStream is, int titleNum) throws Exception
{return importExcel(StringUtils.EMPTY, is, titleNum);
}public AjaxResult importData(MultipartFile file, boolean updateSupport) throws Exception
{ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);List<SysUser> userList = util.importExcel(file.getInputStream(), 1);String operName = SecurityUtils.getUsername();String message = userService.importUser(userList, updateSupport, operName);return AjaxResult.success(message);
}

自定义数据处理器

有时候我们希望数据展现为一个特殊的格式,或者需要对数据进行其它处理。Excel注解提供了自定义数据处理器以满足各种业务场景。
1、在实体类用Excel注解handler属性指定自定义的数据处理器

public class SysUser extends BaseEntity
{@Excel(name = "用户名称",handler = MyDataHandler.class)private String nickName;
}

2、编写数据处理器MyDataHandler继承ExcelHandlerAdapter,返回值为处理后的值。

public class MyDataHandler implements ExcelHandlerAdapter
{@Overridepublic Object format(Object value, String[] args, Cell cell, Workbook wb){if ("若依".equals(value)){// 自定义用户名为若依/单元格文字设置为红色CellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);style.setBorderRight(BorderStyle.THIN);style.setRightBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderLeft(BorderStyle.THIN);style.setLeftBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderTop(BorderStyle.THIN);style.setTopBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());style.setBorderBottom(BorderStyle.THIN);style.setBottomBorderColor(IndexedColors.GREY_50_PERCENT.getIndex());Font dataFont = wb.createFont();dataFont.setFontName("Arial");dataFont.setFontHeightInPoints((short) 10);dataFont.setColor(IndexedColors.RED.index);style.setFont(dataFont);cell.setCellStyle(style);}return value;}
}

在这里插入图片描述

自定义隐藏属性列

有时候我们希望对列信息根据业务去动态显示,那么我们可以进行如下处理。

示例:对用户进行条件判断,符合条件则隐藏属性。导出的文件则不会显示此列信息。

@PostMapping("/export")
public void export(HttpServletResponse response, SysUser user)
{List<SysUser> list = userService.selectUserList(user);ExcelUtil<SysUser> util = new ExcelUtil<SysUser>(SysUser.class);if (条件A) {// 不显示用户ID(单个)util.hideColumn("userId");} else if (条件B) {// 不显示用户名称、用户手机(多个)util.hideColumn("userId", "phonenumber");} } else if (条件C) {// 不显示用户邮箱、部门名称(子对象)util.hideColumn("email", "dept.deptName");}util.exportExcel(response, list, "用户数据");
}

导入对象的子对象

有时候我们导入对象里面还包含对象,例如用户管理包含部门需要导入,那么我们可以进行如下处理。

/*** 用户对象 sys_user* * @author ruoyi*/
public class SysUser extends BaseEntity
{/** 部门对象 */@Excels({@Excel(name = "部门名称", targetAttr = "deptName"),@Excel(name = "部门负责人", targetAttr = "leader"),@Excel(name = "部门状态", targetAttr = "status", dictType = "sys_normal_disable")})private SysDept dept = new SysDept();
}

导出对象的子列表

有时候对象里面还包含集合列表,例如用户管理包含多个角色需要导出,那么我们可以进行如下处理。
注意:
需要合并的须在注解里面加上needMerge = true
private List roles;的定义要放在最下面,不然合并的时候回混乱。

/*** 用户对象 sys_user* * @author ruoyi*/
public class SysUser extends BaseEntity
{/** 用户ID */@Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号", needMerge = true, width = 20)private Long userId;@Excel(name = "登录名称", needMerge = true, width = 20)private String userName;@Excel(name = "最后登录IP", type = Type.EXPORT,needMerge = true)private String loginIp;    @Excel(name = "角色")private List<SysRole> roles;
}public class SysRole
{@Excel(name = "角色编号", cellType = ColumnType.NUMERIC)private String roleId;@Excel(name = "角色名称")private String roleName;@Excel(name = "角色字符")private String roleKey;
}

导出文件结果:
在这里插入图片描述

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

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

相关文章

FakeLocation报虚拟位置服务连接失败,请重启设备再试

虚拟位置服务连接失败&#xff0c;请重启设备再试 最近遇到一个手机软件报的bug“虚拟位置服务连接失败&#xff0c;请重启设备再试” 因为我的实体“虚拟机”已经root&#xff0c;按道理是不可能报这个错的 折腾了2天&#xff0c;终于解决了 原来是这样&#xff0c;安装最新…

龙智亮相2024国际集成电路展览会暨研讨会(IIC Shanghai),分享芯片研发及管理解决方案与技术实践

2024年3月28-29日&#xff08;周四-周五&#xff09;&#xff0c;上海张江科学会堂&#xff0c;2024国际集成电路展览会暨研讨会&#xff08;IIC Shanghai 2024&#xff09;即将盛大开幕。龙智携芯片研发及管理解决方案、最佳实践与案例&#xff0c;以及惊喜大奖在#1A14展位等着…

【C语言】数组和指针

目录 一、&数组名VS数组名 二、数组指针 三、指针数组 四、函数指针 五、const和指针 1、常量指针 六、sizeof和指针、数组 七、strlen和字符数组 八、指针和数组笔试题 1、一维数组 2、字符数组 3、二维数组 一、&数组名VS数组名 //试试这段代码 #includ…

Redis 教程系列之Redis 配置(三)

Redis 配置 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf(Windows 名为 redis.windows.conf)。 你可以通过 CONFIG 命令查看或设置配置项。 语法 Redis CONFIG 命令格式如下: redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME 实例 redis 127.0…

C++ 中的 unordered_map 用法文档

当你在C中需要使用哈希表&#xff08;无序映射&#xff09;来管理键值对时&#xff0c;unordered_map 是一个非常有用的数据结构。以下是关于 unordered_map 的用法&#xff1b; 1. 概述 unordered_map 是 C STL&#xff08;标准模板库&#xff09;中的一个关联容器&#xff…

二刷代码随想录——动态规划day57

文章目录 前言动态规知识点 动规五部曲一、647. 回文子串二、516. 最长回文子序列总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0c;于是参加了卡子哥的刷题班&#xf…

数据挖掘|数据预处理|基于Python的数据标准化方法

基于Python的数据标准化方法 1. z-score方法2. 极差标准化方法3. 最大绝对值标准化方法 在数据分析之前&#xff0c;通常需要先将数据标准化&#xff08;Standardization&#xff09;&#xff0c;利用标准化后的数据进行数据分析&#xff0c;以避免属性之间不同度量和取值范围差…

15:00面试,15:06就出来了,问的问题有点变态了

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到3月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降30%…

PTA L2-032 彩虹瓶

彩虹瓶的制作过程&#xff08;并不&#xff09;是这样的&#xff1a;先把一大批空瓶铺放在装填场地上&#xff0c;然后按照一定的顺序将每种颜色的小球均匀撒到这批瓶子里。 假设彩虹瓶里要按顺序装 N 种颜色的小球&#xff08;不妨将顺序就编号为 1 到 N&#xff09;。现在工…

项目管理-需求分析

项目需求分析是项目管理中非常重要的一环&#xff0c;它涉及到对项目目标的理解、项目范围的界定、项目需求的收集、分析和整理。以下是项目需求分析的一般步骤&#xff1a; 1. 确定项目目标&#xff1a;明确项目的目的和预期成果&#xff0c;确保项目团队对项目目标有共同的认…

基于cnn卷积神经网络的yolov8动物姿态估计识别(训练代码)

往期热门项目大合集&#xff1a; 人体姿态识别&#xff08;教程代码&#xff09;-CSDN博客 3D人体姿态估计&#xff08;教程代码&#xff09;-CSDN博客 3D目标检测&#xff08;教程代码&#xff09;_3d目标检测原理-CSDN博客 交通路标识别(教程&代码)_路标识别项目概述…

【c++】类和对象(二)this指针

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本节内容来到类和对象第二篇&#xff0c;本篇文章会带领大家了解this指针 目录 1.this指针1.1this指针的引出1.2this指针的特性1.3思考题1.4C语言和C实现Stack的对…

解析option设计模式

解析option设计模式 一、背景二、应用demo三、Gin中的应用 一、背景 有时候一个函数会有很多参数&#xff0c;为了方便函数的使用&#xff0c;我们会给希望给一些参数设定默认值&#xff0c;调用时只需要传与默认值不同的参数即可。因此选项设计模式顾名思义&#xff0c;就是在…

Redis 缓存穿透是什么?如何缓解缓存穿透?

缓存穿透是指在使用缓存技术时&#xff0c;恶意或无效的请求无法从缓存中获取到数据&#xff0c;从而直接落到底层存储系统&#xff08;如数据库&#xff09;上&#xff0c;导致频繁地查询底层存储系统&#xff0c;增加系统负载并降低性能。 缓存通常用于存储经常被请求的数据…

QB 系统配置模板

查询的时候&#xff0c;直接 在下面添加 一个字段就行&#xff01; public function getDeatil(){$post $this->request->post();if(!isset($post[id])){return out(请传递活动的id);}$builder new Builder($this->getModel());$builder->setFilter([id > …

轨迹预测后处理之非极大值抑制(NMS)

非极大值抑制是图像处理里面的一种算法&#xff08;比如边缘检测会使用到&#xff09; 轨迹预测这里借鉴了其思想&#xff0c;比如说对于某个场景中的某辆车&#xff0c;我们使用模型预测 64 条轨迹或者更多&#xff0c;以很好地捕获多模态性&#xff0c;同时每条轨迹对应一个…

看似简单的SQL,实则就是简单

加班遇到一个SQL问题&#xff0c;本想把别人的SQL改下成SparkSQL&#xff0c;在YARN上运行&#xff0c;然而数据一直对不上。 原SQL ⚠️说明&#xff1a;a.id&#xff0c;b.id没有空的&#xff0c;数据1:1&#xff0c;b.name可能存在空的 select a.id,b.id,b.name from tab…

机器学习方法

机器学习是人工智能&#xff08;AI&#xff09;的一个分支&#xff0c;它使计算机系统能够从数据中学习并改进其性能&#xff0c;而无需进行明确的编程。机器学习的核心是开发算法&#xff0c;这些算法可以从大量数据中识别模式&#xff0c;并用这些模式来做出预测或决策&#…

MySQL数据库的备份

文章目录 MySQL数据库的备份MySQL备份方法完全备份物理备份备份 逻辑热备完全备份逻辑热备恢复恢复库恢复表 增量备份备份增量备份恢复基于位置进行恢复基于时间 MySQL数据库的备份 MySQL备份方法 物理备份&#xff1a; 物理备份涉及直接复制MySQL的数据文件和日志文件。这种…

Javascript中的严格模式 “use strict“

一、为什么使用严格模式&#xff1f; 在普通的 JavaScript 中&#xff0c;写错变量名会创建新的全局变量&#xff0c; 在严格模式中&#xff0c;写错变量名会抛出错误来提醒开发者 二、声明严格模式 通过在脚本或函数的开头添加 “use strict”; 来声明严格模式。"use …