实体类字段使用EasyExcel提供的注解@ExcelProperty,value 值写成占位符形式 ,匹配 i18n 文件里面的编码。
如:
/**
* 仓库名称
*/
@ExcelProperty("{warehouse.record.warehouseName}")
private String warehouseName;
占位符解析器
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class PlaceholderResolver {
/**
* 默认前缀占位符
*/
public static final String DEFAULT_PLACEHOLDER_PREFIX = "{";
/**
* 默认后缀占位符
*/
public static final String DEFAULT_PLACEHOLDER_SUFFIX = "}";
/**
* 默认单例占位符解析器,即占位符前缀为"{", 后缀为"}"
*/
@Getter
private static final PlaceholderResolver defaultResolver = new PlaceholderResolver();
/**
* 占位符前缀
*/
private String placeholderPrefix = DEFAULT_PLACEHOLDER_PREFIX;
/**
* 占位符后缀
*/
private String placeholderSuffix = DEFAULT_PLACEHOLDER_SUFFIX;
/**
* 根据替换规则来替换指定模板中的占位符值
*
* @param content 要解析的字符串
* @param rule 解析规则回调
*/
public String resolveByRule(String content, Function<String, String> rule) {
int start = content.indexOf(this.placeholderPrefix);
if (start == -1) {
return content;
}
StringBuilder result = new StringBuilder(content);
while (start != -1) {
int end = result.indexOf(this.placeholderSuffix, start);
//获取占位符属性值,如{id}, 即获取id
String placeholder = result.substring(start + this.placeholderPrefix.length(), end);
//替换整个占位符内容,即将{id}值替换为替换规则回调中的内容
String replaceContent = placeholder.trim().isEmpty() ? "" : rule.apply(placeholder);
result.replace(start, end + this.placeholderSuffix.length(), replaceContent);
start = result.indexOf(this.placeholderPrefix, start + replaceContent.length());
}
return result.toString();
}
}
自定义拦截器
@RequiredArgsConstructor
public class I18nCellWriteHandler implements CellWriteHandler {
@Resource
private MessageSource messageSource;
@Override
public void beforeCellCreate(CellWriteHandlerContext context) {
if (!context.getHead()) {
return;
}
final List<String> originHeadNames = context.getHeadData().getHeadNameList();
if (CollectionUtils.isEmpty(originHeadNames)) {
return;
}
List<String> newHeadNames = originHeadNames.stream().
map(headName -> PlaceholderResolver.getDefaultResolver()
.resolveByRule(headName, this::getMessage)).
collect(Collectors.toList());
context.getHeadData().setHeadNameList(newHeadNames);
}
public String getMessage(String code) {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(code, null, locale);
}
}
使用