ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-03 08:46:36  阅读:353  来源: 互联网

标签:python datetime xlsxwriter


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

我能够使用xlrd正确读取日期数据并转换为datetime对象,但是当我尝试使用xlsxwriter写这个时,我会收到错误.我已经阅读了xlsxwriter上的所有SO帖子以及excel如何格式化数据等等,并用谷歌搜索它,但似乎无法弄明白.

我的代码是:

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:\Python27\lib\site-packages\xlsxwriter\worksheet.py", line 57, in cell_wrapper
return method(self, *args, **kwargs)
  File "C:\Python27\lib\site-packages\xlsxwriter\worksheet.py", line 668, in write_datetime
number = self._convert_date_time(date)
  File "C:\Python27\lib\site-packages\xlsxwriter\worksheet.py", line 3267, in _convert_date_time
return datetime_to_excel_datetime(dt_obj, self.date_1904)
  File "C:\Python27\lib\site-packages\xlsxwriter\utility.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’时,生成的电子表格会在单元格中显示一堆’######’,但是当我点击单元格时,它会显示我想要的日期和时间,当我这样做的时候,不知道如何骑这些’####’.我不关心使用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)

最后:

When I call just the ordinary ‘out_sheet.write’ instead, the resulting spreadsheet shows a bunch of ‘######’ in the cell, but when I click on the cell it shows the date and time as I wanted it,

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

标签:python,datetime,xlsxwriter
来源: https://codeday.me/bug/20190703/1364814.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有