【问题标题】:How to format cell with datetime object of the form 'yyyy-mm-dd hh:mm:ss' in Excel using openpyxl如何使用openpyxl在Excel中使用'yyyy-mm-dd hh:mm:ss'形式的日期时间对象格式化单元格
【发布时间】:2014-06-23 16:02:15
【问题描述】:

所以,给定:

dttm = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
ws['A1'] = dttm

excel 中的结果是将正确的日期时间写入单元格(您可以在输入公式的地方看到它)。但是,单元格显示格式只有 MM/DD/YYYY。

我需要单元格显示为“2014 年 6 月 23 日 13:56”,而不仅仅是“2014 年 6 月 23 日”。

如何显式格式化单元格以完成此操作?

谢谢!

编辑

@alecxe 这个解决方案有效,正是我所要求的。我希望能够像@Woodham 的解决方案一样保存样式。不幸的是,它引发了 typeError (见评论)。有什么建议吗?

【问题讨论】:

    标签: python excel openpyxl


    【解决方案1】:

    格式化单元格的最简单方法是使用 .number_format = "format",如下所示:

    value = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
    cell = ws['A1']
    cell.value = value
    cell.number_format = 'YYYY MMM DD'
    

    这是在 openpyxl (2.2.2) 中测试的

    【讨论】:

      【解决方案2】:

      对于 openpyxl 2.4.5,您将无法再访问 NumberFormatStyle,而必须使用 NamedStyle。以下是一些示例用法:

      from openpyxl.styles import NamedStyle
      
      date_style = NamedStyle(name='datetime', number_format='DD/MM/YYYY HH:MM:MM')
      ws['A1'].style = date_style
      

      或者使用新的NamedStyle 类,您可以在NamedStyle 被实例化后通过字符串名称设置样式:

      from openpyxl.styles import NamedStyle
      
      NamedStyle(name='custom_datetime', number_format='DD/MM/YYYY HH:MM:MM')
      ws['A1'].style = 'custom_datetime'
      

      此处的文档:https://openpyxl.readthedocs.io/en/stable/styles.html

      【讨论】:

        【解决方案3】:

        对于 openpyxl 2.3.4,无法导入 NumberFormat,但此代码可用于设置样式:

        from openpyxl.styles import Style
        
        …
        date_style = Style(number_format="DD/MM/YYYY HH:MM:MM")
        ws['A1'].style = date_style
        

        【讨论】:

        • 如何只插入小时数?例如。我有一个整数值 8,我希望值或格式为 8:00,openyxl 的作用是插入日期 8.1.1900 00:00,尽管我将格式设置为 HH:MM?
        • 您需要先创建一个有效的日期时间对象。之后,您可以将数字格式设置为“HH:MM”,它将起作用。您可以创建一个新的日期时间,然后替换小时和分钟,例如date = datetime.now().replace(hour=8, minute=0)
        • 当前版本(2.4.1)有什么变化吗?尝试导入时出现以下错误:ImportError: cannot import name 'Style'
        • @Prahlad Yeri 我添加了一个可能适用于您正在使用的版本的答案:stackoverflow.com/a/42867362/2578505
        【解决方案4】:

        我相信您需要在要格式化的单元格上设置openpyxl.styles.Style

        看看documentation here,这样的事情应该可以工作:

        dttm = datetime.datetime.strptime("2014-06-23 13:56:30", "%Y-%m-%d %H:%M:%S")
        s = Style(number_format=NumberFormat('dd-mm-yyyy h:mm:ss'))
        
        ws['A1'] = dttm
        ws['A1'].styles = s
        

        更新: 样式类不再使用,解决方法参考answer

        【讨论】:

        • 我在s = Style(number_format=NumberFormat('dd-mm-yyyy h:mm:ss)) 上收到类型错误“__init() 只需要 1 个参数(给定 2 个)”
        • 你使用的是什么版本的 openpyxl,它给你一个 TypeError?
        【解决方案5】:
        from openpyxl import load_workbook
        from openpyxl.styles import NamedStyle
        
        xlsx_file = args.xlsx_file.name
        
        # openning:
        wb = load_workbook(filename = xlsx_file)
        
        
        # create date style:
        date_style = NamedStyle(name='date_style', number_format='DD.MM.YYYY HH:MM:MM')
        
        # apply the style to the column H of the default sheet:
        ws = wb.active
        for row in ws[2:ws.max_row]:  # skip the header
            cell = row[7]             # column H
            cell.style = date_style
        
        # saving:
        wb.save(xlsx_file)
        

        编辑:以上对我有用,但不知何故不适用于我的同事机器。将单元格转换为字符串修复了以下问题:

        import datetime
        
        from openpyxl import load_workbook
        from openpyxl.styles import Alignment
        
        xlsx_file = 'file.xlsx'
        
        date_format = '%Y-%b-%d'
        
        # openning:
        wb = load_workbook(filename = xlsx_file)
        
        # we also center align that column:
        alignment = Alignment(horizontal='center')
        
        # apply python date format to column H of the default sheet, and convert the column to Excel text:
        ws = wb.active
        for row in ws[2:ws.max_row]:        # skip the header
            cell = row[7]   # column H
            if isinstance(cell.value, datetime.datetime):
                cell.value = cell.value.strftime(date_format)
                cell.alignment = alignment
        
        # saving:
        wb.save(xlsx_file)
        

        同样的包装在一个脚本中:

        #!/usr/bin/env python3
        
        import argparse
        import datetime
        
        from openpyxl import load_workbook
        from openpyxl.styles import Alignment
        
        
        # ==============
        ## parsing args:
        
        desc="""
        
        Applies python date format to a given column of the xlsx file (default sheet) and converts the column to a Excel text format.
        
        Dependencies:
        pip3 install --user --upgrade openpyxl
        """
        
        parser = argparse.ArgumentParser(description=desc, formatter_class=argparse.RawDescriptionHelpFormatter)
        parser.add_argument('--version', action='version', version='%(prog)s 0.01')
        
        parser.add_argument('-f', '--file',
                            help = "xlsx file",
                            dest = 'xlsx_file',
                            type = argparse.FileType('r'),
                            )
        
        parser.add_argument('-c', '--column',
                            help = "column (starting from A) (default to %(default)s)",
                            dest = 'column',
                            type = str,
                            default = "A",
                            )
        
        parser.add_argument('-d', '--date-format',
                            help = "date format to use, e.g. %%d.%%m.%%Y (default to %(default)s)",
                            dest = 'date_format',
                            type = str,
                            default = '%Y-%b-%d',
                            )
        
        args = parser.parse_args()
        
        
        # =========
        ## program:
        
        xlsx_file = args.xlsx_file.name
        
        column_number = sum(
            [ ord(char) - 97 + i*26  for i,char in enumerate(
                list( args.column.lower() )
                ) ]
        )
        
        # openning:
        wb = load_workbook(filename = xlsx_file)
        
        # we also center align that column:
        alignment = Alignment(horizontal='center')
        
        # apply python date format to a given column of the default sheet, and convert the column to Excel text:
        ws = wb.active
        for row in ws[2:ws.max_row]:        # skip the header
            cell = row[column_number]
            if isinstance(cell.value, datetime.datetime):
                cell.value = cell.value.strftime(args.date_format)
                cell.alignment = alignment
        
        # saving:
        wb.save(xlsx_file)
        

        【讨论】:

          【解决方案6】:

          我发现这行得通。虽然使用了 number_format,但它似乎可以识别放入 excel wb 时指定的日期格式。

          import datetime
          date = datetime.date(2020, 2, 24) # python datetime format is yyyy mm dd
          ws.cell(row=[row_ref], column=[col_ref], value=date)
          ws.cell(row=[row_ref], column=[col_ref]).number_format = 'dd/mm/yy'
          

          【讨论】:

            猜你喜欢
            • 2010-12-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-09-03
            • 2015-10-08
            • 2021-04-19
            • 1970-01-01
            • 2016-01-02
            相关资源
            最近更新 更多