java - 如何根据 Apache POI 中另一个单元格中的值禁用单元格中的编辑?

标签 java apache-poi

我有一个要求,我只需要向用户询问一个标志,如果该标志为真,我需要他在该行的另一个单元格中输入一个数字。 如果它是假的,那么该单元格应该是不可编辑的。 我知道如何对单元格进行限制,但我不知道这种有条件的限制。 enter image description here

最佳答案

如果 A 列中的标志在 apache poi 解析工作表时已经存在,则 CellStyle.setLocked如果 A 列中有 True,则可以设置为 False。因此,如果工作表受到保护,这些单元格将不会被锁定并且可以编辑。

但是如果 A 列中的 TrueFalse 将在 Excel GUI 中更改,那么这是不可能,因为它不会在更改 A 列中的值时有条件地更改。为此,必须有可能对锁定的单元格进行条件格式化。但是这种可能性是不存在的,至少在不使用 VBA 的情况下是不存在的。

然后只有数据验证是可能的,它检查 A 是否为真,当 B 获得一个值,如果不是则发出警报。 Data Validations可以使用 apache poi 进行设置。

例子:

import java.io.FileOutputStream;

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

public class CreateExcelDataValidationIfATrueThenB {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook();
  Sheet sheet = workbook.createSheet("Sheet1");

  DataValidationHelper dvHelper = sheet.getDataValidationHelper();
  DataValidationConstraint dvConstraint = dvHelper.createCustomConstraint("AND(A1, B1<>\"\")");

  CellRangeAddressList addressList = new CellRangeAddressList(-1, -1, 1, 1);
  DataValidation validation = dvHelper.createValidation(dvConstraint, addressList);

  validation.createPromptBox("For column B:", "If column A is True, then please put content in column B, else not.");
  validation.setShowPromptBox(true);
  validation.createErrorBox("Bad Value", "Please put content in column B only if column A is True, else not!");
  validation.setShowErrorBox(true);

  sheet.addValidationData(validation);

  sheet.createRow(0).createCell(0).setCellValue(true);
  sheet.createRow(1).createCell(0).setCellValue(false);
  sheet.createRow(2).createCell(0).setCellValue(false);
  sheet.createRow(3).createCell(0).setCellValue(true);

  workbook.write(new FileOutputStream("CreateExcelDataValidationIfATrueThenB.xlsx"));
  workbook.close();

 }

}

如上所述,在更改 A 列中的单元格时,可以使用 VBA 事件对单元格锁定进行条件格式化。但是 apache poi 不提供创建 VBA 代码。因此,如果这是要求,则必须使用已经包含这些宏的 Excel 模板。

关于java - 如何根据 Apache POI 中另一个单元格中的值禁用单元格中的编辑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50095476/

相关文章:

java - 为什么 getIcon() 在 setIcon(...) 之后不返回更新的图标?

java - 如何获取原始文件夹android中的字符串文件名(我的音频文件)

java - 如何使用 Apache-POI api for java (MS-Word) 在后续页面上重复 XWPFTable header

apache - 如何设置为同一段落定义不同样式

java - 在java中执行一些 'lambda calculus'的库

java - 数据库字段验证客户端

java - 使用 apache poi 从 Excel 读取下拉列表内容

java - Primefaces 导出数据时出错 xls java.lang.NoSuchMethodError : . ..poi...CellStyle.setAlignment

java - 在 java 中创建一个计数计时器(仅秒和毫秒)

java - 在 JSF 2.0 中生成 CSV 文件