java - Apache POI 锁定单元格但允许调整列大小

标签 java excel apache-poi password-protection xssf

我通过 Apache POI XSSF 创建一个 Excel 文件,并使用密码锁定工作表,以便用户无法更改前两行和前五列的值(我锁定工作表并允许编辑其他单元格)。一切正常,唯一的问题是用户无法调整列的大小,因此他既无法更改也无法调整列的大小以读取所有单元格值。 即使工作表受到保护,是否可以允许调整列大小? 这是我的配置

workbook = new XSSFWorkbook();
sheet = workbook.createSheet("Sheet1");
sheet.protectSheet("passwordExcel"); 
unlockedNumericStyle = workbook.createCellStyle(); 
unlockedNumericStyle.setLocked(false);
// Format cell for date
dateStyle = workbook.createCellStyle();
CreationHelper createHelper = workbook.getCreationHelper();
dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));
sheet.autoSizeColumn(1);

我读到了有关 lockFormatCell() 的内容,但我不明白它是否可以帮助我。谢谢

最佳答案

为了能够在工作表 protected 时调整列大小,您需要将 XSSFSheet.lockFormatColumns 设置为 false

完整示例:

import java.io.FileOutputStream;

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

public class CreateExcelXSSFProtectedSheet {

 public static void main(String[] args) throws Exception {

  Workbook workbook = new XSSFWorkbook();

  CreationHelper createHelper = workbook.getCreationHelper();

  CellStyle unlockedNumericStyle = workbook.createCellStyle();
  unlockedNumericStyle.setDataFormat(createHelper.createDataFormat().getFormat("$#,##0.00_);[Red]($#,##0.00)"));
  unlockedNumericStyle.setLocked(false);

  CellStyle dateStyle = workbook.createCellStyle();
  dateStyle.setDataFormat(createHelper.createDataFormat().getFormat("dd/mm/yyyy"));

  Sheet sheet = workbook.createSheet();

  Row row = sheet.createRow(0);
  Cell cell = row.createCell(1);
  cell.setCellValue("some data");

  row = sheet.createRow(1);
  cell = row.createCell(1);
  cell.setCellValue(-123456789.0123456);
  cell.setCellStyle(unlockedNumericStyle);

  row = sheet.createRow(2);
  cell = row.createCell(1);
  cell.setCellValue(new java.util.Date());
  cell.setCellStyle(dateStyle);

  ((XSSFSheet)sheet).lockFormatColumns(false);

  sheet.protectSheet("passwordExcel"); 
 
  sheet.autoSizeColumn(1);

  FileOutputStream out = new FileOutputStream("CreateExcelXSSFProtectedSheet.xlsx");
  workbook.write(out);
  out.close();
  workbook.close();

 }

}

关于java - Apache POI 锁定单元格但允许调整列大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48787000/

相关文章:

c# - 在 C# 中将数据写入现有的 Excel 文件

excel - 我可以在不打开 Excel 或 Word 等相关文件的情况下复制 VBA 代码吗?

java - 如何在java中将hssfcell转换为字符串

java - 为 JanusGraph 提供属性值时,只有前 20 个字符作为值存储在使用 Java 的属性中

excel - 如何在 VBA 中使用 FileSystemObject 替换文本文件行中的字符串?

java - 使用 POI 的 XSSF 和 SAX(事件 API)读取 Excel 工作表

java - 需要有关 apache poi api 中的数组公式实现的帮助

java - 为什么我无法定义数组?

java - Appium - 我们什么时候使用触摸 Action ?我可以用它输入文本的实际例子吗?

java - 关于从另一个对象访问的 protected 方法访问级别是什么