easyexcel icon indicating copy to clipboard operation
easyexcel copied to clipboard

AbstractVerticalCellStyleStrategy#afterCellDataConverted方法在生产环境抛出null异常

Open curryPizza opened this issue 1 year ago • 1 comments

同一局域网内电脑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");
        }
    }

curryPizza avatar Dec 21 '23 00:12 curryPizza

@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 "";
    }
}

ljluestc avatar Jun 01 '24 16:06 ljluestc