Axlsx,构builddynamic列

我已经被委托为我们这里的一个系统在这里工作做一个dynamic的报告build设插件。 问题是这些报告相当复杂,每个报告有19个工作表,每个工作表包含多个表格,这些表格将填充各种数据和types的数据,包括数据validation(下拉式)。

我最初的想法是让我们find一个rubygem。 因为它是一个rails应用程序。 没有太多的select,但我确实发现Axlsx看起来像是我的最后希望。

其中一个表有6列,其中4个需要数据validation。

现在我已经看到,你可以通过.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 

并在创build行时应用这些样式。

 ws.add_row ['Quarter', 'Profit', '% of Total'], :style => header ws.add_row ['Q1-2010', 'yes', '=B4/SUM(B4:B7)'], :style => [default, profit, percent] 

我已经看到有一种validation数据的方法。

 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 

但有没有办法指定添加行时需要validation的单元格。 或者将它们添加到不同大小的表格中?

我认为这将是很酷,如果你可以指定数据validation相同的方式,你可以风格。 像这样的东西。

  boolean_validation = format.add_data_validation :type => list, :formula => 'lists!A2:A4'... (rest of the options) 

那么在创build行时

  ws.add_row ['Q1-2010', 'yes', '=B4/SUM(B4:B7)'], :style => [default, profit, percent], :format => [nil, boolean_validation, nil] 

有没有人尝试过这样的事情呢? 或者任何人都知道如何build立这样的

由于库现在已经存在,因此您需要单独指定数据validation行插入。

我build议有一个对象负责生成你需要的每个表types,它可以计算和添加需要validation的范围的引用。

我想你可能会发现Axlsx.cell_range方法,因为它可以获取一组单元格并返回Excel风格的“A1:A9”types引用。

不幸的是,OOXML对象树的结构使得在逐个单元格的基础上指定validation非常困难,但是可以随意向github存储库添加一个问题。

https://github.com/randym/axlsx

最好

randym