我一直在努力解决这个问题。我试过多个python excel库,它们似乎都存在相同的问题。对于xlsx文件,最终期望的结果实质上是“所见即所得”。与excel交互的所有python库都返回存储在excel中的值,并可能返回该值的相应格式。我正在努力使用该格式来实际获得一个值,该值看起来像您在excel或其他电子表格应用程序(如libre office calc)中看到的一样。
现在这是一些代码,用于打开工作表并输出存储的值和格式
import openpyxl
book = openpyxl.load_workbook(
'test.xlsx',
read_only=True,
data_only=False,
)
sheet = book.worksheets[0]
for row in sheet.iter_rows():
for cell in row:
print('FORMAT:', cell.number_format)
print('VALUE:', cell.value)
print('TYPE:', type(cell.value))
运行该代码(python 3.6.7,openpyxl 3.0.1)会产生以下截断的输出:
FORMAT: yyyy\-mm\-dd\Thh:mm\Z
VALUE: 2017-04-19 15:17:00.000004
TYPE: <class 'datetime.datetime'>
...
我的问题是,如何将格式字符串(yyyy-mm-dd \ Thh:mm \ Z)解析为有效的python strftime datetime表示形式。我开始编写一个简单的函数,该函数使用字符串替换将yyyy
替换为%Y
,将yy
替换为%y
,依此类推。但是后来我注意到格式字符串中有mm
的两个实例,一个实例对应于月份,一个实例对应于分钟!您应该如何解析?月份总是第一吗?只有几分钟的时间会怎样?而且,如果您想要日期时间格式为时间第一,日期为第二怎么办?
任何帮助将不胜感激。要么是已经执行此操作的python库,要么是有据可查的xlsx文件格式的规范,该规范允许我构建自己的解析器(我找到了它,但似乎没有我想要的内容:https://docs.microsoft.com/en-us/openspecs/office_file_formats/ms-xls/300280fd-e4fe-4675-a924-4d383af48d3b),或者用另一种语言举例。如果可以将其推广到日期以外,并且始终用于所有Excel格式,那也很好。
问题:将字符串(
"yyyy-mm-dd\Thh:mm\Z"
)解析为有效的datetime.strftime
格式代码。
import re
from datetime import datetime
class XLSXdatetime:
translate = {'yyyy': '%Y', 'mm': '%m', 'dd': '%d',
'hh:mm': '%H:%M', 'hh:mm:ss': '%H:%M:%S'}
rec = re.compile(r'([\w:]+|\\.)')
def __init__(self, xlsx_format):
self.xlsx_format = xlsx_format
@property
def format(self):
_format = []
for item in XLSXdatetime.rec.findall(self.xlsx_format):
if item.startswith('\\'):
item = item[1:]
_format.append(XLSXdatetime.translate.get(item, item))
return ''.join(_format)
def strftime(self, data):
return data.strftime(self.format)
用法:
data = datetime.strptime('2017-04-19 15:17:00.000004', '%Y-%m-%d %H:%M:%S.%f')
print('data: {}'.format(data))
# Long version
for _format in ['yyyy-mm-dd hh:mm:ss',
'yyyy\-mm\-dd\Thh:mm\Z'
]:
xlsx_datetime = XLSXdatetime(_format)
print("{} => {} = '{}'".format(_format,
xlsx_datetime.format,
xlsx_datetime.strftime(data)))
输出:
data: 2017-04-19 15:17:00.000004 yyyy-mm-dd hh:mm:ss => %Y%m%d%H:%M:%S = '2017041915:17:00' yyyy\-mm\-dd\Thh:mm\Z => %Y-%m-%dT%H:%MZ = '2017-04-19T15:17Z'
# Short version
for _format in ['yyyy-mm-dd hh:mm:ss',
'yyyy\-mm\-dd\Thh:mm\Z'
]:
print("'{}'".format(XLSXdatetime(_format).strftime(data)))
输出:
data: 2017-04-19 15:17:00.000004 '2017041915:17:00' '2017-04-19T15:17Z'
经过Python测试:3.6