如何使用Pandas在现有的Excel文件中保存新工作表?

Ste*_*ele 51 python pandas openpyxl xlsxwriter

我想使用excel文件来存储用python详细说明的数据.我的问题是我无法将图纸添加到现有的Excel文件中.在这里,我建议使用示例代码来解决此问题

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()
Run Code Online (Sandbox Code Playgroud)

此代码将两个DataFrame保存为两个表,分别名为"x1"和"x2".如果我创建两个新的DataFrame并尝试使用相同的代码添加两个新工作表'x3'和'x4',原始数据将丢失.

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()
Run Code Online (Sandbox Code Playgroud)

我想要一个包含四张纸的excel文件:'x1','x2','x3','x4'.我知道'xlsxwriter'不是唯一的"引擎",有'openpyxl'.我也看到已经有其他人写过关于这个问题的文章,但我仍然无法理解如何做到这一点.

这里是从这个链接获取的代码

import pandas
from openpyxl import load_workbook

book = load_workbook('Masterfile.xlsx')
writer = pandas.ExcelWriter('Masterfile.xlsx', engine='openpyxl') 
writer.book = book
writer.sheets = dict((ws.title, ws) for ws in book.worksheets)

data_filtered.to_excel(writer, "Main", cols=['Diff1', 'Diff2'])

writer.save()
Run Code Online (Sandbox Code Playgroud)

他们说它有效,但很难弄清楚如何.我不明白在这种情况下"ws.title","ws"和"dict"是什么.

哪个是保存"x1"和"x2"的最佳方法,然后关闭文件,再次打开并添加"x3"和"x4"?

Ste*_*ele 71

谢谢.我相信一个完整的例子可能对任何其他人都有好处有一些问题:

import pandas as pd
import numpy as np

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)

writer = pd.ExcelWriter(path, engine = 'xlsxwriter')
df1.to_excel(writer, sheet_name = 'x1')
df2.to_excel(writer, sheet_name = 'x2')
writer.save()
writer.close()
Run Code Online (Sandbox Code Playgroud)

在这里,我生成一个excel文件,根据我的理解,它是通过"xslxwriter"还是"openpyxl"引擎生成并不重要.

当我想写而不丢失原始数据然后

import pandas as pd
import numpy as np
from openpyxl import load_workbook

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"

book = load_workbook(path)
writer = pd.ExcelWriter(path, engine = 'openpyxl')
writer.book = book

x3 = np.random.randn(100, 2)
df3 = pd.DataFrame(x3)

x4 = np.random.randn(100, 2)
df4 = pd.DataFrame(x4)

df3.to_excel(writer, sheet_name = 'x3')
df4.to_excel(writer, sheet_name = 'x4')
writer.save()
writer.close()
Run Code Online (Sandbox Code Playgroud)

这段代码完成了这项工作!

  • 如果有人读到此内容并想知道如何覆盖同名的现有工作表而不是重命名新工作表:在`之后添加行`writer.sheets = dict((ws.title, ws) for ws in book.worksheets)` writer.book = 书` (5认同)
  • 保存Excel文件时,如何保留现有的Excel表格格式? (2认同)
  • @Stefano Fedele 您可以使用“xlsxwriter”而不是“openpyxl”对现有 Excel 进行相同的更新吗? (2认同)
  • 你好@Stefano Fedele,我在 Google Colab 上尝试了你的解决方案,而不是给出完整路径,而是给出了 `ExcelFile.xlsx` ,并且我尝试了使用和不使用 `r` 。该代码有效,但文件已损坏。我不知道为什么。 (2认同)

Grr*_*Grr 14

在您共享的示例中,您正在将现有文件加载到book并将writer.book值设置为book.在writer.sheets = dict((ws.title, ws) for ws in book.worksheets)您正在访问工作簿中的每个工作表的行中ws.然后,工作表标题ws将创建一个{sheet_titles: sheet}键值对的字典.然后将此字典设置为writer.sheets.基本上这些步骤只是从中加载现有数据'Masterfile.xlsx'并用它们填充您的编写器.

现在让我们说你已经有了一个文件x1x2作为表格.您可以使用示例代码加载文件,然后可以执行类似这样的操作来添加x3x4.

path = r"C:\Users\fedel\Desktop\excelData\PhD_data.xlsx"
writer = pd.ExcelWriter(path, engine='openpyxl')
df3.to_excel(writer, 'x3', index=False)
df4.to_excel(writer, 'x4', index=False)
writer.save()
Run Code Online (Sandbox Code Playgroud)

