0

我正在尝试使用 Roo gem 从 Excel 电子表格中读取 DateTime 对象。我能够成功读取格式为 *3/14/15 类型的日期的单元格(星号表示格式基于我的区域日期和时间设置)。当我在cell_type导入这些单元格时检查它们的类型时,类型是[:numeric_or_formula, "mm-dd-yy"]. 我希望这些具有 的类型[:datetime],但我仍然能够从cell.formatted_value.

当我尝试读取格式为日期类型为 3/14/15(即格式不基于区域日期和时间设置)或 3/14/15 13:30 的单元格时,我知道cell_type[:numeric_or_formula, "m/d/yy;@"]. 当我打电话时,cell.formatted_value我得到"0/d/yy;@".

有什么方法可以格式化我的 excel 单元格,以便 Roo 将它们读取为 type :datetime?如果不是,为什么 Roo 创建的单元格类型取决于区域日期和时间设置?

作为参考,这是我现在用于从电子表格中读取单元格的代码:

xlsx = Roo::Spreadsheet.open(self.file)

raw_key_list = xlsx.sheet('index_upload').row(4)
key_list = raw_key_list[4..raw_key_list.length].compact

xlsx.sheet('index_upload').each_row_streaming(offset: 6, pad_cells: true) do |row|

  key_list.each_with_index do |key, idx|

    next unless row[idx + 4].try(:cell_value)

    if row[idx + 4].cell_type == [:numeric_or_formula, "mm-dd-yy"]
      context_lookup.context_value_date = row[idx + 4].formatted_value
    end
  end
end
4

1 回答 1

1

看起来我可以通过检查class而不是更好地确定单元格的类型cell_type。同样对于我设置的值,我发现使用value单元格而不是formatted_value- 它返回 DateTime 对象本身而不是 DateTime 的格式化字符串。

这是代码现在的样子:

xlsx = Roo::Spreadsheet.open(self.file)

raw_key_list = xlsx.sheet('index_upload').row(4)
key_list = raw_key_list[4..raw_key_list.length].compact

xlsx.sheet('index_upload').each_row_streaming(offset: 6, pad_cells: true) do |row|
key_list.each_with_index do |key, idx|

      next unless row[idx + 4].try(:cell_value)

      if row[idx + 4].class == Roo::Excelx::Cell::DateTime
        context_lookup.context_value_date = row[idx + 4].value
      end
end
于 2017-05-30T22:39:55.757 回答