为什么Excel将细胞视为受保护的,即使它们不是?

时间:2016-12-13 12:55:20

标签: java apache-poi

我提供了保护并且还隐藏了表'MasterData',我创建了一些已在第二张'customerAssets'中使用的命名范围。这是代码片段:

    workbook.setSheetHidden(0,  true);  //to hides masterData
    workbook.setActiveSheet(1);          // sets active sheet as Customer Assets Sheet
    masterDataSheet.protectSheet("12345");  // protect MasterData sheet

但是在打开excel之后: enter image description here

  1. 不允许编辑“客户资产”表,说明其受保护。
  2. 但如果我打开“Sheet1”然后“客户资产”,则允许编辑。
  3. 它有什么问题?

1 个答案:

答案 0 :(得分:1)

Excel或Calc中的工作表可以同时处于活动状态(视图中位于您前面的工作表)和选中(可以选择多个工作表作为一个组)。

第一个创建的工作表将始终处于活动状态并已选中。因此,如果您的MasterData工作表是第一个创建的工作表,则它是活动的并且已选中。 workbook.setActiveSheet更改活动状态但不更改选定状态。因此,您的MasterData表保持选中状态。活动单元格中的更改将始终应用于所有选定的工作表。因此,您确实尝试更改受保护的单元格,因为也选择了受保护的MasterData表单。

如果您通过鼠标单击选择单张纸,则将更改选择并且不再选择所选的纸张组。

我们至少需要取消选择MasterData表。但我们也应该选择另一张纸。

import java.io.*;

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

public class CreateSheets {

 public static void main(String[] args) throws Exception {
  Workbook workbook = new XSSFWorkbook();
  Sheet masterDataSheet = workbook.createSheet("MasterData"); //first sheeet will be both active and selected
  Sheet customerAssetsSheet = workbook.createSheet("Customer Assets");
  Sheet sheet1 = workbook.createSheet("Sheet1");

  workbook.setSheetHidden(0,  true);       //hide masterDataSheet
  masterDataSheet.setSelected(false);      //unselect masterDataSheet

  workbook.setActiveSheet(1);              //sets active sheet as Customer Assets Sheet
  //customerAssetsSheet.setSelected(true); //not necessary but recommended: set Customer Assets Sheet selected

  masterDataSheet.protectSheet("12345");   // protect MasterData sheet

  FileOutputStream fileOut = new FileOutputStream("CreateSheets.xlsx");
  workbook.write(fileOut);
  fileOut.close();
  workbook.close();
 }
}