我有一个只有一张表(Sheet1)的 excel 模板。是否可以使用 rubyxl 生成在我的输出文件中使用 Sheet1 作为模板的多张表?
问问题
1353 次
2 回答
1
我能够通过以下步骤实现这一目标:
1.解析xlsx/xlsm文件
workbook = RubyXL::Parser.parse(File.join(Rails.root, "public", "template.xlsm")
2.取工作表模板
template = workbook[0]
3. 向工作簿添加新工作表
worksheet = workbook.add_worksheet("Example")
4.重复sheet_data
worksheet.sheet_data = template.sheet_data.dup
worksheet.sheet_data.rows = template.sheet_data.rows.map do |row|
next unless row
new_row = row.dup
new_row.worksheet = worksheet
new_row.cells = row.cells.map{ |cell| next unless cell; new_cell = cell.dup; new_cell.worksheet = worksheet; new_cell }
new_row
end
不幸的是,sheet_data 的单元格Marshal.dump
返回错误no _dump_data is defined for class Nokogiri::XML::Namespace
,所以我不得不编写这个肮脏的解决方法。
5.复制你需要的一切
worksheet.cols = Marshal.load(Marshal.dump(template.cols))
worksheet.merged_cells = Marshal.load(Marshal.dump(template.merged_cells))
更多属性检查template.instance_variables
您也可以删除模板
workbook.worksheets.delete(template)
并通过以下方式返回带有新工作表的工作簿
send_data workbook.stream.string, filename: "example.xlsm", disposition: "attachment"
...在您的 Rails 控制器中
或者只是将其保存到文件
workbook.write("path/to/desired/Excel/file.xlsx")
于 2019-02-16T11:00:24.680 回答
0
template = RubyXL::Parser.parse 'path/to/template.xlsx'
sheet1 = template.worksheets[0]
sheet2 = template.worksheets[0]
#your code manipulating sheet1, sheet2 etc.
return RubyXL::Workbook.new [sheet1, sheet2]
于 2015-04-14T18:55:11.103 回答