若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)
場景
在數(shù)據(jù)庫中存儲(chǔ)某些個(gè)是否的字段時(shí),有時(shí)會(huì)使用tinint進(jìn)行存儲(chǔ)
?
這樣會(huì)在實(shí)體類中生成布爾類型的變量
private Boolean sfkt;有時(shí)也會(huì)用int進(jìn)行存儲(chǔ)是否
?
那么在實(shí)體類中就可能用Integer和String進(jìn)行是否字段的存取
private String sfcl;那么在使用若依自帶的導(dǎo)出時(shí),如果不加修改,則會(huì)直接將對應(yīng)的字段的列導(dǎo)出為0或者1,true或者false。
如果想要根據(jù)此列的0和1進(jìn)而顯示是和否怎樣顯示。
注:
博客:
https://blog.csdn.net/badao_liumang_qizhi
關(guān)注公眾號(hào)
霸道的程序猿
獲取編程相關(guān)電子書、教程推送與免費(fèi)下載。
實(shí)現(xiàn)
如果是0和1格式化為是和否
找到對應(yīng)的實(shí)體類中的屬性,在注解上添加
@Excel(name = "是否處理完成",readConverterExp = "0=否,1=是") private String sfcl;添加讀取轉(zhuǎn)換表達(dá)式屬性readConverterExp就可以實(shí)現(xiàn),具體見下面源碼分析。
如果是true和false格式化為是和否
@Excel(name = "是否跨天",readConverterExp = "false=否,true=是") private Boolean sfkt;表達(dá)式的格式要固定如上,值可以自己根據(jù)要求去添加。
下面分析為什么這樣添加就可以。
源碼分析
在SpringbBoot后臺(tái)接口中
??? @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");}其中l(wèi)ist是查詢數(shù)據(jù)庫的數(shù)據(jù)。
然后調(diào)用工具類生成工具類對象,主要是調(diào)用exportExcel方法來生成Excel
在方法中
??? public AjaxResult exportExcel(List<T> list, String sheetName){this.init(list, sheetName, Type.EXPORT);return exportExcel();}調(diào)用了init方法,生成一些工作簿以及列等相關(guān)信息的對象。
在方法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);}主要是讀取注解和調(diào)用了POI的一些方法用來初始化Excel的相關(guān)對象。
構(gòu)建excel數(shù)據(jù)的方法主要是exportExcel()
??? public AjaxResult exportExcel(){OutputStream out = null;try{// 取出一共有多少個(gè)sheet.double sheetNo = Math.ceil(list.size() / sheetSize);for (int index = 0; index <= sheetNo; index++){createSheet(sheetNo, index);// 產(chǎn)生一行Row row = sheet.createRow(0);int column = 0;// 寫入各個(gè)字段的列頭名稱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("導(dǎo)出Excel異常{}", e.getMessage());throw new CustomException("導(dǎo)出Excel失敗,請聯(lián)系網(wǎng)站管理員!");}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);// 得到導(dǎo)出對象.T vo = (T) list.get(i);int column = 0;for (Object[] os : fields){Field field = (Field) os[0];Excel excel = (Excel) os[1];// 設(shè)置實(shí)體類私有屬性可訪問field.setAccessible(true);this.addCell(excel, row, vo, field, column++);}}}上面的fields是讀取的注解列表,
?????/*** 注解列表*/private List<Object[]> fields;遍歷每個(gè)注解對象后調(diào)用addCell方法
??? public Cell addCell(Excel attr, Row row, T vo, Field field, int column){Cell cell = null;try{// 設(shè)置行高row.setHeight((short) (attr.height() * 20));// 根據(jù)Excel中設(shè)置情況決定是否導(dǎo)出,有些情況需要保持為空,希望用戶填寫這一列.if (attr.isExport()){// 創(chuàng)建cellcell = row.createCell(column);cell.setCellStyle(styles.get("data"));// 用于讀取對象中的屬性O(shè)bject 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{// 設(shè)置列類型setCellVo(value, attr, cell);}}}catch (Exception e){log.error("導(dǎo)出Excel失敗{}", e);}return cell;}在這里是執(zhí)行填充單元格的方法,其中
?
String readConverterExp = attr.readConverterExp();就是獲取上面設(shè)置的注解readConverterExp屬性
?else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)){cell.setCellValue(convertByExp(String.valueOf(value), readConverterExp));}判斷如果不為空的話將單元格的值和傳遞的表達(dá)式傳遞給方法convertByExp
??
? /*** 解析導(dǎo)出值 0=男,1=女,2=未知** @param propertyValue 參數(shù)值* @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;}首先將表達(dá)式按照逗號(hào)分隔,獲取分隔后的數(shù)組,然后遍歷數(shù)組。
再根據(jù)=分隔,如果等號(hào)左邊即分割后數(shù)組的第一個(gè)值與單元格的值相等,就返回等號(hào)右邊的值即分隔后的第二個(gè)值。
這樣就實(shí)現(xiàn)了按照指定表達(dá)式將單元格的值進(jìn)行格式化顯示。
?
?
?
總結(jié)
以上是生活随笔為你收集整理的若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 若依管理系统源码分析-分页的实现以及po
- 下一篇: 若依前后端分离版本,Windows下使用