班次奶量导出功能修复

This commit is contained in:
ll 2025-08-28 11:12:31 +08:00
parent 84bc894668
commit 29efc43392
4 changed files with 85 additions and 48 deletions

View File

@ -33,6 +33,11 @@ public @interface Excel
*/ */
public String dateFormat() default ""; public String dateFormat() default "";
/**
* 数字格式, : 0.00
*/
public String numFormat() default ""; // 新增数字格式属性
/** /**
* 如果是字典类型请设置字典的type值 (: sys_user_sex) * 如果是字典类型请设置字典的type值 (: sys_user_sex)
*/ */

View File

@ -88,7 +88,7 @@ import com.zhyc.common.utils.reflect.ReflectUtils;
/** /**
* Excel相关处理 * Excel相关处理
* *
* @author ruoyi * @author ruoyi
*/ */
public class ExcelUtil<T> public class ExcelUtil<T>
@ -307,7 +307,7 @@ public class ExcelUtil<T>
/** /**
* 对excel表单默认第一个索引名转换成list * 对excel表单默认第一个索引名转换成list
* *
* @param is 输入流 * @param is 输入流
* @return 转换后集合 * @return 转换后集合
*/ */
@ -318,7 +318,7 @@ public class ExcelUtil<T>
/** /**
* 对excel表单默认第一个索引名转换成list * 对excel表单默认第一个索引名转换成list
* *
* @param is 输入流 * @param is 输入流
* @param titleNum 标题占用行数 * @param titleNum 标题占用行数
* @return 转换后集合 * @return 转换后集合
@ -344,7 +344,7 @@ public class ExcelUtil<T>
/** /**
* 对excel表单指定表格索引名转换成list * 对excel表单指定表格索引名转换成list
* *
* @param sheetName 表格索引名 * @param sheetName 表格索引名
* @param titleNum 标题占用行数 * @param titleNum 标题占用行数
* @param is 输入流 * @param is 输入流
@ -527,7 +527,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param list 导出数据集合 * @param list 导出数据集合
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
* @return 结果 * @return 结果
@ -539,7 +539,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param list 导出数据集合 * @param list 导出数据集合
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
* @param title 标题 * @param title 标题
@ -553,7 +553,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param response 返回数据 * @param response 返回数据
* @param list 导出数据集合 * @param list 导出数据集合
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
@ -566,7 +566,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param response 返回数据 * @param response 返回数据
* @param list 导出数据集合 * @param list 导出数据集合
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
@ -583,7 +583,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
* @return 结果 * @return 结果
*/ */
@ -594,7 +594,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
* @param title 标题 * @param title 标题
* @return 结果 * @return 结果
@ -607,7 +607,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
* @return 结果 * @return 结果
*/ */
@ -618,7 +618,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @param sheetName 工作表的名称 * @param sheetName 工作表的名称
* @param title 标题 * @param title 标题
* @return 结果 * @return 结果
@ -633,7 +633,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @return 结果 * @return 结果
*/ */
public void exportExcel(HttpServletResponse response) public void exportExcel(HttpServletResponse response)
@ -655,7 +655,7 @@ public class ExcelUtil<T>
/** /**
* 对list数据源将其里面的数据导入到excel表单 * 对list数据源将其里面的数据导入到excel表单
* *
* @return 结果 * @return 结果
*/ */
public AjaxResult exportExcel() public AjaxResult exportExcel()
@ -723,7 +723,7 @@ public class ExcelUtil<T>
/** /**
* 填充excel数据 * 填充excel数据
* *
* @param index 序号 * @param index 序号
* @param row 单元格行 * @param row 单元格行
*/ */
@ -821,7 +821,7 @@ public class ExcelUtil<T>
/** /**
* 创建表格样式 * 创建表格样式
* *
* @param wb 工作薄对象 * @param wb 工作薄对象
* @return 样式列表 * @return 样式列表
*/ */
@ -876,7 +876,7 @@ public class ExcelUtil<T>
/** /**
* 根据Excel注解创建表格头样式 * 根据Excel注解创建表格头样式
* *
* @param wb 工作薄对象 * @param wb 工作薄对象
* @return 自定义样式列表 * @return 自定义样式列表
*/ */
@ -912,7 +912,7 @@ public class ExcelUtil<T>
/** /**
* 根据Excel注解创建表格列样式 * 根据Excel注解创建表格列样式
* *
* @param wb 工作薄对象 * @param wb 工作薄对象
* @return 自定义样式列表 * @return 自定义样式列表
*/ */
@ -944,7 +944,7 @@ public class ExcelUtil<T>
/** /**
* 根据Excel注解创建表格列样式 * 根据Excel注解创建表格列样式
* *
* @param styles 自定义样式列表 * @param styles 自定义样式列表
* @param field 属性列信息 * @param field 属性列信息
* @param excel 注解信息 * @param excel 注解信息
@ -1007,7 +1007,7 @@ public class ExcelUtil<T>
/** /**
* 设置单元格信息 * 设置单元格信息
* *
* @param value 单元格值 * @param value 单元格值
* @param attr 注解相关 * @param attr 注解相关
* @param cell 单元格信息 * @param cell 单元格信息
@ -1142,7 +1142,6 @@ public class ExcelUtil<T>
sheet.addMergedRegion(new CellRangeAddress(subMergedFirstRowNum, subMergedLastRowNum, column, column)); 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); Object value = getTargetValue(vo, field, attr);
@ -1150,14 +1149,33 @@ public class ExcelUtil<T>
String readConverterExp = attr.readConverterExp(); String readConverterExp = attr.readConverterExp();
String separator = attr.separator(); String separator = attr.separator();
String dictType = attr.dictType(); 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)); DataFormat format = wb.createDataFormat();
cell.setCellValue(parseDateToStr(dateFormat, value)); 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)) else if (StringUtils.isNotEmpty(readConverterExp) && StringUtils.isNotNull(value))
{ {
cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator)); cell.setCellValue(convertByExp(Convert.toStr(value), readConverterExp, separator));
cell.setCellStyle(cellStyle);
} }
else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value)) else if (StringUtils.isNotEmpty(dictType) && StringUtils.isNotNull(value))
{ {
@ -1167,20 +1185,32 @@ public class ExcelUtil<T>
sysDictMap.put(dictType + value, lable); sysDictMap.put(dictType + value, lable);
} }
cell.setCellValue(sysDictMap.get(dictType + value)); cell.setCellValue(sysDictMap.get(dictType + value));
cell.setCellStyle(cellStyle);
} }
else if (value instanceof BigDecimal && -1 != attr.scale()) else if (value instanceof BigDecimal && -1 != attr.scale())
{ {
cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue()); cell.setCellValue((((BigDecimal) value).setScale(attr.scale(), attr.roundingMode())).doubleValue());
cell.setCellStyle(cellStyle);
} }
else if (!attr.handler().equals(ExcelHandlerAdapter.class)) else if (!attr.handler().equals(ExcelHandlerAdapter.class))
{ {
cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell)); cell.setCellValue(dataFormatHandlerAdapter(value, attr, cell));
cell.setCellStyle(cellStyle);
} }
else else
{ {
// 设置列类型 // 设置列类型
setCellVo(value, attr, cell); 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); addStatisticsData(column, Convert.toStr(value), attr);
} }
} }
@ -1193,7 +1223,7 @@ public class ExcelUtil<T>
/** /**
* 设置 POI XSSFSheet 单元格提示或选择框 * 设置 POI XSSFSheet 单元格提示或选择框
* *
* @param sheet 表单 * @param sheet 表单
* @param textlist 下拉框显示的内容 * @param textlist 下拉框显示的内容
* @param promptContent 提示内容 * @param promptContent 提示内容
@ -1203,7 +1233,7 @@ public class ExcelUtil<T>
* @param endCol 结束列 * @param endCol 结束列
*/ */
public void setPromptOrValidation(Sheet sheet, String[] textlist, String promptContent, int firstRow, int endRow, 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(); DataValidationHelper helper = sheet.getDataValidationHelper();
DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1"); DataValidationConstraint constraint = textlist.length > 0 ? helper.createExplicitListConstraint(textlist) : helper.createCustomConstraint("DD1");
@ -1230,7 +1260,7 @@ public class ExcelUtil<T>
/** /**
* 设置某些列的值只能输入预制的数据,显示下拉框兼容超出一定数量的下拉框. * 设置某些列的值只能输入预制的数据,显示下拉框兼容超出一定数量的下拉框.
* *
* @param sheet 要设置的sheet. * @param sheet 要设置的sheet.
* @param textlist 下拉框显示的内容 * @param textlist 下拉框显示的内容
* @param promptContent 提示内容 * @param promptContent 提示内容
@ -1254,7 +1284,7 @@ public class ExcelUtil<T>
DataValidationHelper helper = sheet.getDataValidationHelper(); DataValidationHelper helper = sheet.getDataValidationHelper();
// 加载下拉列表内容 // 加载下拉列表内容
DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data"); DataValidationConstraint constraint = helper.createFormulaListConstraint(hideSheetName + "_data");
// 设置数据有效性加载在哪个单元格上,四个参数分别是起始行终止行起始列终止列 // 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行终止行起始列终止列
CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol); CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
// 数据有效性对象 // 数据有效性对象
DataValidation dataValidation = helper.createValidation(constraint, regions); DataValidation dataValidation = helper.createValidation(constraint, regions);
@ -1282,7 +1312,7 @@ public class ExcelUtil<T>
/** /**
* 解析导出值 0=,1=,2=未知 * 解析导出值 0=,1=,2=未知
* *
* @param propertyValue 参数值 * @param propertyValue 参数值
* @param converterExp 翻译注解 * @param converterExp 翻译注解
* @param separator 分隔符 * @param separator 分隔符
@ -1319,7 +1349,7 @@ public class ExcelUtil<T>
/** /**
* 反向解析值 =0,=1,未知=2 * 反向解析值 =0,=1,未知=2
* *
* @param propertyValue 参数值 * @param propertyValue 参数值
* @param converterExp 翻译注解 * @param converterExp 翻译注解
* @param separator 分隔符 * @param separator 分隔符
@ -1356,7 +1386,7 @@ public class ExcelUtil<T>
/** /**
* 解析字典值 * 解析字典值
* *
* @param dictValue 字典值 * @param dictValue 字典值
* @param dictType 字典类型 * @param dictType 字典类型
* @param separator 分隔符 * @param separator 分隔符
@ -1369,7 +1399,7 @@ public class ExcelUtil<T>
/** /**
* 反向解析值字典值 * 反向解析值字典值
* *
* @param dictLabel 字典标签 * @param dictLabel 字典标签
* @param dictType 字典类型 * @param dictType 字典类型
* @param separator 分隔符 * @param separator 分隔符
@ -1382,7 +1412,7 @@ public class ExcelUtil<T>
/** /**
* 数据处理器 * 数据处理器
* *
* @param value 数据值 * @param value 数据值
* @param excel 数据注解 * @param excel 数据注解
* @return * @return
@ -1458,7 +1488,7 @@ public class ExcelUtil<T>
/** /**
* 获取下载路径 * 获取下载路径
* *
* @param filename 文件名称 * @param filename 文件名称
*/ */
public String getAbsoluteFile(String filename) public String getAbsoluteFile(String filename)
@ -1474,7 +1504,7 @@ public class ExcelUtil<T>
/** /**
* 获取bean中的属性值 * 获取bean中的属性值
* *
* @param vo 实体对象 * @param vo 实体对象
* @param field 字段 * @param field 字段
* @param excel 注解 * @param excel 注解
@ -1506,7 +1536,7 @@ public class ExcelUtil<T>
/** /**
* 以类的属性的get方法方法形式获取值 * 以类的属性的get方法方法形式获取值
* *
* @param o * @param o
* @param name * @param name
* @return value * @return value
@ -1649,7 +1679,7 @@ public class ExcelUtil<T>
/** /**
* 创建工作表 * 创建工作表
* *
* @param sheetNo sheet数量 * @param sheetNo sheet数量
* @param index 序号 * @param index 序号
*/ */
@ -1666,7 +1696,7 @@ public class ExcelUtil<T>
/** /**
* 获取单元格值 * 获取单元格值
* *
* @param row 获取的行 * @param row 获取的行
* @param column 获取单元格列号 * @param column 获取单元格列号
* @return 单元格值 * @return 单元格值
@ -1726,7 +1756,7 @@ public class ExcelUtil<T>
/** /**
* 判断是否是空行 * 判断是否是空行
* *
* @param row 判断的行 * @param row 判断的行
* @return * @return
*/ */
@ -1754,7 +1784,7 @@ public class ExcelUtil<T>
* @param workbook 工作簿对象 * @param workbook 工作簿对象
* @return Map key:图片单元格索引1_1Stringvalue:图片流PictureData * @return Map key:图片单元格索引1_1Stringvalue:图片流PictureData
*/ */
public static Map<String, List<PictureData>> getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook) public static Map<String, List<PictureData> > getSheetPictures03(HSSFSheet sheet, HSSFWorkbook workbook)
{ {
Map<String, List<PictureData>> sheetIndexPicMap = new HashMap<>(); Map<String, List<PictureData>> sheetIndexPicMap = new HashMap<>();
List<HSSFPictureData> pictures = workbook.getAllPictures(); List<HSSFPictureData> pictures = workbook.getAllPictures();
@ -1807,7 +1837,7 @@ public class ExcelUtil<T>
/** /**
* 格式化不同类型的日期对象 * 格式化不同类型的日期对象
* *
* @param dateFormat 日期格式 * @param dateFormat 日期格式
* @param val 被格式化的日期对象 * @param val 被格式化的日期对象
* @return 格式化后的日期字符 * @return 格式化后的日期字符
@ -1873,7 +1903,7 @@ public class ExcelUtil<T>
/** /**
* 获取对象的子列表方法 * 获取对象的子列表方法
* *
* @param name 名称 * @param name 名称
* @param pojoClass 类对象 * @param pojoClass 类对象
* @return 子列表方法 * @return 子列表方法
@ -1894,4 +1924,4 @@ public class ExcelUtil<T>
} }
return method; return method;
} }
} }

View File

@ -58,10 +58,12 @@ public class NpMilkProdClassesController extends BaseController {
public void export(HttpServletResponse response, public void export(HttpServletResponse response,
@RequestParam(required = false) Date datetimeStart, @RequestParam(required = false) Date datetimeStart,
@RequestParam(required = false) Date datetimeEnd, @RequestParam(required = false) Date datetimeEnd,
@RequestParam(required = false) String manageEarNos, @RequestParam(required = false) String manageEarNo,
@RequestParam(required = false) String factory, @RequestParam(required = false) String factory,
@RequestParam(required = false) Integer classes) { @RequestParam(required = false) Integer classes) {
List<NpMilkProdClasses> list = npMilkProdClassesService.selectNpMilkProdClassesList(datetimeStart, datetimeEnd, manageEarNos, factory, classes); List<NpMilkProdClasses> list = npMilkProdClassesService.selectNpMilkProdClassesList(
datetimeStart, datetimeEnd, manageEarNo, factory, classes);
ExcelUtil<NpMilkProdClasses> util = new ExcelUtil<>(NpMilkProdClasses.class); ExcelUtil<NpMilkProdClasses> util = new ExcelUtil<>(NpMilkProdClasses.class);
util.exportExcel(response, list, "班次产奶数据"); util.exportExcel(response, list, "班次产奶数据");
} }

View File

@ -15,7 +15,7 @@ public class NpMilkProdClasses implements Serializable {
private Date updateTime; // 更新时间 private Date updateTime; // 更新时间
@JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")
@Excel(name = "日期") @Excel(name = "日期", dateFormat = "yyyy-MM-dd") // 添加日期格式
private Date datetime; private Date datetime;
@Excel(name = "管理耳号") @Excel(name = "管理耳号")
@ -33,10 +33,10 @@ public class NpMilkProdClasses implements Serializable {
@Excel(name = "班次") @Excel(name = "班次")
private Integer classes; private Integer classes;
@Excel(name = "班次产奶量") @Excel(name = "班次产奶量", numFormat = "0.00")
private Double milk; private Double milk;
@Excel(name = "班次校正奶量") @Excel(name = "班次校正奶量", numFormat = "0.00")
private Double correctedMilk; private Double correctedMilk;
private String sheepId; private String sheepId;