我提供了保护并且还隐藏了表'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
它有什么问题?
答案 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();
}
}