2017-11-16 6 views
1

날짜가 xlsxwriter의 정렬 설정을 무시한 채로 셀의 오른쪽 하단에 표시됩니다. MWE :python xlsxwriter가 날짜를 맞 춥니 다.

import pandas 

df = pandas.DataFrame(
    { 
     "ints": [1, 2, 3] 
     , 'primes': [2, 3, 5] 
     , 'odds': [1, 3, 5] 
     , 'fechas': ['2017-04-07', '2017-05-09', '2017-11-30'] 
    } 
) 

df['fechas'] = pandas.to_datetime(df['fechas']).dt.date 

print(df) 

xlsx_writer = pandas.ExcelWriter(
    'test.xlsx' 
    , engine='xlsxwriter' 
    , date_format='mm/dd/yyyy' 
) 

df.to_excel(xlsx_writer, sheet_name='Sheet1', index=False) 
wb = xlsx_writer.book 
ws = xlsx_writer.sheets['Sheet1'] 


dollar_format = '_($* #,##0.00" "_);_($* (#,##0.0);_($* "-"??_);_(@_)' 
dollar_format_wb = wb.add_format({'num_format': dollar_format, 'valign': 'vcenter'}) 
centre_format_wb = wb.add_format({'align': 'center', 'valign': 'vcenter'}) 

ws.set_column('A:A', 25, centre_format_wb) 
ws.set_column('B:B', 20, centre_format_wb) 
ws.set_column('C:C', 15, centre_format_wb) 
ws.set_column('D:D', 10, dollar_format_wb) 

# The code below was included to generate the screenshot, but isn't 
# strictly necessary for the MWE 
shadedrow_format_wb = wb.add_format(
    { 
     'bg_color': '#EEEEEE' 
     , 'left': 1 
     , 'left_color': '#FFFFFF' 
    } 
) 

for r in range(0, 2 + df.shape[0]): 
    ws.set_row(r + 1, 45) 
    print(r) 
    if r % 2 == 0: 
     # a kludge as we can't change cell range formats after the fact without re-entering cell contents 
     ws.conditional_format('A{:}:D{:}'.format(r, r), {'type': 'no_errors', 'format': shadedrow_format_wb}) 
     print("\t", r) 

xlsx_writer.save() 

열 A, B, C 및 수평 중심되어야하고, 모든 셀의 내용이 중심 수직으로 헤더를 제외한 모든 열은, 높이 45이어야한다.

excel screen shot

모두는 날짜 열을 제외하고 ,해야처럼 작동합니다. 이것이 작동하지 않아야하는 좋은 이유가 있습니까? 날짜를 중앙에 올리는 올바른 방법이 있습니까? 그게 버그 야? 해결 방법이 있습니까?

나는 시트를 먼저 포맷하고, 효과없이 마지막으로 df.to_excel()을 실행 해 보았습니다.

감사합니다.

+0

사과 - 내가 편집이 더 나은 사소한했다한다는 것은 무시 이해력 (그리고 더 정확한 제목을 만들었습니다.) – GoneAsync

답변

1

팬더를 사용하여 .xlsx 출력에서 ​​원하는 날짜 형식을 얻는 방법의 예를 제공했습니다. 또한 datetime 모듈을 추가해야합니다.

@jmcnamara가 언급했듯이, 가장 유연한 솔루션은 xlsxwriter를 직접 사용하는 것입니다.

여기에 link to another SO answer이 있는데,이 형식은 Excel의 "직렬 날짜"형식에 대한 배경 지식을 더 많이 제공하며 파이썬의 datetime 개체에서 가져옵니다. 이는 필자가 컬럼을 엑셀 날짜로 변환 한 것과 본질적으로 같습니다. 또한 추가 형식 ("centre_date_format_wb")을 추가했습니다.

import pandas 
import datetime 

df = pandas.DataFrame(
    { 
     "ints": [1, 2, 3] 
     , 'primes': [2, 3, 5] 
     , 'odds': [1, 3, 5] 
     , 'fechas': ['2017-04-07', '2017-05-09', '2017-11-30'] 
    } 
) 

