刚刚解决了Excel导出中表头内容是查询出来的问题,现在又有新的问题了,需要合并字段!
这次不仅要求表头是查询出来的,内容也要查询出来的字段进行合并。表头查询出来的解决方法如链接 link
所以在之前的方法中添加方法即可。
解决思路:
1.在ColumnConfig中添加集合,这个集合处理之后变成客户需要的 “设备名称(设备编号)”
2.在构造表头的时候遍历集合,将集合转为一个字符串
3.根据转换之后的字符再拆开获取具体的值,然后再将获取到的值再合并
具体操作如下:
1.修改ColumnConfig类,并使用@Builder注解来优化
@Builder
@Data
public class ColumnConfig {
// Excel列显示的名称(如"用户姓名")
@NonNull
private String displayName;
// 实体类对应的属性名(如"username")
@NonNull
private String fieldName;
@Builder.Default
private int width = 20;
//单元格格式
//格式化主要是处理时间、数据
private String format;
//常量读取
private String readConverterExp;
//后缀
private String suffix;
// 合并字段(如 ["province", "city"])
private List<String> fields;
// 分隔符(如 "-")
private String separator;
private String symbol;
public static ColumnConfigBuilder mergeFieldConfig(
@NonNull String displayName,
@NonNull List<String> fields,
@NonNull String separator
) {
return builder()
.displayName(displayName)
.fields(fields)
.separator(separator);
}
}
2.具体调用实现如下:
List<ColumnConfig> columns = new ArrayList<>();
List<String> nameList=new ArrayList<>();
nameList.add("deviceName");
nameList.add("deviceNum");
columns.add(ColumnConfig.mergeFieldConfig("设备名称(设备编号)",nameList,"(")
.fieldName("deviceName(deviceNum)").width(35).build());
columns.add(ColumnConfig.builder().displayName("采集时间").fieldName("sampleTime").format("yyyy-MM-dd HH:mm:ss").build());
if(CollectionUtil.isNotEmpty(deviceConfigList)){
for(DeviceConfigVo configVo:deviceConfigList){
List<String> list=new ArrayList<>();
list.add(configVo.getCode()+MqttConstant.value);
list.add(configVo.getCode()+MqttConstant.status);
columns.add(ColumnConfig.mergeFieldConfig(configVo.getName()+"(保护状态)", list,"(")
.fieldName(configVo.getCode()+MqttConstant.value)
.width(28)
.symbol(configVo.getSymbol()).build());
}
}
List<Map<String, Object>> dataList = new ArrayList<>();
for (TdDeviceData data : deviceDataList) {
Map<String, Object> row = new HashMap<>();
for (ColumnConfig config : columns) {
String fieldName = config.getFieldName();
List<String> fields = config.getFields();
if(CollectionUtil.isEmpty(fields)){
Object value = getFieldValue(data, fieldName);
row.put(config.getFieldName(), value);
}else {
// 获取合并字段值
List<String> values = new ArrayList<>();
for(int i=0;i<fields.size();i++){
//10路电位处理
Object value = getFieldValue(data, fields.get(i));
if(value != null){
if(i==1 && StringUtils.isNotEmpty(config.getSymbol())){
//保护状态处理
values.add(ProtectStatus.getInfo(value.toString()));
}else {
values.add(value.toString());
}
}
}
// 合并字段内容
String mergedValue = String.join(config.getSeparator(), values);
row.put(config.getFieldName(), mergedValue+")");
}
}
dataList.add(row);
}
String sheetName = "设备数据";
String fileName = "设备数据.xlsx";
ExcelUtils.exportExcel(dataList, columns, sheetName, fileName, response);
导出效果:
好了,完美解决问题!