概念
- 转换器
- 将java的数据类型(含自定义的类)转为excel数据类型
- 将excel的数据类型转为java数据类型
思路
- 在开发中遇到我们需要将实体类中自定义的数据类型转化为excel中的格式,因为不能将自定义的类输出到excel中,只能用基本数据类型,所以需要转换(以下代码转换到excel为string类型,可以控制输出到excel中为某种基本数据类型)
- 将excel中的格式转化为我们实体类中的自定义数据类型,因为在用户修改excel数据时,可能会更改excel单元格式,所以我们需要判断单元格的格式,转为为我们实体类的固定的基本数据类型
步骤
- 在属性上加转换器类
- 写自定义转换器类,实现Converter <AdditionalConfig> ,AdditionalConfig是自定义的数据类型
- 写转换代码
代码
实体类
public class DeviceInfoExcel {
/**
* 设备id
*/
@ExcelProperty(value="设备id",index=0)
@ColumnWidth(45)
private String deviceid;
/**
* 品牌名称
*/
@ExcelProperty(value="品牌名称",index=1)
@ColumnWidth(15)
private String brandName;
/**
* 价格
*/
@ExcelProperty(value="价格",index=8,converter = AdditionalConfigConverter.class)
@ColumnWidth(15)
private AdditionalConfig additionalConfig;
public AdditionalConfig getAdditionalConfig() {
return additionalConfig;
}
// 注意set,要这么写,才可以将转换之后的数据进行替换
public void setAdditionalConfig(AdditionalConfig additionalConfig) {
this.additionalConfig=additionalConfig;
}
自定义类型
public class AdditionalConfig {
private double price;
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
}
转换器
package cn.testin.util;
import cn.testin.api.cfg.bean.AdditionalConfig;
import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;
public class AdditionalConfigConverter implements Converter<AdditionalConfig> {
//在java中数据类型
@Override
public Class supportJavaTypeKey() {
return AdditionalConfig.class;
}
// 在excel中的数据类型
@Override
public CellDataTypeEnum supportExcelTypeKey() {
return CellDataTypeEnum.STRING;
}
// 将excel的数据类型转为java数据类型
@Override
public AdditionalConfig convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
AdditionalConfig additionalConfig =new AdditionalConfig();
CellDataTypeEnum type = cellData.getType();
String cellMsg = "";
// 转换格式,因为不确定excel中用户设置的单元格类型
if (type.equals(CellDataTypeEnum.NUMBER)) {
cellMsg = cellData.getNumberValue().toString();
} else if (type.equals(CellDataTypeEnum.STRING)) {
cellMsg = cellData.getStringValue();
} else if (type.equals(CellDataTypeEnum.BOOLEAN)) {
cellMsg = cellData.getBooleanValue().toString();
}
additionalConfig.setPrice(Double.parseDouble(cellMsg));
return additionalConfig;
}
// 将java的数据类型转为excel数据类型
@Override
public CellData<AdditionalConfig> convertToExcelData(AdditionalConfig additionalConfig, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {
return new CellData(String.valueOf(additionalConfig.getPrice()));
}
}