Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Excel会将细胞视为受保护的,即使它们不受保护?_Java_Apache Poi - Fatal编程技术网

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

Java 为什么Excel会将细胞视为受保护的,即使它们不受保护?,java,apache-poi,Java,Apache Poi,我提供了保护,还隐藏了表格“主数据”,从中我创建了一些命名范围,我在第二张表格“customerAssets”中使用了这些命名范围。下面是代码片段: workbook.setSheetHidden(0, true); //to hides masterData workbook.setActiveSheet(1); // sets active sheet as Customer Assets Sheet masterDataSheet.protec

我提供了保护,还隐藏了表格“主数据”,从中我创建了一些命名范围,我在第二张表格“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之后:

  • 它不允许编辑“客户资产”表,表明其受保护
  • 但如果我打开“Sheet1”,然后打开“Customer Assets”,它允许编辑

  • 它可能有什么问题?

    Excel或Calc中的工作表既可以是活动的(视图中您面前的工作表),也可以是选中的(可以选择多个工作表作为一个组)

    第一个创建的图纸将始终处于活动状态和选中状态。因此,如果主数据表是第一个创建的表,则它处于活动状态并处于选中状态。
    workbook.setActiveSheet
    更改活动状态,但不更改选定状态。因此,您的主数据表保持选中状态。活动单元格中的更改将始终应用于所有选定的图纸。因此,您确实尝试更改受保护的单元格,因为受保护的主数据表也被选中

    如果用鼠标单击选择单个图纸,则选择将被更改,选定的图纸组将不再被选择

    我们至少需要取消选择主数据表。但我们也应该选择另一张

    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();
     }
    }