xlsxwriter:保护取消隐藏

xlsxwriter: protection unhiding

更新:已修复。 Sheet 受保护,所选列可以取消隐藏。

是否可以锁定所有可见单元格(防止编辑),但仍允许用户取消隐藏某些列?

我想通过 pd.excel_writer() 导出一个 pandas 数据框。

worksheet.protect() 不允许任何参数? 我应用了按列格式并在隐藏列上尝试了 'lock': False,但这没有用。

# init 
import pandas as pd
import random as rd
import string
random.seed(10)
S = 10 
string_col = []
number_col1 = [] # protect 
number_col2 = [] # hide 

# create testdata
for i in range(0, 20): 
    ran_str = ''.join(rd.choices(string.ascii_uppercase + string.digits, k = S))
    ran_num1 = ''.join(str(rd.randrange(S)))
    ran_num2 = ''.join(str(rd.randrange(S)))
    string_col.append(ran_str) 
    number_col1.append(ran_num1) 
    number_col2.append(ran_num2) 

testframe = pd.DataFrame(
    {'String_col': string_col,
     'Hide': number_col1,
     'Protect': number_col2
    })


# helperfunction for selecting columns 
def getColnameByPosition(pos):
    from string import ascii_uppercase   
    colnames = list(ascii_uppercase)
    for col in ascii_uppercase:
        for col2 in ascii_uppercase:
            colnames.append(col+col2)    
    return colnames[pos]

# export 
writer = pd.ExcelWriter("./FormatTest.xlsx", engine='xlsxwriter')
testframe.to_excel(writer, sheet_name="Sheet0", startrow=0, header=True, index=False)
workbook  = writer.book
worksheet = writer.sheets["Sheet0"]       

# protect and hide format 
format_protect =  workbook.add_format({'bg_color': '#ADD8E6','font_name': 'Calibri', 'font_size': 9, 'num_format': '#,##0', "locked": True})
format_hide =  workbook.add_format({'bg_color': '#FFFFFF', 'font_name': 'Calibri', 'font_size': 9, 'num_format': '#,##0', "locked": False})

prot_col = getColnameByPosition(testframe.columns.get_loc("Protect"))
hide_col = getColnameByPosition(testframe.columns.get_loc("Hide"))

    worksheet.set_column(prot_col+':'+prot_col, 10,  format_protect)
worksheet.set_column(hide_col+':'+hide_col, 10,  format_hide, {'hidden': True})

# FIX: allow for unhiding. 
worksheet.protect('', {'format_columns': True}) 

writer.save()            

您只需设置 protect() 以打开工作表保护,但打开您想要的例外。在这种情况下,打开“格式列”应该会得到你想要的:

# ...

worksheet.set_column(prot_col+':'+prot_col, 10,  format_protect)
worksheet.set_column(hide_col+':'+hide_col, 10,  format_hide, {'hidden': True})

worksheet.protect('', {'format_columns': True})

writer.save()

此外,set_column() 可以采用 (col, col) 表示法,因此您可以删除 getColnameByPosition() 代码并执行以下操作:

# ...

prot_col = testframe.columns.get_loc("Protect")
hide_col = testframe.columns.get_loc("Hide")

worksheet.set_column(prot_col, prot_col, 10, format_protect)
worksheet.set_column(hide_col, hide_col, 10, format_hide, {'hidden': True})

worksheet.protect('', {'format_columns': True})

writer.save()