如何使用axlsx为Excel单元格添加背景图案并避免使用猴子补丁
解决axlsx自定义单元格背景图案无需猴子补丁的方案
有无需修改源码的实现方案,核心是绕开add_style内置的填充参数解析逻辑,手动构造填充样式注册到样式库即可,以下是完整实现代码:
require 'axlsx' Axlsx::Package.new do |axlsxpackage| axlsxpackage.workbook do |wb| wb.styles do |style| # 预设基础黑色单元格样式 black_cell = style.add_style( bg_color: "00", fg_color: "FF", sz: 14, alignment: { horizontal: :center } ) # 手动构造带自定义图案的填充样式 # 定义PatternFill,指定图案类型、前景色(图案颜色)、背景色(单元格底色) pattern_fill = Axlsx::PatternFill.new( patternType: :lightGrid, fgColor: Axlsx::Color.new(rgb: "000000"), bgColor: Axlsx::Color.new(rgb: "FFFFFF") ) # 把填充样式加入样式库的填充列表,系统默认预留前2个fill,新加入的索引为2 wb.styles.fills << Axlsx::Fill.new(pattern_fill) # 构造带自定义填充的单元格样式,fill_id对应上面的填充索引2 dotted = style.add_style( fill_id: 2, alignment: { horizontal: :center } ) styles = [black_cell, dotted, black_cell, dotted, black_cell, dotted] wb.add_worksheet(name: 'DATA') do |sheet| sheet.add_row(%w{col1 col2 col3 col4 col5 col6}, style: styles) 10.times do sheet.add_row(%w{1 2 3 4 5 6}, style: styles) end end end end axlsxpackage.serialize('test.xlsx') end
实现说明
- axlsx的样式系统中,填充规则独立存放在
fills数组中,默认前2位是系统保留填充(索引0为无填充,索引1为灰色默认填充),自定义填充的索引从2开始计算 - 手动构造
PatternFill时可以自由指定所有Excel支持的图案类型,包括lightGrid、darkTrellis等,不受parse_fill_options默认逻辑的限制 - 该方案完全基于axlsx对外暴露的公共API实现,不需要修改源码,兼容性更强
内容的提问来源于stack exchange,提问作者knut
相关产品推荐
相关产品推荐

