项目使用的是RuoYi Bootstrap多模块版本4.7.2,启动项目后会有默认的导出功能。包括使用ruoyi自带代码生成器,都会有导出功能的附带。接下就讲解一下默认的Excel导出功能的数据流程和一些问题。
ruoyi自带导出功能按钮,点击后会有弹出框“确定导出所有岗位吗?”,若是初次使用点击确定后可能会出现导出无法成功的问题,
接下就分析一下点击导出按钮后的调用过程。
如岗位页面对应的是ruoyi-admin组件下src/main/resources/templates/system/post/post.html
在该函数中使用拼接的方法post调用com.ruoyi.web.controller.common.commonController的通用下载请求fileDownload(),其中传了两个参数。一个是当前传入的文件名称,一个是是否删除参数。
请求成功后,window.location.href动态输出跳转到对应的下载链接。
在函数中先先查询该表的所有数据,再new一个ExcelUtil工具类,retuen工具类下的exportExcel()函数,传参第一个参数为表数据,第二个参数为表名,在这里可以修改为自己定义的名字,之后的下载的文件名会在表名的基础上做拼接。
文件在src/main/java/com/ruoyi/common/utils/poi/ExcelUtil.java
通过重载之间调用,将参数传入,先执行init()函数初始化,在调用无参函数exportExcel(),这方法是对所有导出功能综合处理的方法。
先是创建空的字节输出流,使用weritSheet()函数创建并写入Sheet().
在这个方法里,首先判断生成多少个sheet,就是计算list的长度与sheetSize的比,默认是65536.之后再生成sheet,使用的Workbook.java中的方法。之后再生成一行来写入实体类上带注解的列头名称,形成列头。并以此创建单元格来写入数据,从而形成完整的excel表格。
接下来调用encodingFilename()拼接下载文件的名称,默认是拼接UUID+工作表名,UUID在输出时是长串字符,不太美观和方便,可以改成日期+时间+工作表名,例如"岗位数据_02-14_15-55-20.xlsx"
之后就是把文件以及文件名绑定,作为完整的excel存在内存中等待下载。return的返回值就是完整的文件名,供之后的拼接下载。
该语句最后要实现形成最后的字节输出流,首先是getAbsoluteFile()函数获取下载路径。同样是通过拼接的方法来形成字符串类型的下载路径。在方法中先是拼接配置文件中的地址,再判断并创建完整的父级目录来保证接下来的下载。
配置文件位置src\main\resources\application.yml
再用完整的地址new一个新的文件输出流,赋值到之前的out。个人理解为,输出用的流文件已经与指定的下载地址绑定,通过该地址就可以下载该流,目前是空,接下是赋值操作。wb.write(out);将工作簿写入输出流,即所谓的赋值操作。完成后,调用IOUtils.closeQuietly();安静关闭。
成功后返回success消息,若失败返回失败信息,控制台打印错误信息,前端收到后显示失败提示。该函数执行结束。
由exportExcel()函数的window.location.href动态输出跳转到下载链接,调用该方法。
按照RuoYi写的逻辑,重新拼接了一个带当时时间的realFileName,并且将这个名字输出,所以浏览器下载的文件名不再是我们之前定义的“岗位数据_02-14_15-55-20.xlsx”,而是较长的“164490470055302-15_13-57.xlsx”,并且下载下来的地址也不是我们之前定义的地址,而是通过浏览器选择的地址。等于说之前的地址设置和文件名称修改都不起作用。
注意,我们设置的路径下是会生成文件的,但是默认传入参数为true,又删除了它,这波操作没看明白。最后的结果是的空创建了一个文件夹。RouYi的这个功能代码有待优化。
以上就是ruoyi框架默认导出Excel功能的简析。