使用java语音解决Excel导出中表头、单元格内容合并等问题

刚刚解决了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);
导出效果:

在这里插入图片描述
好了,完美解决问题!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值