如何保护标题行但允许使用AXLSX输入新行?

时间:2013-09-27 12:41:44

标签: ruby-on-rails-3 axlsx

我正在使用'Axlsx'的宝石在轨道中,但没有得到如何保护那个excel中的一些特殊列。

3 个答案:

答案 0 :(得分:4)

您要做的是指定未锁定的样式并将其应用于所有不受保护的行。 我知道这有点令人费解,但规范也是如此!

p = Axlsx::Package.new
wb = p.workbook

unlocked = wb.styles.add_style { locked: false }

wb.add_worksheet(name: 'Sheet Protection') do |sheet|
  sheet.sheet_protection.password = 'fish'
  sheet.add_row [1, 2 ,3] # These cells will be locked
  sheet.add_row [4, 5, 6], style: unlocked # these cells will not!
end

p.serialize 'dont_touch_my_headers.xlsx'

要记住的重要一点是,您需要为包含

的所有非标题行指定样式
locked: false

答案 1 :(得分:1)

您可以在样式中指定locked,然后将该样式应用于末尾的列:

locked = wb.styles.add_style :locked => true
sheet.col_style 2, locked

我没有测试过。它结合了一些例子。以下是锁定单行的示例:

https://github.com/randym/axlsx/blob/master/examples/example.rb#L571

答案 2 :(得分:0)

我的解决方案是我检查了sheet.sheet_protection方法并看到了一些有用的方法:

[5] pry(#<ProductsGrid>)> sheet.sheet_protection
=> #<Axlsx::SheetProtection:0x007f8a36173730
 @auto_filter=true,
 @delete_columns=true,
 @delete_rows=true,
 @format_cells=true,
 @format_columns=true,
 @format_rows=true,
 @insert_columns=true,
 @insert_hyperlinks=true,
 @insert_rows=true,
 @objects=false,
 @password=nil,
 @pivot_tables=true,
 @scenarios=false,
 @select_locked_cells=false,
 @select_unlocked_cells=false,
 @sheet=true,
 @sort=true>

并使用其中一个,就像我在Microsoft Excel中使用一样。以下是我的

unlocked  = product_book.styles.add_style locked: false
product_sheet = product_book.add_worksheet(name: 'Product') do |sheet|
  sheet.sheet_protection.password = 'password'
  sheet.sheet_protection.select_locked_cells  = true
  sheet.add_row set_product_header, style: wrap_text
end

插入行后,将样式unlocked应用于其余行