冰菲 发表于 2023-5-24 13:49:53

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

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()

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

isdkz 发表于 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 文件的密码并另存为新的无密码文件。

冰菲 发表于 2023-5-24 14:11:18

isdkz 发表于 2023-5-24 13:53
你在使用SaveAs方法时,没有正确设置其参数以移除密码。

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

不行,另存还是有密码

冰菲 发表于 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',换了密码,换密码是可以的,就是删除不了密码

isdkz 发表于 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()

请尝试这段代码,看看是否能满足你的需求。

冰菲 发表于 2023-5-24 14:34:21

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

成功了 {:5_110:}
页: [1]
查看完整版本: 帮忙看一下,打开多个带密码的Excel工作簿,另存为没有密码,但是另存的还是有密码.