2012-11-30 42 views
3

時,不承擔文本的數量大約有如何從文本解讀爲一個數字,或者如何輸出數字格式與openpyxl停止Excel的許多問題,但我還沒有看到這個問題的任何溶液:openpyxl請輸入

我有別人給我的Excel電子表格,所以我沒有創建它。當我用Excel打開文件時,我有一些特定的值,如「5E12」(克隆號,如果有人在意)顯示正確顯示,但每個旁邊都有一個綠色箭頭,警告我「這似乎是一個數字存儲爲文本「。 Excel然後問我是否想將它轉換爲數字,如果我看到是,我得到5000000000000,然後自動轉換爲科學記數法並再次顯示5E12,只有這一次文本輸出將顯示滿零的完整數字。請注意,在轉換之前,這確實是文本,即使是Excel,我也只會被警告/提供將其轉換。

因此,當使用openpyxl(從openpyxl.reader.excel導入load_workbook)讀取此文件時,5E12會自動轉換爲5000000000000.我假設openpyxl使用與Excel相同的假設,只有轉換髮生沒有提示或輸入我的部分。

我該如何防止這種情況發生?我不希望看起來像「存儲爲文本的數字」的文本轉換爲數字。除非我這麼說,否則它們是文字。

到目前爲止,我已經找到了唯一的解決辦法是將單引號添加到每個單元的前面,但是這不是一個理想的解決方案,因爲它是手工勞動,而不是編程解決方案。此外,解決方案需要是一般的,因爲我並不總是知道這個問題可能發生的地方(我每天讀數百萬行,所以我不想手工做任何事情)。

認爲這是openpyxl問題。從2011年開始有一個谷歌小組討論提到了這個問題,但是認爲它太稀罕無關緊要了。 https://groups.google.com/forum/?fromgroups=#!topic/openpyxl-users/HZfpShMp8Tk

那麼,有什麼建議?

+0

您是否必須*寫入*到XLSX文件以及讀取它們?如果沒有,你可能想看看'xlrd',它讀取XLS和XLSX文件,並且更好地保存它找到的任何數據類型。 –

+0

@John謝謝 - 這正是我所需要的。 xlrd自從我第一次開始這個項目以來已經有所改進,所以即使這並不能回答我的實際問題,但它確實解決了我的問題,即轉儲openpyxl並切換到xlrd。 (編輯:它確實回答我的問題「我如何防止這種情況發生」,它只是沒有解決如何與openpyxl做這個問題,如果其他人仍然想知道) – Dannid

回答

5

如果您想再次使用openpyxl(無論何種原因),到工作表讀者例行以下更改做保持字符串作爲字符串的絕招:

DIFF --git A/openpyxl /讀卡器/工作表的.py b/openpyxl /讀取器/ worksheet.py

--- a/openpyxl/reader/worksheet.py 
+++ b/openpyxl/reader/worksheet.py 
@@ -134,8 +134,10 @@ 
      data_type = element.get('t', 'n') 
      if data_type == Cell.TYPE_STRING: 
       value = string_table.get(int(value)) 
- 
-   ws.cell(coordinate).value = value 
+    ws.cell(coordinate).set_value_explicit(value=value, 
+            data_type=Cell.TYPE_STRING) 
+   else: 
+    ws.cell(coordinate).value = value 

     # to avoid memory exhaustion, clear the item after use 
     element.clear() 

Cell.value是一個屬性和分配呼叫Cell._set_value,然後做一個Cell.bind_value其中根據本方法的doc:「給定的值,推斷類型和顯示選項」。由於這些值的類型都在XML文件中,因此應該採取這些措施(這裏我只對字符串做),而不是做一些「聰明」的事情。

正如你可以從代碼中看到,測試它是否是一個字符串已經在那裏了。

+0

謝謝,xlrd正在爲我工​​作,但我很高興看到一個openpyxl解決方案。如果我有機會並留下我的反饋,我會測試它。 – Dannid