2017-05-30 144 views
0

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

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

是否有任何方式来格式化我的Excel单元格,以便他们将被Roo读取为: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 
+0

我想'在Excel cell_type's仅限于'l'的标签(即文本),'N'为数字(或公式),或'b'表示空白单元格。就Excel而言,日期确实只是以特定方式格式化的数字。 – Skippy

回答

0

貌似我可以更好地通过检查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 
相关问题