最近我们的IT部门应用了一项策略,我们必须在Excel中指定敏感性标签。这导致我的自动生成个性化excel文件的py代码中断。
除了使用Excelwriter写入文件外,我还使用win32com对单个文件使用随机密码进行密码保护。当win32com打开文件时,提示它选择无法绕过的敏感标签,因此无法继续进行。
是否有方法以编程方式默认选择"机密"作为敏感性标签?
下面简单介绍一下如何生成 文件while rc < idcount:
var_id= df['idnum'].iloc[rc]
var_password = df['password'].iloc[rc]
main_df = df[(df['idnum'] == var_id)]
wsname = 'testsheet'
staff_file = pd.ExcelWriter(dummyloc + 'Dummy.xlsx', engine='xlsxwriter')
main_df.to_excel(staff_file,wsname,startrow=4,index=False)
workbook = staff_file.book
workbook.set_vba_name('ThisWorkbook')
workbook.add_vba_project(dummyloc + './vbaProject.bin') #i added a macro for some internal controls.
staff_file.save()
staff_file.close()
excel = Dispatch('Excel.Application')
wb = excel.Workbooks.Open(dummyloc + 'Dummy.xlsx')
excel.Worksheets[wsname].Activate()
excel.ActiveSheet.Protect('ABCD',True ,True ,True ,False ,False , False , False , False , False , False , False ,False , True , True , False)
wb.SaveAs(Filename = dummyloc + 'Excel\' + 'Dummy1',FileFormat= 52,Password=str(var_password))
wb.Close()
rc = rc+ 1
我也找到了一个建议的解决方案,但不知何故。它应该执行一个vba宏来注入密码。然而,也许我没有正确编码,它没有改变任何东西
def set_password(excel_file_path, pw):
from pathlib import Path
excel_file_path = Path(excel_file_path)
vbs_script =
f"""' Save with password required upon opening
Set excel_object = CreateObject("Excel.Application")
Set workbook = excel_object.Workbooks.Open("{excel_file_path}")
excel_object.DisplayAlerts = False
excel_object.Visible = False
workbook.SaveAs "{excel_file_path}",, "{pw}"
excel_object.Application.Quit
"""
# write
vbs_script_path = excel_file_path.parent.joinpath("set_pw.vbs")
with open(vbs_script_path, "w") as file:
file.write(vbs_script)
#execute
subprocess.call(['cscript.exe', str(vbs_script_path)])
# remove
vbs_script_path.unlink()
return None
刚刚在我的工作场所遇到了类似的excel 365更新问题。简而言之,我通过上网管理的是一个快速的VBA函数,它从已经标记的文件中获得敏感性标签,然后将其分配给我需要的所有文件。
请原谅我将VBA代码放在Python问题中,但由于您使用的是win32com,因此适配应该非常简单。
这是我写的函数:
Sub put_label()
'Puts sensitivity labels copied from active workbook to a list of files.
Dim ex_lab 'To store the label object
Dim fs, f, archivos, curarch
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.GetFolder(Range("C2").Value2)
Set archivos = f.Files 'List of files to be labelled
'This line gets the label object from the already labelled file.
Set ex_lab = ActiveWorkbook.SensitivityLabel.GetLabel()
'The label is applied to all the files.
For Each curarch In archivos
Workbooks.Open curarch.path, False
'ActiveWorkbook is now the just opened workbook
ActiveWorkbook.SensitivityLabel.SetLabel ex_lab, ex_lab
ActiveWorkbook.Save
ActiveWorkbook.Close False
Next
MsgBox "Done"
End Sub
所以,从你所拥有的,你可以使用你的excel_object并直接引用工作簿对象等,因为方法通常看起来与VBA相同。只是要注意,在Python中使用它时,所有函数都使用()。例如,VBA的:
ActiveWorkbook.Close False
在Python代码中应该像这样:
excel_object.ActiveWorkbook.Close(False)
另外,Set语句是VBA声明对象而不是内置变量的方式;
有时会有一些大小写敏感的问题,但我想你已经有了通过COM对象在Python中使用VBA的经验。
希望这对你有帮助,我整个上午都在担心这个问题:)