python編輯已存在的excel坑: BadZipFile: File is not a zip file


背景-原代碼如下,期望能自動創建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')

 

 
        
 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM