我想使用poi使我的excel的标题行无法使用。
我在互联网上获得了各种解决方案,首先要做sheet.protectSheet("password")
,最终使整个表格无法编辑,然后循环遍历所有可编辑的单元格,并将它们的cellStyle设置为cellStyle.setLocked(false)
。
在我的情况下,因为excel只包含标题,其余的行将由用户填写,我无法使整个表单不可编辑,我只想让标题无法被用户使用。我怎样才能做到这一点?
答案 0 :(得分:0)
使用XSSF
可以实现以下目标:
将CellStyle
设置为setLocked
false作为所有列的默认样式。这可以通过设置具有min col 1的org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol
元素和设置该样式的max col 16384来实现。
然后通过为该行设置CustomFormat
true来取消使用该样式的第1行。因此它不会对所有列使用默认样式。其他设置CellStyle
为setLocked
为true,作为该行的默认样式。这可以通过从该行获取org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow
元素并在那里设置CustomFormat
和S
(样式)来实现。
结果:除第1行外,所有单元格都已解锁。
示例:
import java.io.*;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
public class CreateExcelSheetProtectOnlyFirstRow {
public static void main(String[] args) throws Exception {
Workbook workbook = new XSSFWorkbook();
//create a CellStyle having setLocked false
CellStyle cellstyleUnprotect = workbook.createCellStyle();
cellstyleUnprotect.setLocked(false);
//create a CellStyle having setLocked true
CellStyle cellstyleProtect = workbook.createCellStyle();
cellstyleProtect.setLocked(true);
Sheet sheet = workbook.createSheet("Sheet1");
//set the CellStyle having setLocked false as the default style for all columns
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol cTCol =
((XSSFSheet)sheet).getCTWorksheet().getColsArray(0).addNewCol();
cTCol.setMin(1);
cTCol.setMax(16384);
cTCol.setWidth(12.7109375);
cTCol.setStyle(cellstyleUnprotect.getIndex());
Row row = sheet.createRow(0);
//set CustomFormat true for that row
//so it does not using the default style for all columns
//and set the CellStyle having setLocked true as the default style for that row
org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow cTRow =
((XSSFRow)row).getCTRow();
cTRow.setCustomFormat(true);
cTRow.setS(cellstyleProtect.getIndex());
for (int c = 0; c < 3; c++) {
row.createCell(c).setCellValue("Header " + (c+1));
}
sheet.protectSheet("password"); // protect sheet
workbook.write(new FileOutputStream("CreateExcelSheetProtectOnlyFirstRow.xlsx"));
workbook.close();
}
}