是否有办法读取.txt
或.csv
格式的.xlsx
文件与Python?寻找一种方法来读取.xlsx
文件,同时保留数字格式(例如,$45.890924)。搜索了一下,找不到一个可行的模块,以我的Python技能水平,创建一个样式转换器几乎是不可能的。
一些有用的说明,Pandas将不是一个选项,因为它会自动清除数字格式,并且我无法提前对列的格式进行分类,因为一个列可以包含20多个不同的数字格式。
openpyxl
在value
中存储单元格的内容,在number_format
中存储格式(以及其他一些属性,如对齐,颜色,字体,边框等)。因此,可以解释Excel格式代码并将其转换为Python格式-但是
- 当然几CSV格式属性不理解:你不能让红色负数在CSV
- 虽然Excel格式的日期和时间代码相对容易处理,但那些用于数字的代码可能非常棘手。例如,以下是欧元的标准货币格式字符串:
'_-* #,##0.00 [$€-410]_-;-* #,##0.00 [$€-410]_-;_-* "-"?? [$€-410]_-;_-@_-'
话虽如此,制作翻译并非不可能。下面是一个简单的函数,将Excel日期格式字符串转换为Python的strftime()
指令。
def date_xl2py(dt, xlcode):
xl2py = {
'yy' : '%y',
'yyyy' : '%Y',
'm' : '%m', ##always zero-padded
'mm' : '%m',
'mmm' : '%b',
'mmmm' : '%B',
'mmmmm' : '%b', ##no single letter form
'd' : '%d', ##always zero-padded
'dd' : '%d',
'ddd' : '%a',
'dddd' : '%A',
'%' : '%%' ##escape the % char
}
pycode = []
for xlpart in findall(r'[d|m|y|h|s]+|.|(".+")', xlcode):
if xlpart in xl2py:
pycode.append(xl2py[xlpart])
else:
pycode.append(xlpart)
return ''.join(pycode)
dt = datetime(2022,7,12,15,56)
dt.strftime(date_xl2py(dt, 'ddd, mmmm dd, yyyy'))
'Tue, July 12, 2022'
请注意,我没有考虑语言环境的规范。
此外,Excel提供了三个(相当无用的)日期格式选项,这些选项在Python中是不可用的(请参阅代码中的注释):我只是将它们映射到最相似的可用选项。
最后,如果你要添加时间格式,你需要处理"mm"在Excel中可能是月或分钟,并根据上下文选择正确的选项。