EasyExcel向模板追加导入数据出现多余空行

EasyExcel向Excel模板文件追加写入数据,表头固定写死,数据写入成功,但中间出现了不该出现的多余空行,哪位指点一下

img

package com.liuchang.TestAsyncAndTransactional.demo;

import com.alibaba.excel.metadata.data.WriteCellData;
import lombok.Data;

/* 奖金发放错误模板导入数据错误提示返回 */
@Data
public class BPImportErrorWriteData implements Cloneable{

    private WriteCellData<String> regionName;

    private WriteCellData<String> year;

    private WriteCellData<String> quarter;

    private WriteCellData<String> state;

    private WriteCellData<String> grantTime;

    private WriteCellData<String> money;

    private WriteCellData<String> reason;
}

package com.liuchang.TestAsyncAndTransactional.demo;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.data.RichTextStringData;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.metadata.style.WriteFont;
import org.apache.poi.ss.usermodel.IndexedColors;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class WriteTemplateTest {
    public static void main(String[] args) {
        List<BPImportErrorWriteData> list = new ArrayList<>();

        // 第1条数据
        BPImportErrorWriteData bpImport = new BPImportErrorWriteData();
        WriteCellData<String> writeCellData = new WriteCellData<>();
        writeCellData.setType(CellDataTypeEnum.RICH_TEXT_STRING);
        RichTextStringData richTextStringData = new RichTextStringData();
        richTextStringData.setTextString("北海物流园");
        WriteFont writeFont = new WriteFont();
        writeFont.setColor(IndexedColors.RED.getIndex());
        richTextStringData.applyFont(0,4,writeFont);
        writeCellData.setRichTextStringDataValue(richTextStringData);

        bpImport.setRegionName(writeCellData);
        bpImport.setQuarter(writeCellData);
        bpImport.setYear(writeCellData);
        bpImport.setState(writeCellData);
        bpImport.setMoney(writeCellData);
        bpImport.setGrantTime(writeCellData);
        bpImport.setReason(writeCellData);
        list.add(bpImport);

        // 第2条数据
        BPImportErrorWriteData bpImport2 = new BPImportErrorWriteData();
        WriteCellData<String> writeCellData2 = new WriteCellData<>();
        writeCellData2.setType(CellDataTypeEnum.RICH_TEXT_STRING);
        RichTextStringData richTextStringData2 = new RichTextStringData();
        richTextStringData2.setTextString("炒粉物流园");
        WriteFont writeFont2 = new WriteFont();
        writeFont2.setColor(IndexedColors.RED.getIndex());
        richTextStringData2.applyFont(writeFont2);
        writeCellData2.setRichTextStringDataValue(richTextStringData2);

        bpImport2.setRegionName(writeCellData2);
        bpImport2.setQuarter(writeCellData2);
        bpImport2.setYear(writeCellData2);
        bpImport2.setState(writeCellData2);
        bpImport2.setMoney(writeCellData2);
        bpImport2.setGrantTime(writeCellData2);
        bpImport2.setReason(writeCellData2);
        list.add(bpImport2);

        String filePath = "D:" + File.separator + "季度奖金导入模板.xlsx";
        File templateFile = new File("F:\\WeChat\\WeChat File\\WeChat Files\\wxid_m5u7twd3yqil22\\FileStorage\\File\\2022-11\\PRD\\季度奖金发放管理导入模板.xlsx");
        EasyExcel.write(filePath,BPImportErrorWriteData.class).needHead(false).inMemory(true)
                .withTemplate(templateFile).sheet(0).doWrite(list);
    }
}


你这种情况我遇到过,就是自己无意中点过下面某一个单元格,然后excel就算做那里不是空白了。
自己将模板文件下面的列右键删除列,就会正常。

思路:在导入的监听器中进行处理
通过反射得到对应的属性以及属性值,然后判断这些值是否为空,只要有一个不为空就判断这行数据不是空行,可以读取到集合中,但是当全为空时就不把这行数据加入集合。
参考代码:

@self
public class ExcelDataListener<T> extends AnalysisEventListener<T> {
    public Map<Integer,ExcelImportSheetData<T>> sheetMap = Maps.newLinkedHashMap();

    public Map<Integer,ExcelImportSheetData<T>> getDataList() {
        return sheetMap;
    }

    @SneakyThrows
    @Override
    public void invoke(T data, AnalysisContext context) {

        boolean exist = false;
        String[] fieldName = getFieldName(data);
        for(String string : fieldName){
            Object fieldValue = getFieldValue(data, string);
            if(fieldValue instanceof String){
                if(StringUtils.isNotBlank((String)fieldValue)){
                    exist = true;
                }
            }
            if(!Objects.isNull(fieldValue)){
                exist = true;
            }
        }
        if(!exist){
            log.warn("该行被忽略,object={}", data);
            return;
        }
        excelImportSheetDateFresh.addRowBean(data);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {

    }

    /**
     * 获取属性名数组
     * */
    public static String[] getFieldName(Object o){
        Field[] fields=o.getClass().getDeclaredFields();
        String[] fieldNames=new String[fields.length];
        for(int i=0; i<fields.length; i++){
            if(fields[i].isAnnotationPresent(ExcelProperty.class)){
                fieldNames[i]=fields[i].getName();
            }
        }
        return fieldNames;
    }

    /**
     * 通过属性名获取属性值  忽略大小写
     * @param o
     * @param name
     * @return
     * @throws Exception
     */

    public static Object getFieldValue(Object o,String name){
        try {
            Field[] fields = o.getClass().getDeclaredFields();
            Object object = null;
            for (Field field : fields) {
                // 可以获取到私有属性
                field.setAccessible(true);
                if (field.getName().toUpperCase().equals(name.toUpperCase())) {
                    object = field.get(o);
                    break;
                }
            }
            return object;
        }catch (Exception e) {
            log.warn("获取值异常,field={}", o, e);
            return false;
        }
    }
}


不上个代码怎么指点呢

代码没问题;
是不是你的表格里面,本身那里是有空格的存在?

解决Empty row EasyExcel末尾出现非常多空白行跳过
https://blog.csdn.net/BanQIJane/article/details/122125104