那应该做你想要的.

  • 这是擦除预先存在的纸张. (7认同)

Vis*_*pta 12

每次你想将 Pandas DataFrame 保存到 Excel 时,你可以调用这个函数:

import os

def save_excel_sheet(df, filepath, sheetname, index=False):
    # Create file if it does not exist
    if not os.path.exists(filepath):
        df.to_excel(filepath, sheet_name=sheetname, index=index)

    # Otherwise, add a sheet. Overwrite if there exists one with the same name.
    else:
        with pd.ExcelWriter(filepath, engine='openpyxl', if_sheet_exists='replace', mode='a') as writer:
            df.to_excel(writer, sheet_name=sheetname, index=index)
Run Code Online (Sandbox Code Playgroud)


Won*_*Yau 9

一次将多个数据写入excel的简单示例.当您想要将数据附加到已写入的Excel文件(已关闭的Excel文件)上的工作表时.

当你第一次写信给excel时.(将"df1"和"df2"写入"1st_sheet"和"2nd_sheet")

import pandas as pd 
from openpyxl import load_workbook

df1 = pd.DataFrame([[1],[1]], columns=['a'])
df2 = pd.DataFrame([[2],[2]], columns=['b'])
df3 = pd.DataFrame([[3],[3]], columns=['c'])

excel_dir = "my/excel/dir"

with pd.ExcelWriter(excel_dir, engine='xlsxwriter') as writer:    
    df1.to_excel(writer, '1st_sheet')   
    df2.to_excel(writer, '2nd_sheet')   
    writer.save()    
Run Code Online (Sandbox Code Playgroud)

关闭excel之后,但是你希望在同一个excel文件中"追加"数据而不是另一个工作表,让我们说"df3"到工作表名称"3rd_sheet".

book = load_workbook(excel_dir)
with pd.ExcelWriter(excel_dir, engine='openpyxl') as writer:
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)    

    ## Your dataframe to append. 
    df3.to_excel(writer, '3rd_sheet')  

    writer.save()     
Run Code Online (Sandbox Code Playgroud)

请注意,excel格式不能是xls,您可以使用xlsx.

  • 我看不出这个答案增加了什么。事实上,重复使用这样的上下文管理器会涉及更多的 I/O。 (2认同)

小智 9

用于创建新文件

x1 = np.random.randn(100, 2)
df1 = pd.DataFrame(x1)
with pd.ExcelWriter('sample.xlsx') as writer:  
    df1.to_excel(writer, sheet_name='x1')
Run Code Online (Sandbox Code Playgroud)

对于附加到文件,使用参数mode='a'pd.ExcelWriter

x2 = np.random.randn(100, 2)
df2 = pd.DataFrame(x2)
with pd.ExcelWriter('sample.xlsx', engine='openpyxl', mode='a') as writer:  
    df2.to_excel(writer, sheet_name='x2')
Run Code Online (Sandbox Code Playgroud)

默认为mode ='w'。请参阅文档

  • 这个解决方案并没有覆盖我以前的工作表。 (2认同)
  • 我认为这比公认的答案更好。因为 `.book` 不是公共 API。 (2认同)

Cha*_*ark 7

我强烈建议您直接使用openpyxl,因为它现在支持Pandas DataFrames.

这使您可以专注于相关的Excel和Pandas代码.

  • 如果您可以添加更多类似于[this](http://xlsxwriter.readthedocs.io/working_with_pandas.html)的“ Pandas”示例,这将非常有帮助。 (3认同)

小智 5

可以在不使用 ExcelWriter 的情况下使用 openpyxl 中的工具来完成这可以使使用以下命令更轻松地将字体添加到新工作表openpyxl.styles

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

#Location of original excel sheet
fileLocation =r'C:\workspace\data.xlsx'

#Location of new file which can be the same as original file
writeLocation=r'C:\workspace\dataNew.xlsx'

data = {'Name':['Tom','Paul','Jeremy'],'Age':[32,43,34],'Salary':[20000,34000,32000]}

#The dataframe you want to add
df = pd.DataFrame(data)

#Load existing sheet as it is
book = load_workbook(fileLocation)
#create a new sheet
sheet = book.create_sheet("Sheet Name")

#Load dataframe into new sheet
for row in dataframe_to_rows(df, index=False, header=True):
    sheet.append(row)

#Save the modified excel at desired location    
book.save(writeLocation)
Run Code Online (Sandbox Code Playgroud)