Как изменить формат даты при записи в файл Excel с использованием openpyxl - PullRequest
0 голосов
/ 08 июня 2019

Я хочу преобразовать формат даты из dd-mm-yy в mm-yy во время записи в файл Excel.Я перепробовал все методы, но безуспешно.Я пытаюсь скопировать данные из одного файла Excel и вставить его в другой.Но дата все испортила.

Это мой оригинальный документ.Откуда код скопирует данные: This is my original Document. From where the code will copy the data

Вот как это отображается в файле Excel назначения:
This is how it gets displayed in destination excel file.

Я использовал Openpyxl, Pandas для того же.

Ответы [ 2 ]

0 голосов
/ 08 июня 2019

Чтобы достичь желаемого, необходимо создать именованный стиль и назначить его для каждой ячейки. Вот рабочий пример:

import pandas as pd
from openpyxl import Workbook
from openpyxl.styles import NamedStyle
# Create a dataframe having a column of dates
df = pd.DataFrame({'DATE':pd.date_range(start='2018-1-1', end='2019-1-1')})
df = df.assign(DATE2=df["DATE"])
df = df.assign(DATE3=df["DATE"])
# Create a excel work book
ewb = pd.ExcelWriter('test.xlsx', engine="openpyxl")
# Create a named style
nsmmyy=NamedStyle(name="cd1", number_format="MM-YY")
nsmmmyy=NamedStyle(name="cd2", number_format="MMM-YY")
nsbyy=NamedStyle(name="cd3", number_format="MMMM-YY")
# Write dataframe to workbook
df.to_excel(excel_writer=ewb, sheet_name="SHT1")
# Get the work book by name
ws = ewb.book["SHT1"]
# For each cell in the column set the named style
# Add +2 to the number of rows since excel index starts from 1
for i in range(1, len(df) + 2):
    # Pass column argument as 2, since column 1 will have dataframe index
    ws.cell(row=i, column=2).style = nsmmyy
    ws.cell(row=i, column=3).style = nsmmmyy
    ws.cell(row=i, column=4).style = nsbyy
# Save work book
ewb.save()

Вот как будет выглядеть итоговый лист Excel:

enter image description here

0 голосов
/ 08 июня 2019

Проблема в том, что вы все еще пишете datetime - вам нужно преобразовать их в строку перед записью (вы теряете все, кроме того, что у вас есть внутри строки) или установить числовой формат вашей ячейки:

from openpyxl import Workbook                    # openpyxl  2.6.2
from openpyxl.utils import get_column_letter

import datetime

basedate = datetime.datetime.today() 

# create some demo dates, roughly -5 to +5 months
some_dates = [basedate + datetime.timedelta(days = i*30) for i in range(-5,6)]
print(some_dates)

# create a workbook
wb = Workbook() 
ws1 = wb.active
ws1.title = "dates"
ws1["A1"] = "Daaaaaaaaates"
# fill dates manually to enable cell formatting
for i, date in enumerate(some_dates,2):
    ws1[f"A{i}"] = date                # no format

    ws1[f"B{i}"] = date                # formatted to MM.YY
    cell = ws1.cell(column=2, row=i)   # get cell and change format
    cell.number_format = "MM.YY"       # use 'MM-YY' if you want a dash between month/year

    # uncomment if you want to store the stringified version directly
    # ws1[f"C{i}"] = date.strftime("%m.%y")

wb.save(filename = 'workbook.xlsx')

это дает вам распечатанный список

[datetime.datetime(2019, 1, 9, 17, 1, 57, 329142), 
 datetime.datetime(2019, 2, 8, 17, 1, 57, 329142), 
 datetime.datetime(2019, 3, 10, 17, 1, 57, 329142), 
 datetime.datetime(2019, 4, 9, 17, 1, 57, 329142), 
 datetime.datetime(2019, 5, 9, 17, 1, 57, 329142), 
 datetime.datetime(2019, 6, 8, 17, 1, 57, 329142), 
 datetime.datetime(2019, 7, 8, 17, 1, 57, 329142), 
 datetime.datetime(2019, 8, 7, 17, 1, 57, 329142), 
 datetime.datetime(2019, 9, 6, 17, 1, 57, 329142), 
 datetime.datetime(2019, 10, 6, 17, 1, 57, 329142), 
 datetime.datetime(2019, 11, 5, 17, 1, 57, 329142)]

и экспортированный файл (OpenOffice использовался для открытия), который выглядит следующим образом:

Exported xlss

HTH

...