2017-05-30 147 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 
相關問題