easyexcel
easyexcel copied to clipboard
AbstractVerticalCellStyleStrategy#afterCellDataConverted方法在生产环境抛出null异常
同一局域网内电脑A与电脑B,A为开发环境,Win11,Excel下载功能正常。B为生产环境,Win10,三个类型的Excel下载功能,一样的写法两种类型都正常,一种AbstractVerticalCellStyleStrategy抛出null。
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
String language = redisTemplate.opsForValue().get(WebConstants.REDIS_KEY_HEADER_LANGUAGE) == null ? REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH
:redisTemplate.opsForValue().get(WebConstants.REDIS_KEY_HEADER_LANGUAGE).toString();
Sheet sheet = cell.getSheet();
Workbook workbook = sheet.getWorkbook();
Font font = workbook.createFont();
font.setBold(false);
font.setTypeOffset(Font.SS_SUB);
if(head.getFieldName().equals("deviceName")){
if( sheet.getRow(0)!= null && sheet.getRow(0).getCell(0) != null) {
sheet.getRow(0).getCell(0).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "设备" : "DEVICE");
}
}else if(head.getFieldName().equals("logTime")){
if( sheet.getRow(0)!= null && sheet.getRow(0).getCell(1) != null) {
sheet.getRow(0).getCell(1).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "日志时间" : "LOGTIME");
}
}else if(head.getFieldName().equals("dataThre")){
if( sheet.getRow(0)!= null && sheet.getRow(0).getCell(2) != null) {
sheet.getRow(0).getCell(2).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警项" : "DATATHRE");
}
}else if(head.getFieldName().equals("dataValue")){
if( sheet.getRow(0)!= null && sheet.getRow(0).getCell(3) != null) {
sheet.getRow(0).getCell(3).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警值" : "DATAVALUE");
}
}else if(head.getFieldName().equals("dataDesc")){
if( sheet.getRow(0)!= null && sheet.getRow(0).getCell(4) != null) {
sheet.getRow(0).getCell(4).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警描述" : "DATADESC");
}
}else if(head.getFieldName().equals("almType")){
if( sheet.getRow(0)!= null && sheet.getRow(0).getCell(5) != null) {
sheet.getRow(0).getCell(5).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警分类" : "ALARM_TYPE");
}
}
}
该功能是为了实现中英文不同语言下,Header显示相应语言问题。该逻辑判断放在其他生命周期下都试过,只有放在这才能生效。加上该判断后能正常下载了,但完全没思路为什么放在生产环境下这段代码需要加判断,这块会有什么差别。以及同样在生产环境下一样的写法没问题。
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
String language = redisTemplate.opsForValue().get(WebConstants.REDIS_KEY_HEADER_LANGUAGE) == null ? REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH
:redisTemplate.opsForValue().get(WebConstants.REDIS_KEY_HEADER_LANGUAGE).toString();
Sheet sheet = cell.getSheet();
if(head.getFieldName().equals("deviceName")){
sheet.getRow(0).getCell(0).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH)?"设备":"DEVICE");
}else if(head.getFieldName().equals("logTime")){
sheet.getRow(0).getCell(1).setCellValue(language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH)?"日志时间":"LOGTIME");
}else if(head.getFieldName().equals("deviceStatus")){
sheet.getRow(0).getCell(2).setCellValue(language.equals(
REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH)?"设备状态":"STATUS");
}else if(head.getFieldName().equals("deviceError")){
sheet.getRow(0).getCell(3).setCellValue(language.equals(
REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH)?"异常状态":"ERROR");
}else if(head.getFieldName().equals("deviceErrdesc")){
sheet.getRow(0).getCell(4).setCellValue(language.equals(
REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH)?"异常描述":"ERRORDESP");
}
}
@Override
public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, WriteCellData<?> cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
// 获取当前单元格所在的表格和工作簿
Sheet sheet = cell.getSheet();
Workbook workbook = sheet.getWorkbook();
// 检查语言设置
String language = redisTemplate.opsForValue().get(WebConstants.REDIS_KEY_HEADER_LANGUAGE);
if (language == null) {
language = REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH;
}
// 设置字体
Font font = workbook.createFont();
font.setBold(false);
font.setTypeOffset(Font.SS_SUB);
// 获取当前单元格的行和列索引
int columnIndex = cell.getColumnIndex();
int rowIndex = cell.getRowIndex();
// 根据单元格的行和列索引来设置相应的值
if (isHead) {
// 处理表头单元格
setHeaderValue(sheet, language, head.getFieldName(), rowIndex, columnIndex);
} else {
// 处理数据单元格,可以根据需要进行处理
}
}
// 设置表头单元格的值
private void setHeaderValue(Sheet sheet, String language, String fieldName, int rowIndex, int columnIndex) {
// 根据字段名称来设置相应的值
Row row = sheet.getRow(rowIndex);
if (row != null) {
Cell cell = row.getCell(columnIndex);
if (cell != null) {
String value = getValueForFieldName(language, fieldName);
cell.setCellValue(value);
}
}
}
// 根据字段名称和语言获取对应的值
private String getValueForFieldName(String language, String fieldName) {
switch (fieldName) {
case "deviceName":
return language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "设备" : "DEVICE";
case "logTime":
return language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "日志时间" : "LOGTIME";
case "dataThre":
return language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警项" : "DATATHRE";
case "dataValue":
return language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警值" : "DATAVALUE";
case "dataDesc":
return language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警描述" : "DATADESC";
case "almType":
return language.equals(REDIS_KEY_HEADER_DEFAULTLANGUAGE_ZH) ? "报警分类" : "ALARM_TYPE";
default:
return "";
}
}