2017-08-09 48 views
0

使用python打開現有的excel文件並進行格式設置並保存並關閉文件。我的代碼在文件大小很小時運行良好,但是當excel大小很大時(約40MB)我得到序列化I/O錯誤,並確定由於內存問題或由於我的代碼。請幫助。保存Excel文件時發生I/O錯誤 - Python

系統配置:

RAM - 8 GB 32 - 位操作 的Windows 7

代碼:

import numpy as np 
from openpyxl import load_workbook 
from openpyxl.styles import colors, Font 


dest_loc='/Users/abdulr06/Documents/Python Scripts/' 

np.seterr(divide='ignore', invalid='ignore') 

SRC='TSYS' 
YM1='201707' 

dest_file=dest_loc+SRC+'_'+''+YM1+'.xlsx' 

sheetname = [SRC+''+' GL-Recon'] 


#Following code is common for rest of the sourc systems 
wb=load_workbook(dest_file) 

fmtB=Font(color=colors.BLUE) 
fmtR=Font(color=colors.RED) 

for i in range(len(sheetname)):    

    sheet1=wb.get_sheet_by_name(sheetname[i])    
    print(sheetname[i]) 

    last_record=sheet1.max_row+1 

    for m in range(2,last_record): 
     if -30 <= sheet1.cell(row=m,column=5).value <=30:   
      ft=sheet1.cell(row=m,column=5) 
      ft.font=fmtB 
      ft.number_format = '_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)' 
      ft1=sheet1.cell(row=m,column=6) 
      ft1.number_format = '0.00%' 
     else:   
      ft=sheet1.cell(row=m,column=5) 
      ft.font=fmtR 
      ft.number_format = '_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)' 
      ft1=sheet1.cell(row=m,column=6) 
      ft1.number_format = '0.00%' 
wb.save(filename=dest_file) 

例外:

Traceback (most recent call last): 

    File "<ipython-input-17-fc16d9a46046>", line 6, in <module> 
    wb.save(filename=dest_file) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\workbook\workbook.py", line 263, in save 
    save_workbook(self, filename) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 239, in save_workbook 
    writer.save(filename, as_template=as_template) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 222, in save 
    self.write_data(archive, as_template=as_template) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 80, in write_data 
    self._write_worksheets(archive) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\writer\excel.py", line 163, in _write_worksheets 
    xml = sheet._write(self.workbook.shared_strings) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\worksheet\worksheet.py", line 776, in _write 
    return write_worksheet(self, shared_strings) 

    File "C:\Users\abdulr06\AppData\Local\Continuum\Anaconda3\lib\site-packages\openpyxl\writer\worksheet.py", line 263, in write_worksheet 
    xf.write(worksheet.page_breaks.to_tree()) 

    File "serializer.pxi", line 1016, in lxml.etree._FileWriterElement.__exit__ (src\lxml\lxml.etree.c:141944) 

    File "serializer.pxi", line 904, in lxml.etree._IncrementalFileWriter._write_end_element (src\lxml\lxml.etree.c:140137) 

    File "serializer.pxi", line 999, in lxml.etree._IncrementalFileWriter._handle_error (src\lxml\lxml.etree.c:141630) 

    File "serializer.pxi", line 195, in lxml.etree._raiseSerialisationError (src\lxml\lxml.etree.c:131006) 

SerialisationError: IO_WRITE 
+2

可以添加堆棧跟蹤嗎? –

+0

我已添加,請檢查。 – Riyaz

回答

0

爲什麼你分配字體在每個循環?

​​

或紅色,創建兩個字體紅色和藍色的,一次,然後用它,每次你分配字體時,你正在使用更多的內存。

首先優化你的代碼。更少的代碼->更少的錯誤,例如:

mycell = sheet1.cell(row=m,column=5)  
if -30 <= mycell.value <=30: 
    mycell.font = redfont 

這將確保你不會再有問題(希望)

+0

我已經嘗試過,但沒有運氣,我正在訪問的工作表幾乎不包含任何數據(4列和35行)。 – Riyaz

+0

您可以發佈優化版本嗎? – sancelot

+0

已發佈優化版本。是的,你說的是有道理的。減少代碼 - >減少錯誤。 – Riyaz