
昨天实现了库存的Excel批量导入和导出,就记录一下这个功能的开发过程吧。
首先是找到ruoyi框架封装的一个注解@Excel,这个自定义注解被描述为自定义导出Excel数据注解,查看代码可以发现除了支持导出还有导入的功能:
这里只要给实体类的字段加上注解,结合另一个类ExcelUtil 中的方法就能实现了,exportExcel方法传入一个http响应和你要导出的查询结果即可
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName)
{
exportExcel(response, list, sheetName, StringUtils.EMPTY);
}
除此之外该方法还支持传入一个sheetName作为导出表的名字,这里查看顶级导包就能发现该工具类使用了POI操作Excel,如Workbook包和XSSF包。
导出Excel的web关键语句为这一行,它指定了HTTP响应返回的文件类型和编码格式
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");`
写入的方法是操作数组实现,表格满足这样的数据结构,故只需要循环去取值就行,需要用到的sheet和Workbook类都是由POI提供的类。
将Excel的数据导入数据库则使用了importExcel方法,同样是在ExcelUtil工具类中的方法,只需传入一个流InputStream即可。
该方法对excel表单默认第一个索引名转换成list,同样使用POI的WorkbookFactory,用数组下标遍历取值。
取到数据以后直接调用写好的新增方法插入数据库即可,根据逻辑可以选择更新方法,即遇到相同数据是跳过还是选择更新,而且字段校验也可以在这里完成了。
8.6 11:00AM
在昨天完成了批量导入导出以后,突然发现出现了一个问题,也就是我的叫号队列突然不显示了,查看数据库后发现数据未删除,也许是前端的问题,而且科室选择下拉框数据也为空了
而我点进叫号大屏居然发生了报错
请求地址'/display/status',发生系统异常. jakarta.servlet.ServletException: Handler dispatch failed: java.lang.NoSuchMethodError: 'void com.ruoyi.hospital.domain.QueueInfo.setStatus(java.lang.String)'
在返回后端查看时我确信我的实体类用了Lombok的注解,但是利用java的反编译查看class文件时却发现set方法确实没有生成,这很奇怪,而其他使用Lombok的实体类都正常运行。
Claude4建议我重新编译项目,而我在用maven重新编译时发现了一个熟悉的问题:找不到符号,这也就说明了是JDK版本配置的问题,果不其然打开配置后发现JDK使用了23而不是一开始的17
应该是因为中途我打开过一次JDK23的其他项目,再打开我的个人项目时JDK被选择了默认的23造成的。在配置好版本后就正常显示了。
8.6 11:06AM
我需要更新前端的UI图标库,ruoyi默认使用了eui,而我想引入另一个前端图标库font-awesome,Claude4使用了CDN外链的方式引入,并将图标导入选择器,我看到确实可以选择了,
但是在选择后的图标却无法保存显示,是因为svg-icon 组件无法正确处理 Font Awesome 图标,所以在区分了三种不同svg图标后终于算是正常显示了。
但是新的问题是font-awesome的图标没有正常对齐,Claude快速生成了一个scss文件帮我解决了问题。
补一张现在的导航栏UI:
8.6 13:51PM
注意到前端有过期显示,但我后端没有写这样的判断,查了一下发现是在前端定义的,之前的项目我是在后端做了判断,但二者用的都是一套计算方法
if (diffDays < 0) {
return `<span style="color: red;">${row.expiryDate} (已过期)</span>`;
} else if (diffDays <= 30) {
return `<span style="color: orange;">${row.expiryDate} (${diffDays}天后过期)</span>`;
} else {
return row.expiryDate;
}
之前在后端写判断帖子发布时间时是这么写的
private String formatTimeDifference(Date date) {
if (date == null) {
return "";
}
long diff = new Date().getTime() - date.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;
if (days > 0) {
return days + "天前";
}
if (hours > 0) {
return hours + "小时前";
}
if (minutes > 0) {
return minutes + "分钟前";
}
return "刚刚";
}