读取csv文件并使用文本换行将df写入excel

时间:2017-08-30 05:13:49

标签: python pandas format

我想获得以下输出。除了标题之外,所有行和列都是文本换行的:

Excel screenshot

import pandas as pd
    import pandas.io.formats.style
    import os
    from pandas import ExcelWriter
    import numpy as np

    from xlsxwriter.utility import xl_rowcol_to_cell
    writer = pd.ExcelWriter('test1.xlsx',engine='xlsxwriter',options={'strings_to_numbers': True},date_format='mmmm dd yyyy')  
    df = pd.read_csv("D:\\Users\\u700216\\Desktop\\Reports\\CD_Counts.csv")
    df.to_excel(writer,sheet_name='Sheet1',startrow=1 , startcol=1, header=True, index=False, encoding='utf8')  
    workbook  = writer.book
    worksheet = writer.sheets['Sheet1']

    format = workbook.add_format()
    format1 = workbook.add_format({'bold': True, 'align' : 'left'})
    format.set_align('Center')
    format1.set_align('Center')
    format.set_text_wrap()
    format1.set_text_wrap()
    worksheet.set_row(0, 20, format1)
    worksheet.set_column('A:Z', 30, format)
    writer.save()

格式适用于除标题之外的所有行和列。我不知道为什么格式不应用于第一列(标题)或我想手动添加列标题数字,如0,1,2等,以便我将转向标题因此所有的行和列将被格式化< / p>

在上面的截图中,换行文本不适用于A1到E1,C1列有很多空格的标题。如果我手动点击换行文本它会对齐,否则所有标题都不会使用文本换行格式化。

1 个答案:

答案 0 :(得分:3)

有几个问题:

  1. 您的代码正在尝试格式化标题,但是当您使用.to_excel()创建文件时,您会告诉它从行/列1, 1开始。虽然单元格的编号为0, 0。所以,如果你改为:

    df.to_excel(writer,sheet_name='Sheet1', startrow=0, startcol=0, header=True, index=False, encoding='utf8')  
    

    您会看到col A和行1都是格式化的:

    excel screenshot

    即。 Col A0Row 10

  2. 使用Pandas编写标题时,它会应用自己的格式,这将覆盖您提供的格式。要解决此问题,请关闭标题并使其仅从第1行开始写入数据并手动编写标题。

  3. 以下可能会更清楚:

    import pandas as pd
    import pandas.io.formats.style
    import os
    from pandas import ExcelWriter
    import numpy as np
    
    from xlsxwriter.utility import xl_rowcol_to_cell
    
    writer = pd.ExcelWriter('test1.xlsx', engine='xlsxwriter', options={'strings_to_numbers': True}, date_format='mmmm dd yyyy')  
    #df = pd.read_csv("D:\\Users\\u700216\\Desktop\\Reports\\CD_Counts.csv")
    df = pd.read_csv("CD_Counts.csv")
    df.to_excel(writer, sheet_name='Sheet1', startrow=1 , startcol=0, header=False, index=False, encoding='utf8')  
    workbook  = writer.book
    worksheet = writer.sheets['Sheet1']
    
    format_header = workbook.add_format()
    format_header.set_align('center')
    format_header.set_bold()
    format_header.set_text_wrap()
    format_header.set_border()
    
    format_data = workbook.add_format()
    format_data.set_align('center')
    format_data.set_text_wrap()
    
    worksheet.set_column('A:Z', 20, format_data)
    worksheet.set_row(0, 40, format_header)
    
    # Write the header manually
    for colx, value in enumerate(df.columns.values):
        worksheet.write(0, colx, value)
    
    writer.save()
    

    哪会给你:

    header with text wrap from pandas

    注意:也可以告诉Pandas使用的样式,或强制它None,以便它继承自己的风格。该方法的唯一缺点是,执行此操作所需的方法取决于正在使用的Pandas的版本。这种方法适用于所有版本。