簡體   English   中英

如何使用 rubyXL 鎖定現有單元格但不鎖定所有空單元格?

[英]How to use rubyXL to lock existing cells but leave all empty cells unlocked?

如何使用 rubyXL 鎖定工作表中的現有單元格,但不鎖定所有空單元格? (我不想讓用戶跳過任何障礙,比如要求他或她在輸入新數據之前創建一個新列。)

我想出了如何使用 StackOverflow 帖子中介紹的技術鎖定現有單元格: 我們如何使用 rubyXL 保護工作表的某些部分? (基本思路是(1)創建一個新的 xf,(2)將新的 xf 注冊到工作簿,(3)設置所有現有單元格的style_index以使用此 xf,然后(4)為工作表設置WorksheetProtection .)

但是,當我這樣做並在 Excel 中打開工作簿時,工作表中的所有空單元格也被鎖定。

原則上,我需要為所有未使用的單元格添加一個“未鎖定”的 xf; 然而,由於這些單元格尚不存在,因此沒有單元格對象可以設置“未鎖定”的 xf。

在 Excel 中有一種方法可以做到這一點:

  1. 單擊工作表的左上角以選擇所有單元格。
  2. 轉到“格式”->“設置單元格格式”,選擇“保護”選項卡,取消選中“鎖定”框。
  3. 選擇現有的,占用的單元格,進入“格式” - >“格式化單元格”,選擇“保護”選項卡,並選中“鎖定”框。
  4. 轉到“工具”->“保護”->“保護工作表”並保護工作表。

當我執行這些步驟然后使用 rubyXL 檢查工作表時,我看到有三個 XL 對象:

  1. 默認 XL 對象
  2. 啟用保護的 XL 對象
  3. 專門禁用保護的 XL 對象。

現有的單元格都使用 style/XL 2。因此,我認為必須有一種方法可以指定工作表中所有未使用的單元格默認為 style/XL 3; 但是,我不知道如何使用 rubyXL 來指定它。

有任何想法嗎?

我想到了:

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM