日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否)

發(fā)布時(shí)間:2025/3/19 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 若依管理系统源码分析-导出Excel时怎样通过注解中readConverterExp实现格式化导出列的显示格式(0和1格式化为是否) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

場景

在數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。