我受委托为我们的一个系统制作动态报告构建插件。问题是这些报告非常复杂,每个报告有19个工作表,每个工作表包含多个表,这些表将填充各种数量和类型的数据,包括数据验证(下拉列表)。
我最初的想法是让我们找到一颗红宝石。因为它是一个rails应用程序。没有多少选择,但我确实发现Axlsx看起来像是我最后的希望。
其中一个表有6列,其中4列需要数据验证。
现在我已经看到你可以设置每一列的样式,甚至可以通过.add_style
方法更改格式,
p.workbook do |wb|
# define your regular styles
styles = wb.styles
title = styles.add_style :sz => 15, :b => true, :u => true
default = styles.add_style :border => Axlsx::STYLE_THIN_BORDER
header = styles.add_style :bg_color => '00', :fg_color => 'FF', :b => true
profit = styles.add_style :border => Axlsx::STYLE_THIN_BORDER
percent = styles.add_style :num_fmt => Axlsx::NUM_FMT_PERCENT, :border => Axlsx::STYLE_THIN_BORDER
并在创建行时应用这些样式。
ws.add_row ['Quarter', 'Profit', '% of Total'], :style => header
ws.add_row ['Q1-2010', 'yes', '=B4/SUM(B4:B7)'], :style => [default, profit, percent]
我已经看到有一种验证数据的方法。
p.workbook.add_worksheet(name: "dropdown") do |ws|
ws.add_row ["rank_type"]
ws.add_data_validation("A2:A1000", {
:type => :list,
:formula1 => 'lists!A2:A4',
:showDropDown => false,
:showErrorMessage => true,
:errorTitle => '',
:error => 'Please use the dropdown selector to choose a valid rank type',
:errorStyle => :stop,
:showInputMessage => true,
:promptTitle => 'Rank type',
:prompt => 'Please select a valid rank type'})
end
但有没有办法在添加行时指定需要验证的单元格。或者将它们添加到各种大小的表中?
我认为如果您能够以与样式相同的方式指定数据验证将会很酷。像这样的东西。
boolean_validation = format.add_data_validation :type => list, :formula => 'lists!A2:A4'... (rest of the options)
然后创建行
ws.add_row ['Q1-2010', 'yes', '=B4/SUM(B4:B7)'], :style => [default, profit, percent], :format => [nil, boolean_validation, nil]
有没有人试图这样的事情甚至可能?或者任何人都知道如何构建这样的
答案 0 :(得分:7)
由于今天存在库,您需要与行插入分开指定数据验证。
我建议有一个对象负责生成您需要的每个表类型,它可以计算并添加需要验证的范围的引用。
我认为你可能会发现Axlsx.cell_range方法很方便,因为它可以获取一个单元格数组并返回excel样式'A1:A9'类型引用。
不幸的是,OOXML对象树的结构使得逐个单元地指定验证变得非常困难,但是可以随意向github存储库添加问题。
https://github.com/randym/axlsx
最好的
randym