Excel标题不可编辑的poi

时间:2017-07-13 16:56:38

标签: excel apache-poi

我想使用poi使我的excel的标题行无法使用。

我在互联网上获得了各种解决方案,首先要做sheet.protectSheet("password"),最终使整个表格无法编辑,然后循环遍历所有可编辑的单元格,并将它们的cellStyle设置为cellStyle.setLocked(false)

在我的情况下,因为excel只包含标题,其余的行将由用户填写,我无法使整个表单不可编辑,我只想让标题无法被用户使用。我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:0)

使用XSSF可以实现以下目标:

CellStyle设置为setLocked false作为所有列的默认样式。这可以通过设置具有min col 1的org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol元素和设置该样式的max col 16384来实现。

然后通过为该行设置CustomFormat true来取消使用该样式的第1行。因此它不会对所有列使用默认样式。其他设置CellStylesetLocked为true,作为该行的默认样式。这可以通过从该行获取org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow元素并在那里设置CustomFormatS(样式)来实现。

结果:除第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();
 }
}