导出Excel将指定列加锁不可编辑

2023-10-30 14:30:06 浏览数 (1)

导出Excel将指定列加锁不可编辑

最近写了一个需求,需要将Excel导出,但是有些列是不允许编辑的,所以需要将这些列加锁,不允许编辑,这里就记录一下

首先将整个sheet页全部加锁

需要创建一个Handler

代码语言:javascript复制
package org.irm.ai.sensitive.excel;

import java.util.UUID;

import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.streaming.SXSSFSheet;

import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;

/**
 * 锁定Sheet页
 *
 * @author Eliauk
 * @since 2023/5/18 14:28
 */
public class LockSheetWriteHandler implements SheetWriteHandler {


    @Override
    public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
    }

    @Override
    public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
        Sheet sheet = writeSheetHolder.getSheet();
        //锁定工作簿,设置保护密码
        sheet.protectSheet(String.valueOf(UUID.randomUUID()));
        // 锁定单元格不可选中(防止别人直接复制内容到其他excel修改)
        ((SXSSFSheet) writeSheetHolder.getSheet()).lockSelectLockedCells(true);
    }
}

需要解锁的列,也就是允许编辑的列

代码语言:javascript复制

package org.irm.ai.sensitive.excel;

import java.lang.reflect.Field;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.util.CellUtil;

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.Head;
import com.alibaba.excel.metadata.data.WriteCellData;
import com.alibaba.excel.write.handler.CellWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;

/**
 * @author Eliauk
 * @since 2023/5/18 14:31
 */
final
public class CellHandler implements CellWriteHandler {

    // 将指定的要解锁的列放到set中
    private static final HashSet<String> values = new HashSet<>();

    static {

        Field[] fields = TriageResultsExcel.class.getDeclaredFields();
        for (Field field : fields) {
            if (field.isAnnotationPresent(ExcelProperty.class)) {
                ExcelProperty annotation = field.getAnnotation(ExcelProperty.class);
                String value = Arrays.toString(annotation.value());
                if (value.startsWith("[") && value.endsWith("]")) {
                    final String substring = value.substring(1, value.length() - 1);
                    if ("文件唯一Id(请勿修改)".equals(substring)) {
                        continue;
                    }
                    values.add(substring);
                    continue;
                }
                values.add(value);
            }
        }
    }

    @Override
    public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<WriteCellData<?>> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {

        // 将需要解锁的列解锁
        final String dataHead = head.getHeadNameList().get(0);
        if (values.contains(dataHead)) {
            Map<String, Object> properties = new HashMap<>(1);
            properties.put(CellUtil.LOCKED, false);
            CellUtil.setCellStyleProperties(cell, properties);
        }
    }
}

0 人点赞