[alibaba/easyexcel]设置保护表头后,其他行无法删除

2024-04-25 228 views
1
代码
   public class RowCellStyleStrategy extends AbstractVerticalCellStyleStrategy implements SheetWriteHandler {

    @Override
    protected WriteCellStyle contentCellStyle(CellWriteHandlerContext context) {
        WriteCellStyle writeCellStyle = new WriteCellStyle();

        writeCellStyle.setLocked(context.getRowIndex() < 2);

        return writeCellStyle;
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        SXSSFSheet sxssfSheet = (SXSSFSheet) sheet;
        sxssfSheet.lockFormatColumns(false);
        sxssfSheet.lockFormatRows(false);
        sxssfSheet.lockDeleteRows(false);
        sheet.createFreezePane(0, 2, 0, 2);

        Workbook workbook = writeSheetHolder.getSheet().getWorkbook();

        sheet.protectSheet("cmkladgo1165");

        int size = writeSheetHolder.excelWriteHeadProperty().getHeadMap().size();

        CellStyle columnStyle = workbook.createCellStyle();
        columnStyle.setLocked(false);

        for (int i = 0; i < size; i++){
            sheet.setDefaultColumnStyle(i, columnStyle);
        }
    }
}
问题描述

代码中对前两行进行了保护不允许用户操作,但是这会导致其他行无法删除整行数据,因为后面的列是锁定的;尝试获取excel最大列数,对所有列进行解锁,但是十分影响性能,不知道有没有更好的方法?

回答

7

判断,只保护表头就可以了

@Override public void afterCellDispose(CellWriteHandlerContext context) {

                if (BooleanUtils.isNotTrue(context.getHead())) {
                 }

            }
1

判断,只保护表头就可以了

@OverRide public void afterCellDispose(CellWriteHandlerContext context) {

                if (BooleanUtils.isNotTrue(context.getHead())) {
                 }

            }

@gongxuanzhang 请问是否有更详细的例子呢?我这里lock前两行似乎是一个意思

    @Override
    protected WriteCellStyle contentCellStyle(CellWriteHandlerContext context) {
        WriteCellStyle writeCellStyle = new WriteCellStyle();

        writeCellStyle.setLocked(context.getRowIndex() < 2);

        return writeCellStyle;
    }

关键在于整张表默认是锁定的,我只能把有内容的列设置为未锁定

        CellStyle columnStyle = workbook.createCellStyle();
        columnStyle.setLocked(false);

        for (int i = 0; i < size; i++){
            sheet.setDefaultColumnStyle(i, columnStyle);
        }
5

哦 你是这么锁的 那可能具体能不能实现我还真不清楚。。
可能你需要先在POI中看看能否实现需求
如果不能实现这个是没办法的

5

想到了一个解决方法,通过解锁行的方式。能应付大部分情况,经过测试也不太影响性能

/**
 * 解锁整行
 */
public class UnLockRowStrategy implements RowWriteHandler {

    /**
     * 待写入Excel的行数
     */
    private final Integer rowNums;

    /**
     * 解锁行数
     */
    private static final Integer UNLOCK_ROW_NUMS = 100000;

    public UnLockRowStrategy(Integer rowNums){
        this.rowNums = rowNums;
    }

    @Override
    public void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Integer relativeRowIndex, Boolean isHead) {
        Sheet sheet = writeSheetHolder.getSheet();

        CellStyle rowStyle = row.getRowStyle();
        if (Objects.isNull(rowStyle)){
            rowStyle = sheet.getWorkbook().createCellStyle();
        }
        rowStyle.setLocked(false);
        row.setRowStyle(rowStyle);

        if (row.getRowNum() == rowNums - 1){
            for (int i = rowNums; i < UNLOCK_ROW_NUMS; i++){
                sheet.createRow(i).setRowStyle(rowStyle);
            }
        }
    }
}