鱼C论坛

 找回密码
 立即注册
查看: 1100|回复: 5

[已解决]帮忙看一下,打开多个带密码的Excel工作簿,另存为没有密码,但是另存的还是有密码.

[复制链接]
发表于 2023-5-24 13:49:53 | 显示全部楼层 |阅读模式

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

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

x
import os
import win32com.client as win32

# 定义密码
password = '00'

# 定义要处理的文件夹路径
folder_path = r'C:\Users\EDY\Desktop\文件'

# 启动 Excel 应用程序
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False  # 隐藏 Excel 窗口

# 遍历文件夹中的所有 Excel 文件
for file_name in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file_name)
    if not os.path.isfile(file_path):  # 如果不是文件,则跳过
        continue
    if not file_name.endswith('.xlsx') and not file_name.endswith('.xls'):  # 如果不是 Excel 文件,则跳过
        continue
   
    # 打开 Excel 文件
    workbook = excel.Workbooks.Open(file_path, False, False, None, Password=password)
   
    # 另存为没有密码的文件
    new_file_path = file_path.replace('.xlsx', '_no_password.xlsx').replace('.xls', '_no_password.xls')
    workbook.SaveAs(new_file_path, None, '', '')
   
    # 关闭 Excel 文件
    workbook.Close(False)
   
# 退出 Excel 应用程序
excel.Quit()

此代码运行正常,带密码的多个工作簿另存后工作簿还是有密码,懂得帮忙看一下,为什么?

最佳答案
2023-5-24 14:29:19
冰菲 发表于 2023-5-24 14:24
workbook.SaveAs(Filename=new_file_path, Password='')
我刚试了一下给Password='3',换了密码,换 ...

我明白你的问题了,你的代码试图通过设置密码为空来移除密码,但是看起来在 Excel 中这个方法并不起作用。实际上,密码需要明确地设置为  None  来移除。

让我们尝试使用以下的代码来移除密码:
workbook.Password = ''
workbook.SaveAs(Filename=new_file_path)

这个代码首先将 workbook 对象的密码属性设置为空,然后再使用 SaveAs 方法保存。这样应该能够成功地移除密码。

所以,你的完整代码应该修改为:
import os
import win32com.client as win32

# 定义密码
password = '00'

# 定义要处理的文件夹路径
folder_path = r'C:\Users\EDY\Desktop\文件'

# 启动 Excel 应用程序
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False  # 隐藏 Excel 窗口

# 遍历文件夹中的所有 Excel 文件
for file_name in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file_name)
    if not os.path.isfile(file_path):  # 如果不是文件,则跳过
        continue
    if not file_name.endswith('.xlsx') and not file_name.endswith('.xls'):  # 如果不是 Excel 文件,则跳过
        continue
   
    # 打开 Excel 文件
    workbook = excel.Workbooks.Open(file_path, False, False, None, Password=password)
   
    # 移除密码并另存为新文件
    workbook.Password = ''
    new_file_path = file_path.replace('.xlsx', '_no_password.xlsx').replace('.xls', '_no_password.xls')
    workbook.SaveAs(Filename=new_file_path)
   
    # 关闭 Excel 文件
    workbook.Close(False)
   
# 退出 Excel 应用程序
excel.Quit()
请尝试这段代码,看看是否能满足你的需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-24 13:53:19 | 显示全部楼层
你在使用  SaveAs  方法时,没有正确设置其参数以移除密码。

对于 Excel VBA, SaveAs  方法的参数如下:
expression.SaveAs (FileName, FileFormat, Password, WriteResPassword, ReadOnlyRecommended, CreateBackup, AccessMode, ConflictResolution, AddToMru, TextCodepage, TextVisualLayout, Local)

你的代码中这样写:
workbook.SaveAs(new_file_path, None, '', '')

这意味着你在设置  FileFormat  参数为  None ,然后设置  Password  和  WriteResPassword  为空字符串。但这并不能真正地移除密码。在 Python 中, None  和空字符串都表示无,但在 VBA 中,它们可能不一样。

你应该这样来移除密码:
workbook.SaveAs(Filename=new_file_path, Password='')