df['fechas'] = pandas.to_datetime(df['fechas']).dt.date 


excel_start_date = datetime.date(1899, 12, 30) 
df['fechas'] = df['fechas'] - excel_start_date 
df.fechas = df.fechas.dt.days 

print(df) 

xlsx_writer = pandas.ExcelWriter(
    'test.xlsx' 
    , engine='xlsxwriter' 
) 

df.to_excel(xlsx_writer, sheet_name='Sheet1', index=False) 
wb = xlsx_writer.book 
ws = xlsx_writer.sheets['Sheet1'] 


dollar_format = '_($* #,##0.00" "_);_($* (#,##0.0);_($* "-"??_);_(@_)' 
dollar_format_wb = wb.add_format({'num_format': dollar_format, 'valign': 'vcenter'}) 
centre_format_wb = wb.add_format({'align': 'center', 'valign': 'vcenter'}) 
#additional format added below 
centre_date_format_wb = wb.add_format({'align': 'center', 'valign': 'vcenter', 'num_format' : 'mm/dd/yyyy' }) 

ws.set_column('A:A', 25, centre_date_format_wb) 
ws.set_column('B:B', 20, centre_format_wb) 
ws.set_column('C:C', 15, centre_format_wb) 
ws.set_column('D:D', 10, dollar_format_wb) 

# The code below was included to generate the screenshot, but isn't 
# strictly necessary for the MWE 
shadedrow_format_wb = wb.add_format(
    { 
     'bg_color': '#EEEEEE' 
     , 'left': 1 
     , 'left_color': '#FFFFFF' 
    } 
) 

for r in range(0, 2 + df.shape[0]): 
    ws.set_row(r + 1, 45) 
    print(r) 
    if r % 2 == 0: 
     # a kludge as we can't change cell range formats after the fact without re-entering cell contents 
     ws.conditional_format('A{:}:D{:}'.format(r, r), {'type': 'no_errors', 'format': shadedrow_format_wb}) 
     print("\t", r) 

xlsx_writer.save() 

그리고 그 결과 워크 시트의 이미지 :

여기에 전체 내 추가/변경 코드의

Solution image

+0

아름다운 @ patrickjlong1! 고맙습니다! Excel 기본 날짜가 내 머리를 맞 춥니 다. 이것이 교차 플랫폼에서 작동하는지 여부를 알고 계십니까? – GoneAsync

+0

@GoneSync,이 예제에는 플랫폼 간 문제가 없어야한다고 생각합니다. 그것은 멀리 디렉토리 또는 폴더 경로를 유지하므로 나는 그것이 리눅스 또는 Windows 용 안전해야한다고 생각합니다. – patrickjlong1

+0

Excel 기본 날짜가 내 머리를 맞 춥니 다. 기본 날짜의 버전과 플랫폼의 차이점에 대해 더 많이 걱정했습니다. * 이전 버전의 Excel은 Lotus 1의 버그를 의도적으로 복제했기 때문에 하루가 지나갔습니다. 2-3, 그리고 Mac은 1904를 대신 사용했습니다 ... 아마도 그럴 수는 없지만, 혼란은 필자가 생각하는 것보다 더 많은 시간을 소비하는 개발자에게 의존함으로써 항상 피하려했던 것입니다. 당신이 @ jmcnamara의 제안은 내가 트랙을 다운 시키면 더 강력한 폴백이 될 것이라고 말하고 있지만 이것을 대답으로 받아 들였습니다. 둘 다 감사합니다 !! – GoneAsync

1

팬더가 날짜 형식으로 셀을 적용하고 있는데이 문제는 열 형식을 무시합니다.

해결 방법은 데이터 프레임을 반복하고 XlsxWriter에 직접 쓰고 원하는 모든 형식을 적용하는 것입니다.

+0

@jmcnamara에 감사드립니다. - 팬더로 가져 가서 그 동안 당신의 제안을 사용하겠습니다. – GoneAsync