将Pandas数据框转换为Excel工作表

63

我有一个Excel文件(.xls格式),其中包含5个工作表,我想用pandas数据框的内容替换第5个工作表的内容。

3个回答

126

根据您的需求,您需要同时使用Python(导出pandas数据框)和VBA(删除现有工作表内容并复制/粘贴外部数据)。

使用Python:使用to_csvto_excel方法。我推荐使用to_csv方法,它可以更好地处理大型数据集。

# DF TO EXCEL
from pandas import ExcelWriter

writer = ExcelWriter('PythonExport.xlsx')
yourdf.to_excel(writer,'Sheet5')
writer.save()

# DF TO CSV
yourdf.to_csv('PythonExport.csv', sep=',')

使用VBA: 复制粘贴源范围到目标范围。

幸运的是,在VBA中,您可以使用Shell调用Python脚本(假设您的操作系统为Windows)。

Sub DataFrameImport()
  'RUN PYTHON TO EXPORT DATA FRAME
  Shell "C:\pathTo\python.exe fullpathOfPythonScript.py", vbNormalFocus

  'CLEAR EXISTING CONTENT
  ThisWorkbook.Worksheets(5).Cells.Clear

  'COPY AND PASTE TO WORKBOOK
  Workbooks("PythonExport").Worksheets(1).Cells.Copy
  ThisWorkbook.Worksheets(5).Range("A1").Select
  ThisWorkbook.Worksheets(5).Paste
End Sub

或者,您可以反过来做:使用Python运行宏(ClearExistingContent)。确保您的Excel文件是带有已保存用于仅删除第5页内容的宏的宏启用的(.xlsm)文件。注意:无法将宏保存在csv文件中。

import os
import win32com.client
from pandas import ExcelWriter

if os.path.exists("C:\Full Location\To\excelsheet.xlsm"):
  xlApp=win32com.client.Dispatch("Excel.Application")
  wb = xlApp.Workbooks.Open(Filename="C:\Full Location\To\excelsheet.xlsm")

  # MACRO TO CLEAR SHEET 5 CONTENT
  xlApp.Run("ClearExistingContent")
  wb.Save() 
  xlApp.Quit()
  del xl

  # WRITE IN DATA FRAME TO SHEET 5
  writer = ExcelWriter('C:\Full Location\To\excelsheet.xlsm')
  yourdf.to_excel(writer,'Sheet5')
  writer.save() 

1
想让Python单独完成一些任务而不使用VBA,但是没能实现... 不过这个方法也可以完美解决问题 :)。 - gaurav gurnani
3
嘿@Parfait,我使用了这段代码(根据我的需要进行了修改),谢谢 :) 但是我遇到了这个错误: writer = ExcelWriter('Corner_Export.xlsx') df_Entry.to_excel(writer, 'Sheet1') df_Apex.to_excel(writer, 'Sheet2') df_Exit.to_excel(writer, 'Sheet3') writer.save()ImportError: No module named openpyxl - OParker
3
StackOverflow,不断带来福利! :) 看起来您的错误可能与列出的代码无关。您正在导入未安装或错误声明的模块。此解决方案不使用 openpyxl - Parfait
OParker,这是一个旧错误,因为未安装xlsxWriter,pandas默认回退到openpyxl,但似乎也不存在。使用“pip install”应该可以解决您的问题。 - hyamanieu

5
或者你可以像这样做:
your_df.to_excel( r'C:\Users\full_path\excel_name.xlsx',
                  sheet_name= 'your_sheet_name'
                )

0

我测试了在这里找到的先前答案:假设我们希望其他四个工作表保留,那么这里的先前答案不起作用,因为其他四个工作表已被删除。如果我们想要它们保留,请使用xlwings:

import xlwings as xw
import pandas as pd

filename = "test.xlsx"

df = pd.DataFrame([
    ("a", 1, 8, 3),
    ("b", 1, 2, 5),
    ("c", 3, 4, 6),
    ], columns=['one', 'two', 'three', "four"])

app = xw.App(visible=False)
wb = xw.Book(filename)
ws = wb.sheets["Sheet5"]

ws.clear()
ws["A1"].options(pd.DataFrame, header=1, index=False, expand='table').value = df

# If formatting of column names and index is needed as xlsxwriter does it, 
# the following lines will do it (if the dataframe is not multiindex).
ws["A1"].expand("right").api.Font.Bold = True
ws["A1"].expand("down").api.Font.Bold = True
ws["A1"].expand("right").api.Borders.Weight = 2
ws["A1"].expand("down").api.Borders.Weight = 2

wb.save(filename)
app.quit()

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