RubyGems axlsx创建一个表示时间的单元格列表,并以编程方式添加它

时间:2017-01-05 20:09:08

标签: ruby-on-rails ruby excel axlsx

我会尽量简化这个问题。我正在使用axlsx生成一个xls文件,并且在文件中有一个列,表示使用此格式的任务的长度[h]:mm:ss

我希望单元格具有该格式,并且在最后一行中我想添加列的所有行。这是xls的模板

wb = xlsx_package.workbook
wb.add_worksheet(name: "Length") do |sheet|
  time = wb.styles.add_style :num_fmt => 46

  sheet.add_row [
    "Length"
  ], :style => title
  @tasks.each do |task|
      sheet.add_row [
        Time.at(task.duration*60).utc.strftime("%k:%M:%S").strip
      ], :style => [
        time
      ]
  end
  range_amount = "D2:D#{@tasks.size+1}"
  sheet.add_row ["=SUM(#{range_amount})"], :style => [time]
end

我遇到的问题是

在LibreOffice中,时间单元格在开始时(在时间之前)添加此字符',例如'0:50:00,因此显然格式不正确。

如果我将文件上传到oneDrive,我没有那个新角色。单元格具有此格式[h]:mm:ss。但是我无法对范围求和,最后一个单元格的值为=SUM(D2:D174),但显示为0,如果我将格式更改为[h]:mm:ss,则更改为0:00:00 < / p>

谢谢

1 个答案:

答案 0 :(得分:0)

我的错误是试图操纵字符串作为时间,这是我解决的方法

wb = xlsx_package.workbook
wb.add_worksheet(name: "Length") do |sheet|
  time_title = sheet.styles.add_style(:bg_color => "55FF0000", :fg_color=>"FFFFFFFF", :border=>Axlsx::STYLE_THIN_BORDER, :alignment=>{:horizontal => :center}, :num_fmt => 46)
  time = wb.styles.add_style :num_fmt => 20

  sheet.add_row [
    "Length"
  ], :style => title
  @tasks.each do |task|
      sheet.add_row [
        "=#{task.duration}/1440"
      ], :style => [
        time
      ]
  end
  range_amount = "D2:D#{@tasks.size+1}"
  sheet.add_row ["=SUM(#{range_amount})", :style => [time_title]
end

我希望对其他人有帮助