背景-原代码如下,期望能自动创建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')

												

python编辑已存在的excel坑: BadZipFile: File is not a zip file的更多相关文章

  1. python中使用openpyxl模块时报错: File is not a zip file

    python中使用openpyxl模块时报错: File is not a zip file. 最大的原因就是不是真正的 xlsx文件, 如果是通过 库xlwt  新建的文件,或者是通过自己修改后缀名 ...

  2. zipfile.BadZipFile: File is not a zip file

    zipfile.BadZipFile: File is not a zip file 出现这个问题一般是文件损坏的可能性比较大

  3. 使用openpyxl模块时出现错误: zipfile.BadZipFile: File is not a zip file

    通过Pycharm工具新建一个xlsx文件. 再通过openpyxl模块读取该表时,报错: zipfile.BadZipFile: File is not a zip file 如下所示: 解决办法: ...

  4. Python常见报错 - 使用openpyxl模块时出现错误: zipfile.BadZipFile: File is not a zip file

    背景 在pycharm项目下,有一个data.xlsx,主要用来存放接口测试用例数据的 要通过openpyxl库去读取data.xlsx,方法: openpyxl.load_workbook(path ...

  5. 基于Python的接口自动化-读写excel文件

    引言 使用python进行接口测试时常常需要接口用例测试数据.断言接口功能.验证接口响应状态等,如果大量的接口测试用例脚本都将接口测试用例数据写在脚本文件中,这样写出来整个接口测试用例脚本代码将看起来 ...

  6. NPOI 2.0 教程(二):编辑既存的EXCEL文件

    NPOI 2.0 教程(二):编辑既存的EXCEL文件 分类: C#技术 2014-03-11 15:40 993人阅读 评论(3) 收藏 举报 c#excelNPOI 转载请注明出处 http:// ...

  7. bootstrap-fileinput上传文件的插件使用总结----编辑已成功上传过的图片

    http://plugins.krajee.com/file-plugin-methods-demo 具体操作 http://plugins.krajee.com/file-preview-manag ...

  8. pd.ExcelWriter(to_excel)保存结果到已存在的excel文件中

    网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...

  9. 用Python的pandas框架操作Excel文件中的数据教程

    用Python的pandas框架操作Excel文件中的数据教程 本文的目的,是向您展示如何使用pandas 来执行一些常见的Excel任务.有些例子比较琐碎,但我觉得展示这些简单的东西与那些你可以在其 ...

随机推荐

  1. MyBatis bind标签的用法

    From<MyBatis从入门到精通> <!-- 4.5 bind用法 bind标签可以使用OGNL表达式创建一个变量并将其绑定到上下文中. 需求: concat函数连接字符串,在M ...

  2. kali linux上安装ssh

    1.暂停kali上的ssh进程 root@kali:~# sudo stop ssh 2.卸载ssh服务 root@kali:~# apt-get remove openssh-server 这里可能 ...

  3. 【CYH-02】NOIp考砸后虐题赛:成绩:题解

    这道题挺送水了吧... 两种做法. 其实空间都不需要那么大,我来提交界面一看一堆MLE的,于是还是良心的放开了时限. 这么简单,就不做解释了. 下面放出几种代码. 代码: 两个数组: #include ...

  4. [leetcode] 17. Letter Combinations of a Phone Number (medium)

    递归DFS class Solution { Map<Character, String> mapping = new HashMap<>(); public List< ...

  5. JavaScript数组高性能去重解决方案

    在大多数的人眼里,数组去重是一个很简单的课题,很多人甚至熟练掌握了多种数组去重的方法,然而大多时候,我们却忽略了数组去重所消耗的时间资源.譬如我们在做前端性能优化的时候,又有多少人会考虑JavaScr ...

  6. C# ORM简单原理

    对象/关系数据库映射(object/relational mapping,ORM)这个术语表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去. 在今日的企业环境中,把面向对象 ...

  7. 小白学python-day05(2)-列表及其操作

    今天是day05(2),以下是学习总结 但行努力,莫问前程. --------------------------------------------------------------------- ...

  8. mysql查看视图用户

    select `DEFINER` from  information_schema.VIEWS;

  9. linux初学者-输出输入管理

      1.输出重定向 在linux中,因为用户的权限不同,所以访问某些文件或者目录会被拒绝而形成错误输出,这些错误的输出也会显示出来.一般正确输出的编号为1,错误输出的编号为2.如下图,在普通用户stu ...

  10. 必懂的wenpack优化

    webpack优化 1.production 模式打包自带优化 tree shaking tree shaking是一个术语.通常用于打包时移除js中未引用的代码(dead-code),它依赖于ES6 ...