Не удается разблокировать ячейку с пользовательским значением, используя pd.xlsxwriter - PullRequest
1 голос
/ 21 мая 2019

У меня есть кадр данных, как показано в приведенном ниже коде. Я просто хочу заблокировать заголовок (верхний ряд) и позволить пользователю изменить остальные ячейки. Основываясь на приведенном ниже коде, он блокирует заголовок и позволяет мне изменять значение всех столбцов, кроме столбца «Дата». Я не могу изменить значение столбца даты. Это должно позволить мне изменить значение столбца даты тоже

import pandas as pd


df = pd.DataFrame({'Data1': [10, 20, 30],
                   'Data2': [11, 21, 31],
                   'Date': ["", 
                            "", 
                            pd.to_datetime('today')]})

writer = pd.ExcelWriter('pandas_filter.xlsx', engine='xlsxwriter', )

df.to_excel(writer, sheet_name='Sheet1', index=False)

workbook  = writer.book
worksheet = writer.sheets['Sheet1']

unlocked = workbook.add_format({'locked': False})
locked   = workbook.add_format({'locked': True})
worksheet.protect()
for row in range(1, 150):
    worksheet.set_row(row, None, unlocked)

writer.save()

1 Ответ

0 голосов
/ 21 мая 2019

В XlsxWriter формат ячейки переопределяет формат строки, который переопределяет формат столбца.

Причина, по которой ячейки даты и времени не разблокированы, заключается в том, что Pandas применяет к этим ячейкам формат ячеек (для формата даты), и поэтому формат строки игнорируется / переопределяется.

Единственный способ избежать этого - записать (или перезаписать) данные ячейки даты отдельно от других данных фрейма данных и применить разблокированный формат даты. Как то так:

import pandas as pd

df = pd.DataFrame({'Data1': [10, 20, 30],
                   'Data2': [11, 21, 31],
                   'Date': [pd.to_datetime('today'), 
                            pd.to_datetime('today'), 
                            pd.to_datetime('today')]})

writer = pd.ExcelWriter('pandas_filter.xlsx', engine='xlsxwriter', )

df.to_excel(writer, sheet_name='Sheet1', index=False)

workbook  = writer.book
worksheet = writer.sheets['Sheet1']

unlocked = workbook.add_format({'locked': False})
locked   = workbook.add_format({'locked': True})

# Write the 'Date' column data.
worksheet.set_column('C:C', 20)
unlocked_date_format = workbook.add_format({'num_format': 'yyyy-mm-dd',
                                            'locked': False})
worksheet.write_column('C2', df['Date'], unlocked_date_format)

worksheet.protect()
for row in range(1, 150):
    worksheet.set_row(row, None, unlocked)

writer.save()

Вывод, после модификации:

enter image description here

...