2011-12-17 64 views
5

我正在嘗試使用xlrd從Excel文件中讀取值。它在日期,數字和直到現在的文本方面都做得很好。我有一個包含文本的單元格(類別)(單元格被格式化爲文本)。當我打印出單元格值時,會顯示一個浮點數而不是文本。我還打印出要檢查的Cell對象的ctype,並將其顯示爲Number。我已閱讀了xlrd的文檔和教程,似乎無法找到發生這種情況的原因。難道是我的excel文件被搞亂了嗎?任何建議或指向正確的方向?python xlrd從excel文本單元中接收浮點數

import xlrd 
import datetime 

workbook = xlrd.open_workbook('training.xls') 
courseSheet = workbook.sheet_by_index(0) 

for row in range(courseSheet.nrows): 
    title = courseSheet.cell_value(row, 2) 
    date = courseSheet.cell_value(row, 4) 
    date = datetime.datetime(*xlrd.xldate_as_tuple(date, workbook.datemode)) 
    dateTuple = date.timetuple() 
    category = courseSheet.cell_value(row, 7) 
    print category 
+0

第7列單元格的「cell.ctype」是什麼? – 2011-12-17 07:31:42

+0

我應該如何閱讀您的發佈代碼以瞭解您的問題?你怎麼知道這是一個浮動?從「打印類別」打印輸出? – joaquin 2011-12-17 11:02:06

+0

@MikePennington細胞在7列ctype數是xlrd.XL_CELL_NUMBER。我只是不確定爲什麼xlrd正在讀取文本單元格。 – binaryFever 2011-12-17 18:33:57

回答

3

背景:對於每個單元格,xlrd報告存儲在XLS文件中的內在值(如果有的話)。值類型最初僅根據文件中的記錄類型分配(例如,NUMBER和RK記錄包含浮點數)。它將here中描述的格式進行分類,並使用該信息覆蓋值類型,其中顯而易見的是日期時間,日期或時間,而不是數字。 xlrd並不聲稱能夠根據歸於單元格的格式來渲染單元格值。

有問題的單元顯然是作爲數字輸入的。如果他們已經應用了文本格式,那不會使它們成爲「文本單元格」。

你說「」「當我打印出單元格值時,會顯示一個浮點數而不是文本」「」......請給出一些(a)創建文件時鍵入單元格的示例b)什麼是「細胞被格式化爲文本」的證據(c)什麼是repr(cell.value)(d)什麼是您希望顯示的「文本」?

您可能會發現下面的代碼有用:

import xlrd, sys 

def dump_cell(sheet, rowx, colx): 
    c = sheet.cell(rowx, colx) 
    xf = sheet.book.xf_list[c.xf_index] 
    fmt_obj = sheet.book.format_map[xf.format_key] 
    print rowx, colx, repr(c.value), c.ctype, \ 
     fmt_obj.type, fmt_obj.format_key, fmt_obj.format_str 

book = xlrd.open_workbook(sys.argv[1], formatting_info=1) 
sheet = book.sheet_by_index(0) 
for rowx in xrange(sheet.nrows): 
    for colx in xrange(sheet.ncols): 
     dump_cell(sheet, rowx, colx) 
0

我有同樣的問題,因爲OP,我想我已經得出結論,有情況下,有蟒無解(xlrd )方。數據最初是如何輸入到Excel表格中的。具體來說,如果數據輸入到已經應用了正確的「文本」格式的單元格中,或者數據是以默認的「常規」格式輸入到單元格中的,然後單元格格式更改爲「數據輸入後的文本。

如果你將數據輸入到一個預先格式化的細胞,你的數字數據將使用Excel警告打勾表示你在格式化文本的單元格有數字數據進行標記。在這種情況下,xlrd將按照您的預期處理數據 - 返回字符串,因爲它出現在Excel工作表中。 (例如,excel中的單元格內容爲「1」,xlrd將返回「1」作爲單元格值)

但是,如果在輸入數字數據後更改單元格的格式,則最終會在excel中的數據顯示爲「1」的情況下,但xlrd將返回單元格值「1.0」。如果您檢查此單元格的xlrd cell.ctype,您將看到該單元格仍被視爲數字,即使格式已更改爲Excel中的文本。

一個可能的解決方案可能是讓你的excel字符串數據被引號包圍。這將禁止excel從一開始就將數據視爲數值。

相關問題