Я постараюсь максимально упростить вопрос. Я создаю файл xls с помощью axlsx, и внутри файла есть столбец, представляющий длину задачи в этом формате [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

Спасибо

0
agusgambina 5 Янв 2017 в 23:09
1
Поскольку вы форматируете с помощью strftime, я думаю, что у вас есть настоящая строка, а не дата, которая внутренне является целым числом. Вы можете попробовать не конвертировать его.
 – 
noel
6 Янв 2017 в 05:00
Спасибо @noel, ваш комментарий привел меня к ответу
 – 
agusgambina
8 Янв 2017 в 05:44

1 ответ

Лучший ответ

Моя ошибка заключалась в попытке манипулировать строками как временем, вот как я решил

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

Я надеюсь, что это поможет кому-то другому

0
agusgambina 8 Янв 2017 в 05:49