使用xlrd读取日期,使用xlsxwriter在Python中编写日期



我使用xlrd从excel电子表格中读取一堆原始数据,进行各种计算和重新格式化,然后使用xlsxwriter将结果写入新的工作簿。

我能够使用xlrd正确地读取日期数据并转换为datetime对象,但是当我尝试使用xlsxwriter编写时,我得到了错误。我已经阅读了所有关于xlsxwriter和excel如何格式化数据等的SO帖子,并谷歌了一下,但似乎无法弄清楚。

我的代码是:
in_wb = xlrd.open_workbook("in_book.xlsx")
in_sheet = in_wb.sheet_by_name("in_sheet")
out_wb = xlsxwriter.Workbook("out_book.xlsx")
out_sheet = out_wb.add_worksheet("out_sheet")
date_format = out_wb.add_format({'num_format': 'YYYY-MM-DD HH:DD:SS'})
as_tuple = xlrd.xldate_as_tuple(in_sheet.cell_value(0, 0), in_wb.datemode)
as_datetime = datetime.datetime(as_tuple[0], as_tuple[1], as_tuple[2] , as_tuple[3], as_tuple[4], as_tuple[5])
out_sheet.write_datetime(0, 0, as_datetime, date_format)
#print details just to be sure
print as_datetime #prints it in exactly the format I want
print type(as_datetime) #says it is of type 'datetime.datetime'
完整的Traceback错误是(不包括我的py文件中的第一个调用):
  File "C:Python27libsite-packagesxlsxwriterworksheet.py", line 57, in cell_wrapper
return method(self, *args, **kwargs)
  File "C:Python27libsite-packagesxlsxwriterworksheet.py", line 668, in write_datetime
number = self._convert_date_time(date)
  File "C:Python27libsite-packagesxlsxwriterworksheet.py", line 3267, in _convert_date_time
return datetime_to_excel_datetime(dt_obj, self.date_1904)
  File "C:Python27libsite-packagesxlsxwriterutility.py", line 576, in datetime_to_excel_datetime
raise TypeError("Unknown or unsupported datetime type")
  TypeError: Unknown or unsupported datetime type
  Exception LookupError: 'unknown encoding: utf-8' in <bound method Workbook.__del__ of <xlsxwriter.workbook.Workbook object at 0x030BAB50>> ignored

当我调用普通的'out_sheet。相反,生成的电子表格显示了一堆'######'在单元格中,但当我点击单元格时,它显示了我想要的日期和时间,不知道如何得到这些'####'当我这样做的时候。我不关心使用write_datetime()或只是write(),我只希望它在输出表单元格中正确显示。

非常感谢你的帮助!

我安装了最新版本的xlrd(0.9.3)和xlsxwriter(0.5.3),并且能够运行您的示例程序而没有任何错误:

import xlrd
import xlsxwriter
import datetime
in_wb = xlrd.open_workbook("in_book.xlsx")
in_sheet = in_wb.sheet_by_name("in_sheet")
out_wb = xlsxwriter.Workbook("out_book.xlsx")
out_sheet = out_wb.add_worksheet("out_sheet")
date_format = out_wb.add_format({'num_format': 'YYYY-MM-DD HH:DD:SS'})
as_tuple = xlrd.xldate_as_tuple(in_sheet.cell_value(0, 0), in_wb.datemode)
as_datetime = datetime.datetime(as_tuple[0], as_tuple[1], as_tuple[2],
                                as_tuple[3], as_tuple[4], as_tuple[5])
out_sheet.write_datetime(0, 0, as_datetime, date_format)

print as_datetime
print type(as_datetime)
out_wb.close()

注意,我在末尾添加了一个workbook.close(),以避免任何文件关闭问题,并使任何错误消息更清晰。这运行并生成了预期的xlsx文件和输出:

$ python so01.py
2014-05-02 00:00:00
<type 'datetime.datetime'> 

注意,从0.93版本开始,xlrd也支持xldate_as_datetime()函数。因此,您可以更简单地执行以下转换:

as_datetime = xlrd.xldate.xldate_as_datetime(in_sheet.cell_value(0, 0), 
                                             in_wb.datemode)
out_sheet.write_datetime(0, 0, as_datetime, date_format)

最后:

当我调用普通的'out_sheet。相反,生成的电子表格在单元格中显示了一堆'######',但是当我单击单元格时,它显示了我想要的日期和时间,

这是Excel表示值太大而无法在单元格中显示的标准方式(因为在上面的例子中它有一个相当长的日期格式)。如果您使用worksheet.set_column()扩大列宽度,您应该可以看到预期的值。

相关内容

  • 没有找到相关文章

最新更新