我发现,我原来用的多个工作簿存入的方法,发现不太可行,如果我用原来的方法,然后for循环,新的dataframe会把原来的覆盖掉,然后只剩下一个工作薄。原先的代码:
with pd.ExcelWriter(file_name ) as writer:
Table.to_excel(writer, sheet_name=sheet_name, index=False)
当使用for循环的时候,原来的sheet 会被新的表给覆盖掉。先用一堆的dfs来测试一下:
import pandas as pd
df1 = pd.DataFrame({'Column1': range(5), 'Column2': range(5, 10)})
df2 = pd.DataFrame({'Column1': range(10, 15), 'Column2': range(10, 15)})
df3 = pd.DataFrame({'Column1': range(20, 25), 'Column2': range(20, 25)})
dataframes = []
dataframes.append(df1)
dataframes.append(df2)
dataframes.append(df3)
这里运行完了以后,我们现在有多个dataframe的表,现在需要一个个将他们存入到excel的不同的工作簿中。如果是给上面的方法加一个for循环,【错误示范】!!!!:
file_name="./tese.xlsx"
for i in range(len(dataframes)):
Table=dataframes[i]
sheet_name ="sheet_"+str(i)
with pd.ExcelWriter(file_name ) as writer:
Table.to_excel(writer, sheet_name=sheet_name, index=False)
结果报出来的结果是只有最后一个工作簿!!!多个dataframe也没法全部存进去。
with pd.ExcelWriter(file_name ) as writer
这段代码表示,pandas创建一个 ExcelWriter 对象,它负责管理写入Excel文件的过程,在我上面的例子中,使用 它来写入数据到file_name 文件里,并将 df DataFrame中的数据写入到这个文件下的,名为sheet_name
的工作表中。
也就是说,我在遍历所有的df,然后反复打开excel,反复存进去。每次修改都是覆盖原来的内容,所以最后,Excel只剩下最新一个df的数据。
逻辑应该是这样的:
- 读取excel表 ,把
with pd.ExcelWriter(file_name ) as writer
写在最外层- 获取多个dataframe遍历(
for
循环dataframes)!!!- 注意存入的时候,要起好sheet_name。不同的df如果要存入不同的工作簿,就要起不同的
sheet_name
,不然还是会覆盖
【正确的改法】:
file_name="./tese.xlsx"
with pd.ExcelWriter( file_name ) as writer: #读取excel表,写在最外层
for i in range(len(dataframes)): #for循环获取多个dataframe遍历
sheet_name ="sheet_"+str(i) #起不同的表名
Table=dataframes[i]
Table.to_excel(writer, sheet_name=sheet_name, index=False)
结果:
或者使用 openpyxl 库的方法。
这需要为每个工作簿创建一个 Worksheet
对象,并将它们保存到同一个工作簿(Workbook)中。
这个方法我没怎么用,如果是比较少工作簿的情况下,确实可以使用,不过我用上面的方法更多一点。
from openpyxl import Workbook
# 创建一个新的工作簿
wb = Workbook()
# 添加多个工作表
ws1 = wb.active
ws1.title = "Sheet 1"
ws1.append(["Column 1", "Column 2", "Column 3"]) # 添加标题行
ws1.append([1, 2, 3]) # 添加数据行
ws2 = wb.create_sheet("Sheet 2")
ws2.append(["Column A", "Column B"])
ws2.append([4, 5])
# 可以继续添加更多的工作表...
# 保存工作簿
wb.save("multiple_sheets.xlsx")
结果:
这个方法也可以实现效果,两个表都顺利存入了。