文章目录
最近在开发的过程中遇到了批量修改的操作,不过是通过导出的数据在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
中修改exportExcel
、createCell
和addCell
方法:
新增的代码用start
,end
做了标识
/**
* 对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
状态改为true
或false
,并在单元格填充完毕后设置该页签为保护状态,并给予密码:sheet.protectSheet("password");