diff --git a/zhyc-common/src/main/java/com/zhyc/common/annotation/Excel.java b/zhyc-common/src/main/java/com/zhyc/common/annotation/Excel.java index e9d66a7..47402dc 100644 --- a/zhyc-common/src/main/java/com/zhyc/common/annotation/Excel.java +++ b/zhyc-common/src/main/java/com/zhyc/common/annotation/Excel.java @@ -33,6 +33,11 @@ public @interface Excel */ public String dateFormat() default ""; + /** + * 数字格式, 如: 0.00 + */ + public String numFormat() default ""; // 新增数字格式属性 + /** * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) */ diff --git a/zhyc-common/src/main/java/com/zhyc/common/utils/poi/ExcelUtil.java b/zhyc-common/src/main/java/com/zhyc/common/utils/poi/ExcelUtil.java index d595cee..35269b0 100644 --- a/zhyc-common/src/main/java/com/zhyc/common/utils/poi/ExcelUtil.java +++ b/zhyc-common/src/main/java/com/zhyc/common/utils/poi/ExcelUtil.java @@ -88,7 +88,7 @@ import com.zhyc.common.utils.reflect.ReflectUtils; /** * Excel相关处理 - * + * * @author ruoyi */ public class ExcelUtil @@ -307,7 +307,7 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @return 转换后集合 */ @@ -318,7 +318,7 @@ public class ExcelUtil /** * 对excel表单默认第一个索引名转换成list - * + * * @param is 输入流 * @param titleNum 标题占用行数 * @return 转换后集合 @@ -344,7 +344,7 @@ public class ExcelUtil /** * 对excel表单指定表格索引名转换成list - * + * * @param sheetName 表格索引名 * @param titleNum 标题占用行数 * @param is 输入流 @@ -527,7 +527,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param list 导出数据集合 * @param sheetName 工作表的名称 * @return 结果 @@ -539,7 +539,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param list 导出数据集合 * @param sheetName 工作表的名称 * @param title 标题 @@ -553,7 +553,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 @@ -566,7 +566,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param response 返回数据 * @param list 导出数据集合 * @param sheetName 工作表的名称 @@ -583,7 +583,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ @@ -594,7 +594,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @param title 标题 * @return 结果 @@ -607,7 +607,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @return 结果 */ @@ -618,7 +618,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @param sheetName 工作表的名称 * @param title 标题 * @return 结果 @@ -633,7 +633,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ public void exportExcel(HttpServletResponse response) @@ -655,7 +655,7 @@ public class ExcelUtil /** * 对list数据源将其里面的数据导入到excel表单 - * + * * @return 结果 */ public AjaxResult exportExcel() @@ -723,7 +723,7 @@ public class ExcelUtil /** * 填充excel数据 - * + * * @param index 序号 * @param row 单元格行 */ @@ -821,7 +821,7 @@ public class ExcelUtil /** * 创建表格样式 - * + * * @param wb 工作薄对象 * @return 样式列表 */ @@ -876,7 +876,7 @@ public class ExcelUtil /** * 根据Excel注解创建表格头样式 - * + * * @param wb 工作薄对象 * @return 自定义样式列表 */ @@ -912,7 +912,7 @@ public class ExcelUtil /** * 根据Excel注解创建表格列样式 - * + * * @param wb 工作薄对象 * @return 自定义样式列表 */ @@ -944,7 +944,7 @@ public class ExcelUtil /** * 根据Excel注解创建表格列样式 - * + * * @param styles 自定义样式列表 * @param field 属性列信息 * @param excel 注解信息 @@ -1007,7 +1007,7 @@ public class ExcelUtil /** * 设置单元格信息 - * + * * @param value 单元格值 * @param attr 注解相关 * @param cell 单元格信息 @@ -1142,7 +1142,6 @@ public class ExcelUtil sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); } } - cell.setCellStyle(styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); // 用于读取对象中的属性 Object value = getTargetValue(vo, field, attr); @@ -1150,14 +1149,33 @@ public class ExcelUtil String readConverterExp = attr.readConverterExp(); String separator = attr.separator(); String dictType = attr.dictType(); - if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value)) + String numFormat = attr.numFormat(); // 获取数字格式 + + // 创建单元格样式 + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.cloneStyleFrom(styles.get(StringUtils.format("data_{}_{}_{}_{}_{}", + attr.align(), attr.color(), attr.backgroundColor(), attr.cellType(), attr.wrapText()))); + + // 处理日期格式 + if (StringUtils.isNotEmpty(dateFormat) && StringUtils.isNotNull(value) && value instanceof Date) { - cell.getCellStyle().setDataFormat(this.wb.getCreationHelper().createDataFormat().getFormat(dateFormat)); - cell.setCellValue(parseDateToStr(dateFormat, value)); + DataFormat format = wb.createDataFormat(); + cellStyle.setDataFormat(format.getFormat(dateFormat)); + cell.setCellValue((Date) value); + cell.setCellStyle(cellStyle); + } + // 处理数字格式 + else if (StringUtils.isNotEmpty(numFormat) && StringUtils.isNotNull(value) && value instanceof Number) + { + DataFormat format = wb.createDataFormat(); + cellStyle.setDataFormat(format.getFormat(numFormat)); + cell.setCellValue(((Number) value).doubleValue()); + cell.setCellStyle(cellStyle); } else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value)) { cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); + cell.setCellStyle(cellStyle); } else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) { @@ -1167,20 +1185,32 @@ public class ExcelUtil sysDictMap.put(dictType + value, lable); } cell.setCellValue(sysDictMap.get(dictType + value)); + cell.setCellStyle(cellStyle); } else if (value instanceof BigDecimal && -1 != attr.scale()) { cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); + cell.setCellStyle(cellStyle); } else if (!attr.handler().equals(ExcelHandlerAdapter.class)) { cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); + cell.setCellStyle(cellStyle); } else { // 设置列类型 setCellVo(value, attr, cell); + // 对于日期类型,确保应用日期格式 + if (value instanceof Date && StringUtils.isNotEmpty(dateFormat)) { + DataFormat format = wb.createDataFormat(); + CellStyle dateStyle = wb.createCellStyle(); + dateStyle.cloneStyleFrom(cell.getCellStyle()); + dateStyle.setDataFormat(format.getFormat(dateFormat)); + cell.setCellStyle(dateStyle); + } } + addStatisticsData(column, Convert.toStr(value), attr); } } @@ -1193,7 +1223,7 @@ public class ExcelUtil /** * 设置 POI XSSFSheet 单元格提示或选择框 - * + * * @param sheet 表单 * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 @@ -1203,7 +1233,7 @@ public class ExcelUtil * @param endCol 结束列 */ public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, - int firstCol, int endCol) + int firstCol, int endCol) { DataValidationHelper helper = sheet.getDataValidationHelper(); DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); @@ -1230,7 +1260,7 @@ public class ExcelUtil /** * 设置某些列的值只能输入预制的数据,显示下拉框(兼容超出一定数量的下拉框). - * + * * @param sheet 要设置的sheet. * @param textlist 下拉框显示的内容 * @param promptContent 提示内容 @@ -1254,7 +1284,7 @@ public class ExcelUtil DataValidationHelper helper = sheet.getDataValidationHelper(); // 加载下拉列表内容 DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); - // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 + // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列 CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); // 数据有效性对象 DataValidation dataValidation = helper.createValidation(constraint, regions); @@ -1282,7 +1312,7 @@ public class ExcelUtil /** * 解析导出值 0=男,1=女,2=未知 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 @@ -1319,7 +1349,7 @@ public class ExcelUtil /** * 反向解析值 男=0,女=1,未知=2 - * + * * @param propertyValue 参数值 * @param converterExp 翻译注解 * @param separator 分隔符 @@ -1356,7 +1386,7 @@ public class ExcelUtil /** * 解析字典值 - * + * * @param dictValue 字典值 * @param dictType 字典类型 * @param separator 分隔符 @@ -1369,7 +1399,7 @@ public class ExcelUtil /** * 反向解析值字典值 - * + * * @param dictLabel 字典标签 * @param dictType 字典类型 * @param separator 分隔符 @@ -1382,7 +1412,7 @@ public class ExcelUtil /** * 数据处理器 - * + * * @param value 数据值 * @param excel 数据注解 * @return @@ -1458,7 +1488,7 @@ public class ExcelUtil /** * 获取下载路径 - * + * * @param filename 文件名称 */ public String getAbsoluteFile(String filename) @@ -1474,7 +1504,7 @@ public class ExcelUtil /** * 获取bean中的属性值 - * + * * @param vo 实体对象 * @param field 字段 * @param excel 注解 @@ -1506,7 +1536,7 @@ public class ExcelUtil /** * 以类的属性的get方法方法形式获取值 - * + * * @param o * @param name * @return value @@ -1649,7 +1679,7 @@ public class ExcelUtil /** * 创建工作表 - * + * * @param sheetNo sheet数量 * @param index 序号 */ @@ -1666,7 +1696,7 @@ public class ExcelUtil /** * 获取单元格值 - * + * * @param row 获取的行 * @param column 获取单元格列号 * @return 单元格值 @@ -1726,7 +1756,7 @@ public class ExcelUtil /** * 判断是否是空行 - * + * * @param row 判断的行 * @return */ @@ -1754,7 +1784,7 @@ public class ExcelUtil * @param workbook 工作簿对象 * @return Map key:图片单元格索引(1_1)String,value:图片流PictureData */ - public static Map> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) + public static Map > getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) { Map> sheetIndexPicMap = new HashMap<>(); List pictures = workbook.getAllPictures(); @@ -1807,7 +1837,7 @@ public class ExcelUtil /** * 格式化不同类型的日期对象 - * + * * @param dateFormat 日期格式 * @param val 被格式化的日期对象 * @return 格式化后的日期字符 @@ -1873,7 +1903,7 @@ public class ExcelUtil /** * 获取对象的子列表方法 - * + * * @param name 名称 * @param pojoClass 类对象 * @return 子列表方法 @@ -1894,4 +1924,4 @@ public class ExcelUtil } return method; } -} +} \ No newline at end of file diff --git a/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/controller/NpMilkProdClassesController.java b/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/controller/NpMilkProdClassesController.java index 32e7db8..da0cde1 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/controller/NpMilkProdClassesController.java +++ b/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/controller/NpMilkProdClassesController.java @@ -58,10 +58,12 @@ public class NpMilkProdClassesController extends BaseController { public void export(HttpServletResponse response, @RequestParam(required = false) Date datetimeStart, @RequestParam(required = false) Date datetimeEnd, - @RequestParam(required = false) String manageEarNos, + @RequestParam(required = false) String manageEarNo, @RequestParam(required = false) String factory, @RequestParam(required = false) Integer classes) { - List list = npMilkProdClassesService.selectNpMilkProdClassesList(datetimeStart, datetimeEnd, manageEarNos, factory, classes); + List list = npMilkProdClassesService.selectNpMilkProdClassesList( + datetimeStart, datetimeEnd, manageEarNo, factory, classes); + ExcelUtil util = new ExcelUtil<>(NpMilkProdClasses.class); util.exportExcel(response, list, "班次产奶数据"); } diff --git a/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/domain/NpMilkProdClasses.java b/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/domain/NpMilkProdClasses.java index 19e2ce9..43d388d 100644 --- a/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/domain/NpMilkProdClasses.java +++ b/zhyc-module/src/main/java/com/zhyc/module/dairyProducts/domain/NpMilkProdClasses.java @@ -15,7 +15,7 @@ public class NpMilkProdClasses implements Serializable { private Date updateTime; // 更新时间 @JsonFormat(pattern = "yyyy-MM-dd") - @Excel(name = "日期") + @Excel(name = "日期", dateFormat = "yyyy-MM-dd") // 添加日期格式 private Date datetime; @Excel(name = "管理耳号") @@ -33,10 +33,10 @@ public class NpMilkProdClasses implements Serializable { @Excel(name = "班次") private Integer classes; - @Excel(name = "班次产奶量") + @Excel(name = "班次产奶量", numFormat = "0.00") private Double milk; - @Excel(name = "班次校正奶量") + @Excel(name = "班次校正奶量", numFormat = "0.00") private Double correctedMilk; private String sheepId;