• 全部
  • 互动交流
  • 文章分享

使用xlutils.copy.copy提示list index out of range

sj13155158153 2021-01-22 11:21:41
1. 使用开发工具为Visual Studio 2019,Python版本为3.7,扩展包版本如下图

2. 我这边有一个需求,在使用xlrd2读取一个Excel表格,然后使用xlutils.copy.copy功能编辑这个Excel,实现数据更新后重新保存这个Excel表格,表格式xls格式,问题是我在第一遍执行这个方法的时候,运行完全正常可以得到我想要的结果,但是执行第二遍时候就提示报错“list index out of range”

3. 我尝试修改了bk为bk1,xlrd2我也重新import一遍as xlrd22,然后使用xlrd22.open_workbook试了下,但是我检查参数的时候发现跟bk对象无关,在编程软件里我注意到bk已经完整的获取到表格数据了,所以我想问题出在copy方法上,但是完全不知道该如何修改来达到我的目的,没有任何头绪,,,excel大小是2445KB,总共12个sheet,求大佬们指点。

附上两段方法代码:
#结单量透视
def secondStepII():
bk = xlrd2.open_workbook("数据\\" + fileName + "二级.xls", formatting_info = True) # 打开文件
wt = xlutils.copy.copy(bk) # 复制
sh=bk.sheet_by_index(1) #使用wlrd读取sheet2
nrows=sh.nrows #获取行数
ncols=sh.ncols #获取列数
sheet = wt.get_sheet(7) # wlwt读取sheet8
# 向单元格写入内容
#sheet.write(0,0, "Test")
erjiList = []
for i in range(1,nrows):
erjiList.append(sh.cell_value(i,10))
dict = {}
for key in erjiList:
dict[key] = dict.get(key, 0) + 1
aa = 2;
bb = 0;
allCount = 0;
sheet.write(1,0,"二级名称")
sheet.write(1,1,"计数")
for i in dict:
sheet.write(aa,bb,i)
bb += 1
sheet.write(aa,bb,dict[i])
allCount += dict[i]
bb -= 1
aa += 1
aa += 1
sheet.write(aa,bb,"总计")
bb += 1
sheet.write(aa,bb,allCount)
wt.save("数据\\" + fileName + "二级.xls") # 保存


#积压量透视
def thirdStepII():
bk = xlrd2.open_workbook("数据\\" + fileName + "二级.xls", formatting_info = True) # 打开文件
wt = xlutils.copy.copy(bk) # 复制 PS:到这里开始报错了list index out of range
sh=bk.sheet_by_index(2) #使用wlrd读取sheet3
nrows=sh.nrows #获取行数
ncols=sh.ncols #获取列数
sheet = wt.get_sheet(8) # wlwt读取sheet9
# 向单元格写入内容
#sheet.write(0,0, "Test")
erjiList = []
for i in range(1,nrows):
erjiList.append(sh.cell_value(i,10))
dict = {}
for key in erjiList:
dict[key] = dict.get(key, 0) + 1
aa = 2;
bb = 0;
allCount = 0;
sheet.write(1,0,"二级名称")
sheet.write(1,1,"计数")
for i in dict:
sheet.write(aa,bb,i)
bb += 1
sheet.write(aa,bb,dict[i])
allCount += dict[i]
bb -= 1
aa += 1
aa += 1
sheet.write(aa,bb,"总计")
bb += 1
sheet.write(aa,bb,allCount)
wt.save("数据\\" + fileName + "二级.xls") # 保存
...全文
102 点赞 收藏 7
写回复
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
引用 6 楼 sj13155158153 的回复:
[quote=引用 4 楼 NoamaNelson 的回复:]是的,你使用了两个函数,每个函数都有对同一个excel打开-编辑-保存,这样就出问题了。 1、第一次打开-编辑-保存后,最好释放一下内存,比如bk.release_resources() 2、如果不释放,那么你第二个函数,这个时候再打开这个文件就会报错list index out of range,其实这个时候这个文件已经打开了,可以不用再打开 综上: 1、两个函数的话,第一个打开后释放,第二个函数再打开释放 2、把两个合再一起,其实就是一个函数,那么就是打开了一次而已,你运行完成后,解析器就自动释放内存了 本人博客:https://blog.csdn.net/NoamaNelson
额,我找不到在哪给分。[/quote] 你帖子的右小角,有个“结帖”的字样,进入后点击结帖给分就行了,哈哈哈
回复
引用 4 楼 NoamaNelson 的回复:
是的,你使用了两个函数,每个函数都有对同一个excel打开-编辑-保存,这样就出问题了。
1、第一次打开-编辑-保存后,最好释放一下内存,比如bk.release_resources()
2、如果不释放,那么你第二个函数,这个时候再打开这个文件就会报错list index out of range,其实这个时候这个文件已经打开了,可以不用再打开
综上:
1、两个函数的话,第一个打开后释放,第二个函数再打开释放
2、把两个合再一起,其实就是一个函数,那么就是打开了一次而已,你运行完成后,解析器就自动释放内存了

本人博客:https://blog.csdn.net/NoamaNelson


额,我找不到在哪给分。
回复
是这个情况,我之前找了下关于python如何释放对象的资料,但是可能搜索的方式不对,百度没找到,感谢指导。
回复
似乎也说不通,无论如何,这个excel表格本来就已经有十几个sheet了,那第一遍方法copy时候肯定就已经是10几个list了,不可能再执行一遍反而就不能保存十几个了吧,想不通。。。
回复
我测试到一种情况,我把两个方法执行的顺序调换了一下,先执行thirdStepII再执行secondStepII,这时候报错就出在secondStepII上了,报错内容依旧是out range,所以我在想是否是因为copy方法,只能存9个sheet页,超过九个就会出错?有大佬们知道要怎么做能不报错或者解决这个问题么。。。
回复
是的,你使用了两个函数,每个函数都有对同一个excel打开-编辑-保存,这样就出问题了。 1、第一次打开-编辑-保存后,最好释放一下内存,比如bk.release_resources() 2、如果不释放,那么你第二个函数,这个时候再打开这个文件就会报错list index out of range,其实这个时候这个文件已经打开了,可以不用再打开 综上: 1、两个函数的话,第一个打开后释放,第二个函数再打开释放 2、把两个合再一起,其实就是一个函数,那么就是打开了一次而已,你运行完成后,解析器就自动释放内存了 本人博客:https://blog.csdn.net/NoamaNelson
回复
目前问题已经解决了,我把两个方法合并到一块去了,copy过来后,直接修改所有的sheet,然后保存,没有出任何问题,猜测是copy完成以后,再次copy时,内容没有释放,还是保存在xlutils内存里,但是我查阅了官方API没找到哪里有清空的地方,不知道我的推测是不是正确的,有人来讨论么。。。初学Python 3天,碰到好多问题解决不了的,有大佬们知道哪里更活跃点吗。。。
回复
发帖
脚本语言
创建于2007-08-27

3.7w+

社区成员

JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
申请成为版主
帖子事件
创建了帖子
2021-01-22 11:21
社区公告

CSDN 脚本语言社区接受专栏投稿(专栏会在顶部创建专属你的栏目),投稿需满足以下要求:

  • 脚本语言技术相关;
  • 文章持续更新,保持活跃;
  • 内容清晰明了,干货为主;
  • 文章排版有序,有条有理。

本社区开通招聘专栏,发布招聘信息请联系版主,发布者需要保证招聘信息真实有效,CSDN 平台和版主不对招聘内容负责!

联系方式:私聊版主、发送邮件、QQ联系等均可: