鱼C论坛

 找回密码
 立即注册
查看: 2067|回复: 8

for循环后不往下执行

[复制链接]
发表于 2023-9-9 20:58:01 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
程序只运行至合并单元表,到后面保存合并后的文档部分就不走了,请大神看看哪里出了问题
import easygui as eg
import xlwings as xw
from pathlib import Path
app = xw.App(visible=True, add_book=False)
workbook1 = app.books.add()
worksheet1 = workbook1.sheets[0]
# folder_path = Path(r'D:\验工')
folder_path = Path(eg.diropenbox(msg=None, title=None, default=None))
file_list = folder_path.glob('*.xlsx')
a = input("请输入你要合并的工作表(工作表1输入0,工作表2输入1):")
for i in file_list:
    workbook2 = app.books.open(i)
    worksheet2 = workbook2.sheets[int(a)] 
    worksheet2.copy(after=worksheet1)
    workbook2.close()
worksheet1.delete()
workbook1.save(eg.filesavebox(msg= None, title=None, default='*.xlsx', filetypes=None))
workbook1.close()
app.quit()

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-9 20:58:08 | 显示全部楼层
可能是因为在循环中打开的工作簿没有被关闭导致的。建议在每次循环结束时关闭工作簿,可以在循环中添加  workbook2.close()  语句。另外,可以在程序末尾添加  worksheet1.autofit()  语句来自动调整工作表的列宽。修改后的代码如下所示:
import easygui as eg
import xlwings as xw
from pathlib import Path

app = xw.App(visible=True, add_book=False)
workbook1 = app.books.add()
worksheet1 = workbook1.sheets[0]

folder_path = Path(eg.diropenbox(msg=None, title=None, default=None))
file_list = folder_path.glob('*.xlsx')
a = input("请输入你要合并的工作表(工作表1输入0,工作表2输入1):")
for i in file_list:
    workbook2 = app.books.open(i)
    worksheet2 = workbook2.sheets[int(a)]
    worksheet2.copy(after=worksheet1)
    workbook2.close()

    # 每次循环结束时关闭工作簿
    workbook2.close()

# 自动调整工作表的列宽
worksheet1.autofit()

worksheet1.delete()
workbook1.save(eg.filesavebox(msg=None, title=None, default='*.xlsx', filetypes=None))
workbook1.close()
app.quit()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-9 20:58:25 | 显示全部楼层
首先,根据您提供的代码,我注意到您使用了 xlwings 库来处理 Excel 文件。您遇到的问题可能是由于工作表删除操作不正确导致的。

在您的代码中,worksheet1.delete() 位于 for 循环内部,这将导致每次迭代都删除工作表,只留下最后一个文件的工作表。因此,您需要将 worksheet1.delete() 移动到 for 循环外部,以便在合并所有工作表之后再删除。

下面是修改后的示例代码:
import easygui as eg
import xlwings as xw
from pathlib import Path

app = xw.App(visible=True, add_book=False)
workbook1 = app.books.add()
worksheet1 = workbook1.sheets[0]

folder_path = Path(eg.diropenbox(msg=None, title=None, default=None))
file_list = folder_path.glob('*.xlsx')

a = input("请输入你要合并的工作表(工作表1输入0,工作表2输入1):")

for i in file_list:
    workbook2 = app.books.open(i)
    worksheet2 = workbook2.sheets[int(a)]
    worksheet2.copy(after=worksheet1)
    workbook2.close()

worksheet1.delete()  # 移动到 for 循环之外

# 最后保存和关闭工作簿
workbook1.save(eg.filesavebox(msg=None, title=None, default='*.xlsx', filetypes=None))
workbook1.close()
app.quit()

请注意,此修改将在处理完所有文件后删除合并单元表(worksheet1),并保存并关闭工作簿(workbook1)。

希望这对您有所帮助!如有任何其他疑问,请随时提出。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-9 21:16:38 | 显示全部楼层
isdkz 发表于 2023-9-9 20:58
可能是因为在循环中打开的工作簿没有被关闭导致的。建议在每次循环结束时关闭工作簿,可以在循环中添加  wo ...

我的代码里已经有workbook2.close()了,在第15行,加了自动调整列宽还是不行,后面的不运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-9 21:23:07 | 显示全部楼层
陶远航 发表于 2023-9-9 20:58
首先,根据您提供的代码,我注意到您使用了 xlwings 库来处理 Excel 文件。您遇到的问题可能是由于工作表删 ...

还是不行,我感觉问题是出在worksheet2 = workbook2.sheets[int(a)]这句里面,但是不知道怎么改,如果把a= input那句删除,再把[int(a)]直接换成数字,后面就能继续运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-9 21:47:54 | 显示全部楼层
本帖最后由 陶远航 于 2023-9-9 21:51 编辑
zxcv1100 发表于 2023-9-9 21:23
还是不行,我感觉问题是出在worksheet2 = workbook2.sheets这句里面,但是不知道怎么改,如果把a= input ...


您的问题可能出在这行代码 a = input("请输入你要合并的工作表(工作表1输入0,工作表2输入1):")。这行代码会在控制台等待用户输入,但是如果您在没有控制台的环境(例如某些IDE,或者图形用户界面)中运行代码,可能会出现问题。

如果您想要固定合并特定的工作表,可以直接将 a 设置为该工作表的索引,例如 a = 0 或 a = 1,而不是通过 input() 函数获取。这样,worksheet2 = workbook2.sheets[int(a)] 这行代码就会始终使用同一个工作表索引。

以下是修改后的代码:
import easygui as eg
import xlwings as xw
from pathlib import Path

app = xw.App(visible=True, add_book=False)
workbook1 = app.books.add()
worksheet1 = workbook1.sheets[0]

