若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)
场景
在数据库中存储某些个是否的字段时,有时会使用tinint进行存储
这样会在实体类中生成布尔类型的变量
private Boolean sfkt;
有时也会用int进行存储是否
那么在实体类中就可能用Integer和String进行是否字段的存取
private String sfcl;
那么在使用若依自带的导出时,如果不加修改,则会直接将对应的字段的列导出为0或者1,true或者false。
如果想要根据此列的0和1进而显示是和否怎样显示。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
关注公众号
霸道的程序猿
获取编程相关电子书、教程推送与免费下载。
实现
如果是0和1格式化为是和否
找到对应的实体类中的属性,在注解上添加
@Excel(name = "是否处理完成",readConverterExp = "0=否,1=是")
private String sfcl;
添加读取转换表达式属性readConverterExp就可以实现,具体见下面源码分析。
如果是true和false格式化为是和否
@Excel(name = "是否跨天",readConverterExp = "false=否,true=是")
private Boolean sfkt;
表达式的格式要固定如上,值可以自己根据要求去添加。
下面分析为什么这样添加就可以。
源码分析
在SpringbBoot后台接口中
@GetMapping("/export")public AjaxResult export(KqBcgl kqBcgl){List<KqBcgl> list = kqBcglService.getBcListByNameToExport(kqBcgl);ExcelUtil<KqBcgl> util = new ExcelUtil<KqBcgl>(KqBcgl.class);return util.exportExcel(list, "bcgl");}
其中list是查询数据库的数据。
然后调用工具类生成工具类对象,主要是调用exportExcel方法来生成Excel
在方法中
public AjaxResult exportExcel(List<T> list, String sheetName){this.init(list, sheetName, Type.EXPORT);return exportExcel();}
调用了init方法,生成一些工作簿以及列等相关信息的对象。
在方法createExcelField中
private void createExcelField(){this.fields = new ArrayList<Object[]>();List<Field> tempFields = new ArrayList<>();tempFields.addAll(Arrays.asList(clazz.getSuperclass().getDeclaredFields()));tempFields.addAll(Arrays.asList(clazz.getDeclaredFields()));for (Field field : tempFields){// 单注解if (field.isAnnotationPresent(Excel.class)){putToField(field, field.getAnnotation(Excel.class));}// 多注解if (field.isAnnotationPresent(Excels.class)){Excels attrs = field.getAnnotation(Excels.class);Excel[] excels = attrs.value();for (Excel excel : excels){putToField(field, excel);}}}}
和方法createWorkbook中
public void createWorkbook(){this.wb = new SXSSFWorkbook(500);}
主要是读取注解和调用了POI的一些方法用来初始化Excel的相关对象。
构建excel数据的方法主要是exportExcel()
public AjaxResult exportExcel(){OutputStream out = null;try{// 取出一共有多少个sheet.double sheetNo = Math.ceil(list.size() / sheetSize);for (int index = 0; index <= sheetNo; index++){createSheet(sheetNo, index);// 产生一行Row row = sheet.createRow(0);int column = 0;// 写入各个字段的列头名称for (Object[] os : fields){Excel excel = (Excel) os[1];this.createCell(excel, row, column++);}if (Type.EXPORT.equals(type)){fillExcelData(index, row);}}String filename = encodingFilename(sheetName);out = new FileOutputStream(getAbsoluteFile(filename));wb.write(out);return AjaxResult.success(filename);}catch (Exception e){log.error("导出Excel异常{}", e.getMessage());throw new CustomException("导出Excel失败,请联系网站管理员!");}finally{if (wb != null){try{wb.close();}catch (IOException e1){e1.printStackTrace();}}if (out != null){try{out.close();}catch (IOException e1){e1.printStackTrace();}}}}
这其中使用填充excel的方法fillExcelData
public void fillExcelData(int index, Row row){int startNo = index * sheetSize;int endNo = Math.min(startNo + sheetSize, list.size());for (int i = startNo; i < endNo; i++){row = sheet.createRow(i + 1 - startNo);// 得到导出对象.T vo = (T) list.get(i);int column = 0;for (Object[] os : fields){Field field = (Field) os[0];Excel excel = (Excel) os[1];// 设置实体类私有属性可访问field.setAccessible(true);this.addCell(excel, row, vo, field, column++);}}}
上面的fields是读取的注解列表,
/*** 注解列表*/private List<Object[]> fields;
遍历每个注解对象后调用addCell方法
public Cell addCell(Excel attr, Row row, T vo, Field field, int column){Cell cell = null;try{// 设置行高row.setHeight((short) (attr.height() * 20));// 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.if (attr.isExport()){// 创建cellcell = row.createCell(column);cell.setCellStyle(styles.get("data"));// 用于读取对象中的属性Object value = getTargetValue(vo, field, attr);String dateFormat = attr.dateFormat();String readConverterExp = attr.readConverterExp();if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)){cell.setCellValue(DateUtils.parseDateToStr(dateFormat, (Date) value));}else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)){cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp));}else{// 设置列类型setCellVo(value, attr, cell);}}}catch (Exception e){log.error("导出Excel失败{}", e);}return cell;}
在这里是执行填充单元格的方法,其中
String readConverterExp = attr.readConverterExp();
就是获取上面设置的注解readConverterExp属性
else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)){cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp));}
判断如果不为空的话将单元格的值和传递的表达式传递给方法convertByExp
/*** 解析导出值 0=男,1=女,2=未知** @param propertyValue 参数值* @param converterExp 翻译注解* @return 解析后值* @throws Exception*/public static String convertByExp(String propertyValue, String converterExp) throws Exception{try{String[] convertSource = converterExp.split(",");for (String item : convertSource){String[] itemArray = item.split("=");if (itemArray[0].equals(propertyValue)){return itemArray[1];}}}catch (Exception e){throw e;}return propertyValue;}
首先将表达式按照逗号分隔,获取分隔后的数组,然后遍历数组。
再根据=分隔,如果等号左边即分割后数组的第一个值与单元格的值相等,就返回等号右边的值即分隔后的第二个值。
这样就实现了按照指定表达式将单元格的值进行格式化显示。
若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)相关推荐
- 【SA8295P 源码分析】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件
[SA8295P 源码分析]44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1.提取 NON-HLOS.bin 中的 Wifi Firmware 出来 2.把提取 ...
- java excel中重复数据 事务处理_Java导出excel时合并同一列中相同内容的行思路详解...
一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...
- java 导出如何合并列_Java导出excel时合并同一列中相同内容的行思路详解
一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...
- 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块
通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...
- 【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块
AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...
- 【转】ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
- 若依管理系统源码分析-分页的实现以及post请求时的分页
场景 官方示例分页实现 前端调用实现 // 一般在查询参数中定义分页变量 queryParams: {pageNum: 1,pageSize: 10 },// 页面添加分页组件,传入分页变量 < ...
- smbms(超市管理系统)源码 + 分析
在项目开始之前,我们首先要对项目的整体架构分析一下,该项目一共分为四个模块,登录注销.用户管理.订单管理.供应商管理,其中用户管理.订单管理以及供应商管理都是需要对数据库进行crud的.项目的整体架构 ...
- Gson源码分析之Json结构抽象和注解使用
github上的博客地址: http://chuyun923.github.io/blog/2015/01/06/gsonyuan-ma-fen-xi/ XML和Json作为最常用的两种网络传输格式而 ...
最新文章
- 教育部:国外经历不得作为高校招聘限制性条件
- python小游戏源码-python 像素小鸟小游戏源码(flappybird)
- [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path
- KKT条件和拉格朗日乘子法
- Linux系统入门学习:在Debian或Ubuntu上安装完整的内核源码
- 《C++ Primer》8.3.1节练习
- html/css杂题
- WPF/Silverlight Undo/Redo框架
- java.lang.Void类
- C#设计模式系列:装饰模式(Decorator)
- [转]更改windows 2003远程桌面连接的端口
- 重构wangEditor(web富文本编辑器),欢迎指正!
- 报头中的偏移量作用_网络中BN层的作用
- EXCEL 代码大全
- S200XD高拍仪读取身份证信息
- php中法兰克福的时区,法兰克福时差与中国差多少
- iphone6s html5没声音,iphone6s没有声音了怎么办(解决苹果机来电没声音的3种方式)...
- Person Search
- 开启超高清时代 联诚发5G+8K大屏点亮智慧展厅及银行业
- 电路设计_铝电解电容的失效原因
热门文章
- Ubuntu16.04安装ros残缺包
- Java进阶:CountDownLatch倒计时
- python百度手势识别_【百度大脑新品体验】手势识别
- MySQL安装及可能出现的问题
- copyproperties爆红_BeanUtils.copyProperties复制失败探究
- java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库
- license 验证服务器唯一机器码_代码审计工具Fortify 17.10及Mac平台license版本
- 2016年10月起微软更改了更新服务模型
- mysql 代码执行时间_mysql 显示SQL语句执行时间的代码
- python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图