
本文介绍在 JVx 应用框架中,如何复用已配置的 ICellEditor(如日期、数字编辑器)的格式规则,将数据库原始值(如 Timestamp、BigDecimal)转换为与表格/编辑器一致的格式化字符串,适用于报表生成等非 UI 场景。
本文介绍在 jvx 应用框架中,如何复用已配置的 `icelleditor`(如日期、数字编辑器)的格式规则,将数据库原始值(如 `timestamp`、`bigdecimal`)转换为与表格/编辑器一致的格式化字符串,适用于报表生成等非 ui 场景。
在 JVx 应用中,CellEditor(如 DateCellEditor、NumberCellEditor)不仅用于 UI 控件的输入/显示,其格式配置(如 SimpleDateFormat 模式或 DecimalFormat 模式)也定义了业务数据的标准化呈现方式。当需要在报表、导出文档或标签文本中复用这些格式(而非直接调用 getValueAsString() 得到原始字符串),关键在于动态获取列绑定的编辑器,并委托其格式逻辑进行转换。
JVx 提供了两种推荐方式:
✅ 方式一:手动委托 CellEditor 格式化(灵活可控)
适用于需精确控制格式逻辑、或需兼容自定义编辑器的场景。核心思路是:根据数据类型匹配对应编辑器接口,提取其格式配置,并使用 NumberUtil / DateUtil 执行格式化:
public static String getFormattedDisplayValue(DataRow dataRow, String columnName) {
Object value = dataRow.getValue(columnName);
// 字符串类型直接返回
if (value instanceof String) {
return (String) value;
}
// 获取该列绑定的单元格编辑器
ICellEditor cellEditor = UICellEditor.getCellEditor(dataRow, columnName);
if (value instanceof Number && cellEditor instanceof INumberCellEditor) {
NumberUtil numberUtil = new NumberUtil();
numberUtil.setNumberPattern(((INumberCellEditor) cellEditor).getNumberFormat());
return numberUtil.format((Number) value);
}
else if (value instanceof Date && cellEditor instanceof IDateCellEditor) {
DateUtil dateUtil = new DateUtil();
dateUtil.setDatePattern(((IDateCellEditor) cellEditor).getDateFormat());
return dateUtil.format((Date) value);
}
else {
// 兜底:使用 DataBook 默认字符串转换(无格式)
return dataRow.getValueAsString(columnName);
}
}
⚠️ 注意事项:
- 必须为每次调用创建新的 NumberUtil / DateUtil 实例,避免多线程下格式模式被意外覆盖;
- 确保 columnName 在 DataRow 中存在且已正确绑定 CellEditor(通常由 DataBook 的 setMetaData() 或 UI 构建流程自动完成);
- 若列未显式配置编辑器,getCellEditor() 可能返回 null,建议增加空值校验。
✅ 方式二:使用 DataBookUtil.getValueAsString()(简洁高效)
JVx 自带的工具类已封装上述逻辑,一行代码即可实现等效功能:
String displayText = DataBookUtil.getValueAsString(dataRow, "DATECOL"); // 自动识别编辑器并格式化
该方法内部会自动检测 CellValue 类型、查找对应 CellEditor、选择合适的 Util 类执行格式化,是推荐的首选方案——它既保持了与 UI 显示完全一致的行为,又无需手动处理类型分支和工具类生命周期。
总结
- 不要依赖 getValueAsString():它绕过所有编辑器配置,仅做基础类型转换;
- 优先使用 DataBookUtil.getValueAsString():零配置、强一致性、维护性高;
- 手动委托仅在特殊需求时采用:例如需干预格式化过程、适配非标准编辑器或调试格式链路;
- 所有格式化行为均源于 CellEditor 的 getDateFormat() / getNumberFormat() 配置,确保“所见即所得”——UI 表格中看到的格式,报表中也能原样复现。










