- 背景:**
我正在尝试捕获自定义波斯语(非公历)日期格式(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中不起作用。如果在下一个单元格中单击"确定",它将起作用。
1条答案
按热度按时间a64a0gku1#
LET()
和TEXTSPLIT
是Excel中新的Future函数,并具有一些额外的前缀,如_xlfn.LET(_xlpm.s,_xlfn.TEXTSPLIT(D2,"/") ...
。您需要使用的实际公式为:
下面是一个基于您的代码的工作示例:
输出: