2015-03-31 241 views
0

我一直在使用openpyxl將一些數據寫入已經存在的Excel文件,我發現它非常友好和簡單。 但是,昨天事情開始出現問題。Openpyxl損壞了我的Excel文件,現在丟失了?

我的Python代碼加載的excel文件在A2,B2,C2,e.t.c中有一些標題。並且代碼在每列之下打印一些數據。

下午我跑了代碼(我一直在運行它,做了大量的試驗和錯誤),它的工作方式與希望完全一樣,除了Excel文件各個表格中的幾列已經神祕地消失了。這是因爲某些列(主要是有數據的地方)由於某種原因已被最小化爲0像素寬,並且一旦我再次擴大了列的範圍,所有事情都應該如此。代碼沒有觸及其中一列已經被最小化的列表。不知道這是否相關,但發現它很奇怪,所以我想加入它。

然後在晚上,我再次運行代碼,試用了我添加的一些新功能。它看起來要被罰款的工作,但是當它在年底到了.save()命令時,它拋出了所有這些錯誤:


Traceback (most recent call last): 
File "whoscored_scraper.py", line 239, in <module> 
wb2.save("WhoscoredDatabase.xlsx") 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\workbook\workbook.py", l 
ine 296, in save 
save_workbook(self, filename) 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\writer\excel.py", line 1 
91, in save_workbook 
writer.save(filename, as_template=as_template) 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\writer\excel.py", line 1 
74, in save 
self.write_data(archive, as_template=as_template) 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\writer\excel.py", line 8 
5, in write_data 
self._write_worksheets(archive) 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\writer\excel.py", line 1 
11, in _write_worksheets 
write_worksheet(sheet, self.workbook.shared_strings, 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\writer\worksheet.py", li 
ne 299, in write_worksheet 
xf.write(comments) 
File "C:\Users\SamH\Documents\Betting\Python\lib\contextlib.py", line 24, in _ 
_exit__ 
self.gen.next() 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\xml\xmlfile.py", line 51 
, in element 
self._write_element(el) 
File "C:\Users\SamH\Documents\Betting\Python\openpyxl\xml\xmlfile.py", line 78 
, in _write_element 
xml = tostring(element) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 1126, in tostring 
ElementTree(element).write(file, encoding, method=method) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 820, in write 
serialize(write, self._root, encoding, qnames, namespaces) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 939, in _serialize_xml 
_serialize_xml(write, e, encoding, qnames, None) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 939, in _serialize_xml 
_serialize_xml(write, e, encoding, qnames, None) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 932, in _serialize_xml 
v = _escape_attrib(v, encoding) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 1092, in _escape_attrib 
_raise_serialization_error(text) 
File "C:\Users\SamH\Documents\Betting\Python\lib\xml\etree\ElementTree.py", li 
ne 1052, in _raise_serialization_error 
"cannot serialize %r (type %s)" % (text, type(text).__name__) 
TypeError: cannot serialize 7L (type long) 

我的代碼是很長,所以下面是一些涉及openpyxl該行:


from openpyxl import workbook 
from openpyxl import load_workbook 
wb2 = load_workbook('filename.xlsx') 
ws = wb2["Shots_and_Goals"] 
ws4 = wb2["Assorted"] 
ws2 = wb2["On_Target"] 

def HomeTeam(string): 
    HomeTeam_cell = 「c」 + str(3) 
    ws[str(HomeTeam_cell)] = Home_Team #Home_Team is some variable 

def Home_Shot_Minutes(string): 
    for num in range (0, 10): 
     cell = column_titles[num+10] + str(3)] #column_titles is just a list 
     ws[str(cell)] = int(shot_count_for_that_minute) #shot_count_for_that_minute is variable defined above 

HomeTeam(data) 
Home_Shot_Minutes(data) 
Wb2.save(「filename.xlsx」) 

有更多的代碼行與上面列出的基本相同。在此之前,一切都一直在正常工作。

當我嘗試打開新保存的文件時,它說Excel發現了不可讀的內容 當我說我想恢復不可讀的內容時,除了表格名稱之外,我的新Excel文件是完全空白的。

我知道這是一個愚蠢的決定,不保存文件作爲不同的文件名,那麼這將意味着我不必重拍我的整個Excel文件!

有人明白這裏出了什麼問題嗎?

回答

0

不幸的是,由於原始文件被覆蓋,數據丟失。

請用原始文件提交一份錯誤報告,以便我們進行調查。很明顯,錯誤來自哪裏,但我們需要原始數據來重現它。

在此期間,我懷疑如果安裝lxml,問題不太可能發生。

+0

嗨,抱歉密集,但我不知道如何產生與原始文件的錯誤報告?這是對excel文件的修復: 刪除記錄:從/xl/workbook.xml部分(Workbook)工作表屬性 SamH123 2015-03-31 14:31:22

+0

轉到錯誤跟蹤器:https://bitbucket.org/openpyxl/openpyxl/overview 不幸的是,Excel的修復通知毫無幫助。損壞的文件不會有太大的幫助,因爲它缺少文本項目列表。 – 2015-03-31 18:08:41

+0

好的謝謝,損壞的文件似乎是一個關閉,我一直無法重複錯誤,但我的代碼似乎仍然是設置列的負載爲0寬度,我不得不再次展開它們。任何想法爲什麼這可能會發生? – SamH123 2015-04-03 15:05:17