若依ruoyi框架POI导出时设置某列或某个单元格不可编辑的功能集成,POI如何设置某列或某个单元格不可编辑,纯原创

最近在开发的过程中遇到了批量修改的操作,不过是通过导出的数据在excel修改后在导入进来,来完成修改的效果,这样的话就需要在导出的数据中传入唯一字段用于作为数据标识,比如设备的SN号,以及一些其他的展示字段,但这些字段用户是不可以去修改的,如何限制用户去修改这些字段成为了我们这篇文章的内容。
由于若依框架中excel的导入导出使用的是POI,所以如果使用原生框架遇到问题的也可以参考这篇文章。

思路

1.将需要锁定的单元格为锁定状态;
2.不需要锁定的设置为解锁状态;
3.单元格填充完毕后设置sheet表格为受保护状态并设置密码。
因为POI不支持直接对单元格设置锁定,所以需要设置保护状态,再对单元格的锁定状态做操作,如果不设置保护状态单元格还是可以编辑的。

期间遇到的问题

将单元格设置为不可编辑状态后,整个表都不可以编辑;
因为单元格默认的状态就是锁定状态,需要将不需要锁定的单元格进行解锁。

若依框架导出时如何让某列或某个单元格不可编辑的功能集成

1.首先在若依的自定义注解类Excel中加入isLock注解参数

/**
 * @Description: 该列是否被锁定,被锁定的列不可编辑 TODO 2023/5/26 新增让单元格列不可编辑逻辑
 * @Param: []
 * @return: boolean
 * @Author: TangBoBoa
 * @Date: 2023/5/26
 */
public boolean isLock() default false;

2.在ExcelUtil中修改exportExcelcreateCelladdCell方法:

新增的代码用startend做了标识

/**
 * 对list数据源将其里面的数据导入到excel表单
 * 
 * @return 结果
 */
public void exportExcel(HttpServletResponse response)
{
    
    
    try
    {
    
    
        writeSheet();
        // 设置单元格为保护状态 TODO 2023/5/26 新增让单元格列不可编辑逻辑——————————————————start
        sheet.protectSheet("password");
        // 设置单元格为保护状态 TODO 2023/5/26 新增让单元格列不可编辑逻辑——————————————————end
        wb.write(response.getOutputStream());
    }
    catch (Exception e)
    {
    
    
        log.error("导出Excel异常{}", e.getMessage());
    }
    finally
    {
    
    
        IOUtils.closeQuietly(wb);
    }
}

/**
 * 创建单元格
 */
public Cell createCell(Excel attr, Row row, int column)
{
    
    
    // 创建列
    Cell cell = row.createCell(column);
    // 写入列信息
    cell.setCellValue(attr.name());
    setDataValidation(attr, row, column);
//        cell.setCellStyle(styles.get("header"));	若依原来的设置的样式
    // TODO 2023/5/26 新增让单元格不可编辑逻辑——————————————————start
    CellStyle cellStyle = null;
    if (attr.isLock()) {
    
    
        cellStyle = wb.createCellStyle();
        cellStyle.cloneStyleFrom(styles.get("header"));
        cellStyle.setFillForegroundColor(IndexedColors.RED.getIndex());//设置上锁的单元格背景色
        // 创建样式,设置单元格为不可编辑,默认就是不可编辑,但是这里拷贝了header中的样式,如果第一个单元格isLock为false,则它的Locked状态就变为了false,所以这里需要重新指定为true
        cellStyle.setLocked(true);
    } else {
    
    
        cellStyle = styles.get("header");
        cellStyle.setLocked(false);
    }
    cell.setCellStyle(cellStyle);
    // TODO 2023/5/26 新增让单元格列不可编辑逻辑——————————————————end
    return cell;
}


/**
 * 添加单元格
 */
public Cell addCell(Excel attr, Row row, T vo, Field field, int column)
{
    
    
    Cell cell = null;
    try
    {
    
    
        // 设置行高
        row.setHeight(maxHeight);
        // 根据Excel中设置情况决定是否导出,有些情况需要保持为空,希望用户填写这一列.
        if (attr.isExport())
        {
    
    
            // 创建cell
            cell = row.createCell(column);
            int align = attr.align().value();
//                cell.setCellStyle(styles.get("data" + (align >= 1 && align <= 3 ? align : "")));
            // TODO 2023/5/26 新增让单元格列不可编辑逻辑——————————————————start
            CellStyle cellStyle = null;
            if (attr.isLock()) {
    
    
                cellStyle = wb.createCellStyle();
                cellStyle.cloneStyleFrom(styles.get("data" + (align >= 1 && align <= 3 ? align : "")));
                // 创建样式,设置单元格为不可编辑,默认就是不可编辑,但是这里拷贝了header中的样式,如果第一个单元格isLock为false,则它的Locked状态就变为了false,所以这里需要重新指定为true
                cellStyle.setLocked(true);
            } else {
    
    
                cellStyle = styles.get("data" + (align >= 1 && align <= 3 ? align : ""));
                cellStyle.setLocked(false);
            }
            cell.setCellStyle(cellStyle);
            // TODO 2023/5/26 新增让单元格列不可编辑逻辑——————————————————end
            ...
        }
    }
    catch (Exception e)
    {
    
    
        log.error("导出Excel失败{}", e);
    }
    return cell;
}

剥离若依框架后,POI设置单元格或列为不可编辑的核心代码

当使用POI库进行Excel文件操作时,你可以按照以下完整的Java代码示例来设置某个列不可编辑。这个示例假设你正在使用Apache POI库和XLSX文件格式。

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class LockColumnExample {
    
    

    public static void main(String[] args) {
    
    
        String filePath = "path/to/your/excel/file.xlsx";
        int columnIndex = 2; // 要设置为不可编辑的列索引(从0开始)

        try {
    
    
            FileInputStream file = new FileInputStream(filePath);
            Workbook workbook = new XSSFWorkbook(file);
            Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表

            // 创建锁定单元格的样式
            CellStyle lockedCellStyle = workbook.createCellStyle();
            lockedCellStyle.setLocked(true);

            // 遍历每一行,将指定列的单元格样式设置为锁定状态
            for (Row row : sheet) {
    
    
                Cell cell = row.getCell(columnIndex);
                if (cell != null) {
    
    
                    cell.setCellStyle(lockedCellStyle);
                }
            }

            // 启用保护并设置密码(可选)
            sheet.protectSheet("password");

            // 保存修改后的Excel文件
            FileOutputStream outputFile = new FileOutputStream("path/to/output/file.xlsx");
            workbook.write(outputFile);
            outputFile.close();

            System.out.println("列设置为不可编辑成功!");
        } catch (IOException e) {
    
    
            e.printStackTrace();
        }
    }
}

总结

主要操作就是在创建单元格的时候设置样式将Locked状态改为truefalse,并在单元格填充完毕后设置该页签为保护状态,并给予密码:sheet.protectSheet("password");

猜你喜欢

转载自blog.csdn.net/TangBoBoa/article/details/130888549