背景-原代碼如下,期望能自動創建excel,並且可以反復調用編輯:
import xlwt,os
from openpyxl.styles import Font, colors
class Write_excel(object):
"""修改excel數據"""
def __init__(self, filename):
self.filename = filename
def write(self, row_n, col_n, value):
wb=xlwt.Workbook()
sh=wb.add_sheet('Sheet1',cell_overwrite_ok=True)
red_style = xlwt.easyxf("font:colour_index red;")
green_style = xlwt.easyxf("font:colour_index green;")
# 判斷值為錯誤時添加字體樣式
if value in ['FAIL', 'ERROR'] or col_n == 12:
sh.write(row_n - 1, col_n - 1, value, red_style)
elif value == 'PASS':
ft = Font(color=colors.GREEN)
sh.write(row_n - 1, col_n - 1, value, green_style)
else:
sh.write(row_n - 1, col_n - 1, value)
wb.save(self.filename)
if __name__ == "__main__":
wt = Write_excel("test111.xlsx")
wt.write(1, 1, "FAIL")
wt.write(2, 1, "PASS")
邏輯:使用xlwt模塊創建excel,然后編輯內容,保存。
實際結果:僅保留最后一次寫入結果。前一次的寫入結果未能保存延續下來。
嘗試調整方案-解決思路:創建excel前加入判斷os.path.exsits(file_name),表格已存在時直接打開編輯,不存在時才創建。
def write(i,j,value,filename): if not os.path.exists(filename): wbk = xlwt.Workbook() sheet = wbk.add_sheet('sheet 1') sheet.write(i,j,value) wbk.save(filename) else: wb=load_workbook(filename) sh =wb['Sheet1'] sh.cell(i,j).value=value wb.save(filename) write(1,1,'test text','test111.xlsx') write(2,1,'test text','test111.xlsx')
實際結果報錯:zipfile.BadZipFile: File is not a zip file,反復嘗試過程中發現,我們在代碼里創建的excel打開顯示受損無法再次編輯,而在路徑下手動創建的test111.xlsx就不會有這個問題。百度了下,搜索內容也不少,估計新手小白都碰到過。
為了能反復編輯已存在的excel文件並保存,需要xlwt、xlrd、xlutils組合起來使用,代碼如下:
import xlwt,os,xlrd from xlutils.copy import copy class Do_Excel: def __init__(self,filename,sheetname='Sheet1'): self.filename=filename self.sheetname=sheetname
#讀取excel,該部分可忽略 def excel_read(self,x, y): data = xlrd.open_workbook(self.filename) table = data.sheet_by_name(self.sheetname) return table.cell(x, y).value
#判斷excel文件是否存在,不存在則創建,存在則直接打開編輯 def excel_create(self): if not os.path.exists(self.filename): data = xlwt.Workbook() table = data.add_sheet(self.sheetname) table.write(0, 0, 'id') data.save(self.filename)
#綜合xlwt/xlrd/xlutils.copy,讀寫excel
def write(self,i,j,value):
self.excel_create()
rb = xlrd.open_workbook(self.filename)
wb = copy(rb) #管道作用,通過get_sheet()獲取的sheet有write()方法
ws = wb.get_sheet(0) #1代表是寫到第幾個工作表里,從0開始算是第一個。
ws.write(i, j, value) wb.save(self.filename)
Do_Excel('test111.xlsx').write(1,1,'sdcds')
Do_Excel('test111.xlsx').write(1,2,'ewewe')
再嘗試多次調用,就都能寫入保存成功了。
解決辦法二:直接使用openpyxl的Workbook和load_workbook,簡單直接
rom openpyxl import Workbook,load_workbook import os class Do_Excel: def __init__(self,filename,sheetname='Sheet1'): self.filename=filename self.sheetname=sheetname def write(self,i,j,value): if not os.path.exists(self.filename): wb = Workbook() sh = wb.create_sheet(self.sheetname) else: wb = load_workbook(self.filename) sh = wb[self.sheetname] sh.cell(i,j).value=value wb.save(self.filename) Do_Excel('test222.xlsx').write(1,1,'sdcds') Do_Excel('test222.xlsx').write(1,2,'change') Do_Excel('test222.xlsx').write(3,2,'pass')