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
# 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
worksheet2.copy(after=worksheet1)
workbook2.close()
worksheet1.delete()
workbook1.save(eg.filesavebox(msg= None, title=None, default='*.xlsx', filetypes=None))
workbook1.close()
app.quit() 可能是因为在循环中打开的工作簿没有被关闭导致的。建议在每次循环结束时关闭工作簿,可以在循环中添加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
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
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()
首先,根据您提供的代码,我注意到您使用了 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
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
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)。
希望这对您有所帮助!如有任何其他疑问,请随时提出。
如果问题已经解决,请设置最佳答案 isdkz 发表于 2023-9-9 20:58
可能是因为在循环中打开的工作簿没有被关闭导致的。建议在每次循环结束时关闭工作簿,可以在循环中添加wo ...
我的代码里已经有workbook2.close()了,在第15行,加了自动调整列宽还是不行,后面的不运行 陶远航 发表于 2023-9-9 20:58
首先,根据您提供的代码,我注意到您使用了 xlwings 库来处理 Excel 文件。您遇到的问题可能是由于工作表删 ...
还是不行,我感觉问题是出在worksheet2 = workbook2.sheets这句里面,但是不知道怎么改,如果把a= input那句删除,再把直接换成数字,后面就能继续运行 本帖最后由 陶远航 于 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 这行代码就会始终使用同一个工作表索引。
以下是修改后的代码:
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
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
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)) zxcv1100 发表于 2023-9-9 18:23
还是不行,我感觉问题是出在worksheet2 = workbook2.sheets这句里面,但是不知道怎么改,如果把a= input ...
根据你提供的代码,问题可能出在字段 `worksheet2 = workbook2.sheets`。以下是一种修改方式,你可以尝试看看是否能够解决问题:
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
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# 直接使用索引
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` 中,以便在保存工作簿时使用。
请尝试以上修改,看看是否能够解决问题。如果还有其他问题,请随时提问。 Mike_python小 发表于 2023-9-10 08:28
根据你提供的代码,问题可能出在字段 `worksheet2 = workbook2.sheets`。以下是一种修改方式,你可以尝试 ...
之所以设置a = int(input(“请输入你要合并的工作表(工作表1输入0,工作表2输入1):”))是想着如果工作簿中有多个工作表,可以自由选择要合并的那一个,如果设置a=0,那如果想要合并第二个表还要来改成a=1 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
这样就可以自由选择要合并的工作表。
希望能够解答你的疑问!如果还有其他问题,请随时提问。
页:
[1]