读取csv文件并将df写入带有文本换行的excel

Posted

技术标签:

【中文标题】读取csv文件并将df写入带有文本换行的excel【英文标题】:Reading csv file and writing the df to excel with text wrap 【发布时间】:2018-02-07 16:38:30 【问题描述】:

我正在尝试获得以下输出。除了标题之外,所有行和列都是文本包装:

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 等,以便我将打开标题,因此所有行和列都将被格式化

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

【问题讨论】:

我建议您编辑问题以包含来自 Excel 的屏幕截图,显示您希望数据如何显示。 列格式不适用于第一行的标题单元格,因为 Pandas 已经对这些单元格应用了单元格格式并覆盖了列格式。请参阅此 SO 问题中的 following workaround 和解释。 我试过 pd.formats.format.header_style = None 它抛出错误模块 'pandas' has no attribute 'formats' 那么你的 Pandas 版本可能早于 0.18.1。尝试链接答案中显示的旧版本:pd.core.format.header_style = None 好的!非常感谢你:) 【参考方案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 和 row 1 都已格式化:

    Col A0Row 10

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

以下内容可能会更清楚一点:

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()

这会给你:

注意: 也可以告诉 Pandas 要使用的样式,或者强制它为None,这样它就会继承你自己的样式。这种方法的唯一缺点是所需的方法取决于正在使用的 Pandas 版本。这种方法适用于所有版本。

【讨论】:

Col A 为 0,第 1 行为 0 不起作用 :( 中心对齐有效,但文本换行无效。在 C1 行中,有一个标题空间很大,它不换行文本:( 请在您的问题中添加您想要获得的内容的屏幕截图(即在 Excel 中手动制作正确外观的屏幕截图)。 我添加了截图。请调查一下 我已更新脚本以解决标题行文本换行的问题。 在日期的 excel 中出现 2 位错误的文本日期!有可能解决吗?

以上是关于读取csv文件并将df写入带有文本换行的excel的主要内容,如果未能解决你的问题,请参考以下文章

如何在同一循环中“从 .csv 读取并写入 excel”

sh 将带有标题行的CSV /文本类型文件拆分为多个文件,并将标题行复制到每个文件中。

vb6.0关于.csv文件的操作

pandas-19 DataFrame读取写入文件的方法

用python模糊检索EXCEL文件的内容,并写入新的EXCEL表?

nodejs对于文件的一些基本操作-读取文件-文件的写入-文件的拷贝-文件追加信息-读取指定路径下的所有文件路径-解决一个传入行的文本换行效果不起作用的问题- 删除文件操作