• 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')
    
    
    
    
  • 相关阅读:
    JavaScript 类型转换 Type Convertion
    JavaScript 对象 Object
    Git失误操作导致文件冲突、路径错误
    Swift 3.0统计缓存并清理-----(斯威夫特3.0 坑爹之获取文件大小)
    iOS ——屏幕截图
    iOS 控件设置虚线
    Swift_单例的打开方式
    第三方接入小记
    图片自定义圆角
    自定义搜索框-输入框光标不贴边
  • 原文地址:https://www.cnblogs.com/qingyuu/p/10642249.html
Copyright © 2020-2023  润新知