使用 pandas DataFrame 数据创建多个 Excel 工作表。

71

我有一个工作表,已经读入到dataframe中,并使用了向前填充(ffill)方法。

然后,我想创建一个单独的Excel文档,在其中包含两个工作表。

一个工作表将包含应用ffill方法之前的dataframe中的数据,下一个工作表将包含已经应用ffill方法的dataframe。

最终,我打算为dataframe某一列中的每个唯一实例创建一个工作表。

接下来,我希望对结果应用一些VBA格式设置-但是我不确定需要调用哪个DLL或插件或其他内容使用Python调用Excel VBA格式化标题为粗体并添加颜色等。

我已经部分成功,即xlsxwriter可以创建新工作簿并添加工作表,但dataframe.to_excel操作似乎无法在其创建的工作簿上运行,工作簿打开但工作表为空。

import os
import time
import pandas as pd
import xlwt
from xlwt.Workbook import *
from pandas import ExcelWriter
import xlsxwriter

#set folder to import files from
path = r'path to some file'
#folder = os.listdir(path)

#for loop goes here

#get date
date = time.strftime('%Y-%m-%d',time.gmtime(os.path.getmtime(path)))

#import excel document
original = pd.DataFrame()
data = pd.DataFrame()

original = pd.read_excel(path,sheetname='Leave',skiprows=26)
data = pd.read_excel(path,sheetname='Leave',skiprows=26)

print (data.shape)
data.fillna(method='ffill',inplace=True)

#the code for creating the workbook and worksheets
wb= Workbook()
ws1 = wb.add_sheet('original')
ws2 = wb.add_sheet('result')
original.to_excel(writer,'original')
data.to_excel(writer,'result')
writer.save('final.xls')

下面的示例展示了如何使用xlsxwriter Python库创建工作簿并插入工作表,然后从pandas数据框中插入数据,甚至可以根据数据框中的数据插入图表到Excel中。http://pandas-xlsxwriter-charts.readthedocs.org/chart_grouped_column.html#chart-grouped-column - yoshiserry
4个回答

84
import pandas as pd

df1 = pd.DataFrame({'Data': ['a', 'b', 'c', 'd']})    
df2 = pd.DataFrame({'Data': [1, 2, 3, 4]})  
df3 = pd.DataFrame({'Data': [1.1, 1.2, 1.3, 1.4]})

with pd.ExcelWriter('multiple.xlsx', engine='xlsxwriter') as writer:
    df1.to_excel(writer, sheet_name='Sheeta')
    df2.to_excel(writer, sheet_name='Sheetb')
    df3.to_excel(writer, sheet_name='Sheetc')

7
太棒了!它可以是engine='openpyxl',当它显示“ModuleNotFoundError: No module named 'xlsxwriter'”时。 - Mark K
谢谢,Kalyan... 它定义得如此简单。 - Shyam Bhagat
3
这也可以在 with 块中使用。即 with pd.ExcelWriter('multiple.xlsx', engine='xlsxwriter') as writer:,意味着退出块将自动关闭/保存文件。 - Jake Ireland
我在编辑之前的示例在较新版本的pandas中无法正常工作,原因是(https://stackoverflow.com/questions/76090979/xlsxwriter-object-has-no-attribute-save-did-you-mean-save)。我已经修改了代码示例。 - undefined

56

你的示例代码几乎正确,除了需要创建writer对象,而且不需要使用add_sheet()方法。下面的代码应该可以工作:

# ...
writer = pd.ExcelWriter('final.xlsx')
data.to_excel(writer,'original')

# data.fillna() or similar.

data.to_excel(writer,'result')
writer.close()
# ...

正确的语法在Pandas DataFrame.to_excel()文档的末尾显示。

另请参阅使用Python Pandas和XlsxWriter进行工作


jmcnamara - 注意,当创建多个工作簿时,该语法无效。请改用我的链接中的xlsxwriter库。 - yoshiserry
8
语法应该没问题,我测试过了。另外,我就是你提到的那篇文档和 XlsxWriter 模块的作者。:-) - jmcnamara
1
jmcnamara - 已接受您的答案,感谢您编写了xlsxwriter模块。我很抱歉。 - yoshiserry
你能否提供你所写的含有add_sheet命令函数的代码,使其能够执行一些简单任务,例如向一个预定义列表中所规定的数量的表格添加相同数据帧? - yoshiserry

1
根据pandas文档,
with pandas.ExcelWriter('final.xlsx') as writer:
    df1.to_excel(writer, sheet_name='original')
    df2.to_excel(writer, sheet_name='result')

您可以在官方文档中找到更多详细信息。


1

如果需要,您可以使用循环来创建更多的工作表:

with pd.ExcelWriter(".xlsx", engine = "openpyxl", mode = "w") as writer:
    for i in range(5):
        #do something()
        df.to_excel(writer, sheet_name = "{}".format(i), index = False, engine = "openpyxl")

它将在一个工作簿中生成sheet0、sheet1等(当然,您可以通过修改'sheet_name'来随意命名工作表),这意味着在单个.xlsx文件中。
希望它能对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接