如何使用rubyXL锁定现有单元格,但不锁定所有空单元格?

new9mtju  于 2022-12-22  发布在  Ruby
关注(0)|答案(1)|浏览(141)

如何使用rubyXL锁定工作表中的现有单元格,但不锁定所有空单元格?(我不想让用户跳过任何障碍,比如要求他或她在输入新数据之前创建新列。)
我想出了如何使用StackOverflow帖子中介绍的技术锁定现有单元格:How can we protect some parts of a sheet using rubyXL?(基本思想是:(1)创建一个新的xf,(2)将新的xf注册到工作簿,(3)将所有现有单元格的style_index设置为使用此xf,然后(4)为工作表设置WorksheetProtection。)
但是,当我这样做并在Excel中打开工作簿时,工作表中的所有空单元格也被锁定。
原则上,我需要向所有未使用的单元格添加一个"unlocked" xf;但是,由于这些单元格还不存在,因此没有要设置"unlocked" xf的Cell对象。
在Excel中有一种方法可以做到这一点:
1.单击工作表的左上角以选择所有单元格。
1.转到"格式"-〉"格式单元格",选择"保护"标签,并取消选中"锁定"框。
1.选中已有的已占用单元格,进入"格式"-〉"单元格格式",选择"保护"选项卡,勾选"锁定"框。
1.转到"工具"-〉"保护"-〉"保护工作表"并保护工作表。
当我按照这些步骤操作,然后使用rubyXL检查工作表时,我看到有三个XL对象:
1.默认XL对象
1.启用保护的XL对象
1.专门禁用保护的XL对象。
现有的单元格都使用style/XL 2,所以我想一定有办法指定工作表中所有未使用的单元格默认为style/XL 3;但是,我不知道如何使用rubyXL指定它。
有什么想法吗?

2sbarzqh

2sbarzqh1#

我想通了:

require "rubyXL"
require "rubyXL/convenience_methods"

workbook = RubyXL::Workbook.new
sheet = workbook.worksheets.first

# Crate an xf that locks the cell
locked_xf = workbook.cell_xfs.first.dup
locked_xf.protection = RubyXL::Protection.new(
  locked: true,
  hidden: false,
)
locked_id = workbook.register_new_xf(locked_xf)

# Crate an xf that does not lock the cell
unlocked_xf = workbook.cell_xfs.first.dup
unlocked_xf.protection = RubyXL::Protection.new(
  locked: false,
  hidden: false,
)
unlocked_id = workbook.register_new_xf(unlocked_xf)

# Create new cells.  Lock each one.
(0..5).each do |row|
  (0..5).each do |col|
    cell = sheet.add_cell(row, col, (row * col).to_s)
    cell.style_index = locked_id
  end
end

# Create a cell range to cover "all" rows. (Upper bound set at 16384)
range = RubyXL::ColumnRange.new
range.min = 1
range.max = 16384
range.width = 10.83203125  # be sure to set this, otherwise columns aren't visible.
range.style_index = unlocked_id
sheet.cols << range

# Lock the sheet
sheet.sheet_protection = RubyXL::WorksheetProtection.new(
  sheet:          true,
  objects:        true,
  scenarios:      true,
  format_cells:   true,
  format_columns: true,
  insert_columns: true,
  delete_columns: true,
  insert_rows:    true,
  delete_rows:    true
)

workbook.write("lock_test.xlsx")

(我还在这里放了一份代码:https://github.com/kurmasz/rubyXL-recipes

相关问题