在这里,我们只设置了  Filename  和  Password  两个参数,其他的参数都会使用它们的默认值。

所以,你的代码应改为:
import os
import win32com.client as win32

# 定义密码
password = '00'

# 定义要处理的文件夹路径
folder_path = r'C:\Users\EDY\Desktop\文件'

# 启动 Excel 应用程序
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False  # 隐藏 Excel 窗口

# 遍历文件夹中的所有 Excel 文件
for file_name in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file_name)
    if not os.path.isfile(file_path):  # 如果不是文件,则跳过
        continue
    if not file_name.endswith('.xlsx') and not file_name.endswith('.xls'):  # 如果不是 Excel 文件,则跳过
        continue
   
    # 打开 Excel 文件
    workbook = excel.Workbooks.Open(file_path, False, False, None, Password=password)
   
    # 另存为没有密码的文件
    new_file_path = file_path.replace('.xlsx', '_no_password.xlsx').replace('.xls', '_no_password.xls')
    workbook.SaveAs(Filename=new_file_path, Password='')
   
    # 关闭 Excel 文件
    workbook.Close(False)
   
# 退出 Excel 应用程序
excel.Quit()
这段代码应该能够按你的预期工作,即移除 Excel 文件的密码并另存为新的无密码文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-24 14:11:18 | 显示全部楼层
isdkz 发表于 2023-5-24 13:53
你在使用  SaveAs  方法时,没有正确设置其参数以移除密码。

对于 Excel VBA, SaveAs  方法的参数如下 ...

不行,另存还是有密码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-24 14:24:44 | 显示全部楼层
isdkz 发表于 2023-5-24 13:53
你在使用  SaveAs  方法时,没有正确设置其参数以移除密码。

对于 Excel VBA, SaveAs  方法的参数如下 ...

   workbook.SaveAs(Filename=new_file_path, Password='')
我刚试了一下给Password='3',换了密码,换密码是可以的,就是删除不了密码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-24 14:29:19 | 显示全部楼层    本楼为最佳答案   
冰菲 发表于 2023-5-24 14:24
workbook.SaveAs(Filename=new_file_path, Password='')
我刚试了一下给Password='3',换了密码,换 ...

我明白你的问题了,你的代码试图通过设置密码为空来移除密码,但是看起来在 Excel 中这个方法并不起作用。实际上,密码需要明确地设置为  None  来移除。

让我们尝试使用以下的代码来移除密码:
workbook.Password = ''
workbook.SaveAs(Filename=new_file_path)

这个代码首先将 workbook 对象的密码属性设置为空,然后再使用 SaveAs 方法保存。这样应该能够成功地移除密码。

所以,你的完整代码应该修改为:
import os
import win32com.client as win32

# 定义密码
password = '00'

# 定义要处理的文件夹路径
folder_path = r'C:\Users\EDY\Desktop\文件'

# 启动 Excel 应用程序
excel = win32.gencache.EnsureDispatch('Excel.Application')
excel.Visible = False  # 隐藏 Excel 窗口

# 遍历文件夹中的所有 Excel 文件
for file_name in os.listdir(folder_path):
    file_path = os.path.join(folder_path, file_name)
    if not os.path.isfile(file_path):  # 如果不是文件,则跳过
        continue
    if not file_name.endswith('.xlsx') and not file_name.endswith('.xls'):  # 如果不是 Excel 文件,则跳过
        continue
   
    # 打开 Excel 文件
    workbook = excel.Workbooks.Open(file_path, False, False, None, Password=password)
   
    # 移除密码并另存为新文件
    workbook.Password = ''
    new_file_path = file_path.replace('.xlsx', '_no_password.xlsx').replace('.xls', '_no_password.xls')
    workbook.SaveAs(Filename=new_file_path)
   
    # 关闭 Excel 文件
    workbook.Close(False)
   
# 退出 Excel 应用程序
excel.Quit()
请尝试这段代码,看看是否能满足你的需求。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-24 14:34:21 | 显示全部楼层
isdkz 发表于 2023-5-24 14:29
我明白你的问题了,你的代码试图通过设置密码为空来移除密码,但是看起来在 Excel 中这个方法并不起作用 ...

成功了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 13:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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