folder_path = Path(eg.diropenbox(msg=None, title=None, default=None))
file_list = folder_path.glob('*.xlsx')

a = 0  # 直接设置工作表索引

for i in file_list:
    workbook2 = app.books.open(i)
    worksheet2 = workbook2.sheets[int(a)]
    worksheet2.copy(after=worksheet1)
    workbook2.close()

worksheet1.delete()  # 移动到 for 循环之外

# 最后保存和关闭工作簿
workbook1.save(eg.filesavebox(msg=None, title=None, default='*.xlsx', filetypes=None))
workbook1.close()
app.quit()

希望这个修改能解决您的问题!如果还有其他问题,请随时告诉我。我很乐意帮助您!

如果以上代码依旧不能正常运行的话,我可以给您一些建议,希望能对您有所帮助:

1、您在代码中使用了 input 函数来获取用户输入的工作表索引。这个函数返回的是一个字符串类型的值,而不是一个整数类型的值。因此,如果您直接将其传递给 sheets 方法,可能会导致类型错误或索引错误。为了避免这个问题,您需要在使用 input 函数之后,将其转换为整数类型,例如:a = int(input(“请输入你要合并的工作表(工作表1输入0,工作表2输入1):”))

2、您在代码中使用了 glob 模块来获取文件列表。这个模块返回的是一个生成器对象,而不是一个列表对象。因此,如果您想要对其进行多次迭代或索引操作,可能会出现意想不到的结果。为了避免这个问题,您需要在使用 glob 方法之后,将其转换为列表类型,例如:file_list = list(folder_path.glob(‘*.xlsx’))

3、您在代码中使用了 easygui 模块来获取用户选择的文件夹路径和保存文件名。这个模块返回的是一个字符串类型的值,而不是一个 Path 类型的值。因此,如果您想要使用 Path 类型的方法或属性,例如 glob 或 name ,可能会出现属性错误或方法错误。为了避免这个问题,您需要在使用 easygui 方法之后,将其转换为 Path 类型,例如:folder_path = Path(eg.diropenbox(msg=None, title=None, default=None))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 08:28:06 | 显示全部楼层
zxcv1100 发表于 2023-9-9 18:23
还是不行,我感觉问题是出在worksheet2 = workbook2.sheets这句里面,但是不知道怎么改,如果把a= input ...

根据你提供的代码,问题可能出在字段 `worksheet2 = workbook2.sheets[int(a)]`。以下是一种修改方式,你可以尝试看看是否能够解决问题:

import easygui as eg
import xlwings as xw
from pathlib import Path

app = xw.App(visible=True, add_book=False)
workbook1 = app.books.add()
worksheet1 = workbook1.sheets[0]

folder_path = Path(eg.diropenbox(msg=None, title=None, default=None))
file_list = folder_path.glob('*.xlsx')

a = 0  # 直接设置工作表索引

for i, file in enumerate(file_list):  # 使用 enumerate 获取索引和文件
    workbook2 = app.books.open(file)
    worksheet2 = workbook2.sheets[a]  # 直接使用索引
    worksheet2.copy(after=worksheet1)
    workbook2.close()

worksheet1.delete()  # 移动到 for 循环之外

# 最后保存和关闭工作簿
file_path = eg.filesavebox(msg=None, title=None, default='*.xlsx', filetypes=None)
workbook1.save(file_path)
workbook1.close()
app.quit()
这里使用了 `enumerate` 函数来同时获取索引和文件。然后直接使用索引 `a` 来获取工作表。

另外,将文件保存路径存储在变量 `file_path` 中,以便在保存工作簿时使用。

请尝试以上修改,看看是否能够解决问题。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-10 08:40:15 | 显示全部楼层
Mike_python小 发表于 2023-9-10 08:28
根据你提供的代码,问题可能出在字段 `worksheet2 = workbook2.sheets`。以下是一种修改方式,你可以尝试 ...

之所以设置a = int(input(“请输入你要合并的工作表(工作表1输入0,工作表2输入1):”))是想着如果工作簿中有多个工作表,可以自由选择要合并的那一个,如果设置a=0,那如果想要合并第二个表还要来改成a=1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-9-10 09:23:23 | 显示全部楼层
zxcv1100 发表于 2023-9-10 05:40
之所以设置a = int(input(“请输入你要合并的工作表(工作表1输入0,工作表2输入1):”))是想着如果工作 ...

代码中的`a = 0`是用来指定要合并的工作表索引的。你可以根据需要修改这个值来选择要合并的具体工作表。

如果你想自由选择要合并的工作表,可以使用`input()`函数来获取用户的输入,例如:
a = int(input("请输入你要合并的工作表(工作表1输入0,工作表2输入1):"))
这样用户在运行代码时,会提示用户输入一个整数,0表示要合并的是第一个工作表,1表示要合并的是第二个工作表,以此类推。

如果你希望通过命令行参数来指定要合并的工作表索引,可以使用`argparse`模块来处理命令行参数。

例如,你可以将以下代码添加到你的程序中:
import argparse

# 创建参数解析器
parser = argparse.ArgumentParser(description='合并工作表')
# 添加一个名为 'sheet' 的参数,类型为整数
parser.add_argument('--sheet', type=int, default=0, help='要合并的工作表索引')
# 解析命令行参数
args = parser.parse_args()

# 使用 args.sheet 来获取要合并的工作表索引
a = args.sheet
然后在命令行中运行你的程序时,可以通过 `--sheet` 参数指定要合并的工作表索引,例如:
python your_program.py --sheet 1
这样就可以自由选择要合并的工作表。

希望能够解答你的疑问!如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-24 20:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表