excel Python XlsxWriter -现有的自定义数据验证公式处于非活动状态,不起作用

ruoxqz4g  于 2023-02-05  发布在  Python
关注(0)|答案(1)|浏览(193)
    • 背景:**

我正在尝试捕获自定义波斯语(非公历)日期格式(yyyy/mm/dd)的有效日期

    • 公式:**

幸运的是,我从下面的线程中得到了一个不错的公式来满足这个要求。我可以XlsxWriter解析它,但它在生成的Excel工作表中不起作用。公式和链接在下面的SO线程中讨论:
Ensure Excel (Persian) date is valid date with specific format

    • 根本原因:**

我不知道是什么原因,但我想是因为弹出了一个错误提示信息,如果我点击确定,公式就可以工作了,这是原因吗?这会阻塞XlsxWriter吗?

    • 印发复制品**

创建虚拟数据框:

df = pd.DataFrame(data = {'date' : ['1369/05/18',
                                    '1386/05/1',
                                    '1369/5/18',
                                    '1369/05/',
                                    '1369//15',
                                    '/05/08',
                                    '1369/051/18',
                                    '1369/0/518',
                                    '136/5/18',
                                    '1369/13/18',
                                    '1369/05/31',
                                    '1369-05-31',
                                    '1369//05//18',
                                    None
                                   ],
                          'case' : ['valid format - correct',
                                    '1 digit day - correct',
                                    '1 digit month - correct',
                                    'No Day ',
                                    'No Month',
                                    'No Year',
                                    '3 digit month',
                                    '3 digit day',
                                    '3 digit year',
                                    'Invalid month',
                                    'Invalid day',
                                    '31st may - correct',
                                    'Invalid format',
                                    'Invalid format'
                                   ],
                          'gender' : '',
                          'date_input':''
                         }
                 )
  • 将 Dataframe 写入Excel文件。
  • 为该文件添加数据验证。
  • 我将添加一个不相关的男性/女性列表来显示验证是否有效。
  • 我会把我的公式加到Excel里。
writer = pd.ExcelWriter('dates_validation.xlsx', engine='xlsxwriter') # xlsx writer
workbook = writer.book # Workbook object
df.to_excel(writer, sheet_name = 'sheet_1' ,index=False) # Writing to file
worksheet = writer.sheets['sheet_1'] # Worksheet object
worksheet.data_validation(
    'C2:C1048576', {'validate': 'list',
                    'source': ['Male','Female'],
                    'dropdown': True
                   })
worksheet.data_validation(
    'D2:D1048576', {'validate': 'custom',
                    'value': '=LET(s,TEXTSPLIT(D2,"/"),y,AND(--INDEX(s,1)>=1278,--INDEX(s,1)<=9378),m,AND(--INDEX(s,2)>=1, --INDEX(s,2)<=12),d, AND(--INDEX(s,3)>=1, --INDEX(s,3)<=(30+(--INDEX(s,2)<=6))), AND(y,m,d))',
                    'ignore_blank': True
                   }
)
writer.close()

您可以看到公式已就位,但在单元格D2中不起作用。如果在下一个单元格中单击"确定",它将起作用。

a64a0gku

a64a0gku1#

LET()TEXTSPLIT是Excel中新的Future函数,并具有一些额外的前缀,如_xlfn.LET(_xlpm.s,_xlfn.TEXTSPLIT(D2,"/") ...
您需要使用的实际公式为:

_xlfn.LET(_xlpm.s,_xlfn.TEXTSPLIT(D2,"/"),_xlpm.y,AND(--INDEX(_xlpm.s,1)>=1278,--INDEX(_xlpm.s,1)<=9378),_xlpm.m,AND(--INDEX(_xlpm.s,2)>=1, --INDEX(_xlpm.s,2)<=12),_xlpm.d, AND(--INDEX(_xlpm.s,3)>=1, --INDEX(_xlpm.s,3)<=(30+(--INDEX(_xlpm.s,2)<=6))), AND(_xlpm.y,_xlpm.m,_xlpm.d))

下面是一个基于您的代码的工作示例:

import pandas as pd

df = pd.DataFrame(data = {'date': ['1369/05/18',
                                    '1386/05/1',
                                    '1369/5/18',
                                    '1369/05/',
                                    '1369//15',
                                    '/05/08',
                                    '1369/051/18',
                                    '1369/0/518',
                                    '136/5/18',
                                    '1369/13/18',
                                    '1369/05/31',
                                    '1369-05-31',
                                    '1369//05//18',
                                    None
                                   ],
                          'case' : ['valid format - correct',
                                    '1 digit day - correct',
                                    '1 digit month - correct',
                                    'No Day ',
                                    'No Month',
                                    'No Year',
                                    '3 digit month',
                                    '3 digit day',
                                    '3 digit year',
                                    'Invalid month',
                                    'Invalid day',
                                    '31st may - correct',
                                    'Invalid format',
                                    'Invalid format'
                                   ],
                          'gender' : '',
                          'date_input':''
                         }
                 )

writer = pd.ExcelWriter('dates_validation.xlsx', engine='xlsxwriter') # xlsx writer
workbook = writer.book # Workbook object
df.to_excel(writer, sheet_name = 'sheet_1' ,index=False) # Writing to file
worksheet = writer.sheets['sheet_1'] # Worksheet object
worksheet.data_validation(
    'C2:C1048576', {'validate': 'list',
                    'source': ['Male','Female'],
                    'dropdown': True
                   })
worksheet.data_validation(
    'D2:D1048576', {'validate': 'custom',
                    'value': '_xlfn.LET(_xlpm.s,_xlfn.TEXTSPLIT(D2,"/"),_xlpm.y,AND(--INDEX(_xlpm.s,1)>=1278,--INDEX(_xlpm.s,1)<=9378),_xlpm.m,AND(--INDEX(_xlpm.s,2)>=1, --INDEX(_xlpm.s,2)<=12),_xlpm.d, AND(--INDEX(_xlpm.s,3)>=1, --INDEX(_xlpm.s,3)<=(30+(--INDEX(_xlpm.s,2)<=6))), AND(_xlpm.y,_xlpm.m,_xlpm.d))',
                    'ignore_blank': True
                   }
)

worksheet.autofit()

writer.close()

输出:

相关问题