ruby导出含格式和下拉列表(支持超长下拉)的excel文件

require 'write_xlsx'

def test_excel
  path = './test.xlsx'
# 按列来分
  data = [
      {t: '名称'},
      {t: '类型', l: %W{单品 套餐}},
      {t: '编号'},
      {t: '库存', v: {validate: 'integer', criteria: '>', value: -1}},
      {t: '原价', v: {validate: 'decimal', criteria: '>', value: 0}},
      {t: '售价', v: {validate: 'decimal', criteria: '>', value: 0}},
      {t: '上市时间', v: {validate: 'date', criteria: '>', value: '1900-01-01T'}},
      {t: '批文号'},
      {t: '商品简介'},
      {t: '商品详情'},
  ]
# 创建excel及表
  data_to_excel(path, data)
end

# 创建一个选择项的列
# d_sheet:创建列的表,h_sheet:隐藏的表,col_num:列序号
# h_col_num:选项列表在隐藏表中的列序号,title:列标题,select_list:选择项列表
# {d_sheet:,h_sheet:,col_num:,h_col_num:,title:,select_list:}
# return 表的下一个空列的序号,隐藏表的下一列空列的序号
def create_selection_col(*arges)
  arge = arges.first
  d_sheet, h_sheet, col_num, h_col_num, title, select_list = arge[:d_sheet], arge[:h_sheet], arge[:col_num], arge[:h_col_num], arge[:title], arge[:select_list]
  h_col = num_to_col(h_col_num)
  h_sheet.write_col("#{h_col}1", select_list)
  create_col_title(d_sheet, col_num, title)
  add_validation_to_col(d_sheet, col_num, {
      validate: 'list',
      ignore_blank: 0,
      source: "=#{h_sheet.name}!$#{h_col}$1:$#{h_col}$#{select_list.length}"
  })
  [col_num + 1, h_col_num + 1]
end

# 创建列标题
# d_sheet:表对象   col_num:列index   title:列标题
def create_col_title(d_sheet, col_num, title)
  col = num_to_col(col_num)
  d_sheet.write("#{col}1", title)
  d_sheet.data_validation(0, col_num, {validate: 'list', source: [title], dropdown: 0, ignore_blank: 0})
end

# 列字母转列序号
def col_to_num(col)
  col =~ /([A-Z]{1,3})/
  chars = col.split(//)
  expn, num = 0, 0
  chars.reverse.each do |char|
    num += (char.ord - 'A'.ord + 1) * (26 ** expn)
    expn += 1
  end
  # 在上边会多算一格(因为必须从1开始计算,否则AAA算出来是0)
  num - 1
end

# 列序号转列字母
def num_to_col(col)
  ColName.instance.col_str(col)
end

# 将数据转化成excel
def data_to_excel(path, data)
  raise('生成excel的路径不能为空') unless path
  # 创建excel及表
  workbook  = WriteXLSX.new(path)
  wt1 = workbook.add_worksheet
  total_col = num_to_col(data.length)
  wt1.set_column("A:#{total_col}", 15)
  hide_sheet = workbook.add_worksheet
  hide_sheet.hide
  # 表内容col_num列序号,h_col_num隐藏列序号
  col_num, h_col_num = 0, 0
  # 生成模板
  data.each do |col_json|
    if col_json[:l]
      col_num, h_col_num = create_selection_col(d_sheet: wt1, h_sheet: hide_sheet,col_num: col_num,h_col_num: h_col_num,title: col_json[:t],select_list: col_json[:l])
    else
      create_col_title(wt1, col_num, col_json[:t])
      add_validation_to_col(wt1, col_num, col_json[:v]) if col_json[:v]
      col_num += 1
    end
  end
  workbook.close
end

# 给某列加条件限制
def add_validation_to_col(d_sheet, col_num, validation)
  (1..500).each do |j|
    d_sheet.data_validation(j, col_num, validation)
  end
end


test_excel

转载于:https://my.oschina.net/lovelyBoy/blog/834703

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值