场景

在数据库中存储某些个是否的字段时,有时会使用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格式化为是否)相关推荐

  1. 【SA8295P 源码分析】44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件

    [SA8295P 源码分析]44 - 如何替换 NON-HLOS.bin 中的 Wifi Firmware 固件 1.提取 NON-HLOS.bin 中的 Wifi Firmware 出来 2.把提取 ...

  2. java excel中重复数据 事务处理_Java导出excel时合并同一列中相同内容的行思路详解...

    一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...

  3. java 导出如何合并列_Java导出excel时合并同一列中相同内容的行思路详解

    一.有时候导出Excel时需要按类别导出,一大类下好几个小类,小类下又有好几个小小类,就像下图: 要实现这个也不难, 思路如下:按照大类来循环,如上就是按照张江校区.徐汇校区.临港校区三个大类循环,然 ...

  4. 【转】ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  5. 【转】ABP源码分析四十五:ABP ZERO中的EntityFramework模块

    AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...

  6. 【转】ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

  7. 若依管理系统源码分析-分页的实现以及post请求时的分页

    场景 官方示例分页实现 前端调用实现 // 一般在查询参数中定义分页变量 queryParams: {pageNum: 1,pageSize: 10 },// 页面添加分页组件,传入分页变量 < ...

  8. smbms(超市管理系统)源码 + 分析

    在项目开始之前,我们首先要对项目的整体架构分析一下,该项目一共分为四个模块,登录注销.用户管理.订单管理.供应商管理,其中用户管理.订单管理以及供应商管理都是需要对数据库进行crud的.项目的整体架构 ...

  9. Gson源码分析之Json结构抽象和注解使用

    github上的博客地址: http://chuyun923.github.io/blog/2015/01/06/gsonyuan-ma-fen-xi/ XML和Json作为最常用的两种网络传输格式而 ...

最新文章

  1. 教育部:国外经历不得作为高校招聘限制性条件
  2. python小游戏源码-python 像素小鸟小游戏源码(flappybird)
  3. [Swift]LeetCode388. 文件的最长绝对路径 | Longest Absolute File Path
  4. KKT条件和拉格朗日乘子法
  5. Linux系统入门学习:在Debian或Ubuntu上安装完整的内核源码
  6. 《C++ Primer》8.3.1节练习
  7. html/css杂题
  8. WPF/Silverlight Undo/Redo框架
  9. java.lang.Void类
  10. C#设计模式系列:装饰模式(Decorator)
  11. [转]更改windows 2003远程桌面连接的端口
  12. 重构wangEditor(web富文本编辑器),欢迎指正!
  13. 报头中的偏移量作用_网络中BN层的作用
  14. EXCEL 代码大全
  15. S200XD高拍仪读取身份证信息
  16. php中法兰克福的时区,法兰克福时差与中国差多少
  17. iphone6s html5没声音,iphone6s没有声音了怎么办(解决苹果机来电没声音的3种方式)...
  18. Person Search
  19. 开启超高清时代 联诚发5G+8K大屏点亮智慧展厅及银行业
  20. 电路设计_铝电解电容的失效原因

热门文章

  1. Ubuntu16.04安装ros残缺包
  2. Java进阶:CountDownLatch倒计时
  3. python百度手势识别_【百度大脑新品体验】手势识别
  4. MySQL安装及可能出现的问题
  5. copyproperties爆红_BeanUtils.copyProperties复制失败探究
  6. java cron表达式_Java 程序员都应该去使用一下这款强大的国产工具类库
  7. license 验证服务器唯一机器码_代码审计工具Fortify 17.10及Mac平台license版本
  8. 2016年10月起微软更改了更新服务模型
  9. mysql 代码执行时间_mysql 显示SQL语句执行时间的代码
  10. python绘制k线图的步骤_Python使用PyQtGraph绘制股票行情K线图