【问题标题】:Python: Writing Images and dataframes to the same excel filePython:将图像和数据帧写入同一个 excel 文件
【发布时间】:2019-01-07 02:54:26
【问题描述】:

我正在创建一个 excel 仪表板,我想生成一个 excel 工作簿,其中一半的工作表上有一些数据框,另一半有 .png 文件。我很难一次性将它们写入同一个文件。这是我目前拥有的。似乎当我运行我的 for 循环时,它不会让我添加额外的工作表。关于如何将图像文件添加到此工作簿的任何建议?我找不到任何关于为什么我不能添加更多工作表的信息 谢谢!

dfs = dict()
dfs['AvgVisitsData'] = avgvisits
dfs['F2FCountsData'] = f2fcounts

writer = pd.ExcelWriter("MyData.xlsx", engine='xlsxwriter')
for name, df in dfs.items():
    df.to_excel(writer, sheet_name=name, index = False)

然后我想在同一个 Excel 工作簿中添加几张带有一些图像的工作表。像这样的东西,但我不是在创建一个全新的工作簿。

workbook = xlsxwriter.Workbook('MyData.xlsx')
worksheet = workbook.add_worksheet('image1')
worksheet.insert_image('A1', 'MemberCollateral.png')

有人有解决此问题的提示吗?

【问题讨论】:

  • 什么不起作用?这看起来像您正在创建第二个工作簿。
  • @mauve 对。我想继续添加到我的初始 MyData.xlsx 文件中。我只是以第二个代码块为例。您将如何执行第一段代码然后在新工作表上添加 MemberCollat​​eral.png 文件?
  • 您应该可以通过writer.book 属性访问工作簿。
  • @mauve 你有什么链接可以让我看看可能有用的吗?
  • 试试writer.sheets['your sheet name'].insert_image(...)

标签: python excel pandas


【解决方案1】:

以下是如何获取底层 XlsxWriter 工作簿和工作表对象的句柄并插入图像的示例:

import pandas as pd


# Create a Pandas dataframe from some data.
df = pd.DataFrame({'Data': [10, 20, 30, 20, 15, 30, 45]})

# Create a Pandas Excel writer using XlsxWriter as the engine.
writer = pd.ExcelWriter('pandas_image.xlsx', engine='xlsxwriter')

# Convert the dataframe to an XlsxWriter Excel object.
df.to_excel(writer, sheet_name='Sheet1')

# Get the xlsxwriter workbook and worksheet objects.
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

# Insert an image.
worksheet.insert_image('D3', 'logo.png')

# Close the Pandas Excel writer and output the Excel file.
writer.save()

输出:

有关更多示例,另请参阅 XlsxWriter 文档中的 Working with Python Pandas and XlsxWriter

【讨论】:

    【解决方案2】:

    这是我想出的解决方案。如果不使用load_workbook 重新导入工作簿,我仍然无法找到一种方法,但这完成了工作。

    # assign dataframes to dictionary and export them to excel
    avgvisits = pd.DataFrame(pd.read_sql(avgvisits(), cnxn))
    f2fcounts = pd.DataFrame(pd.read_sql(f2fcounts(), cnxn))
    activityencounters = pd.DataFrame(pd.read_sql(ActivityEncounters(), cnxn))
    activityencountersp = activityencounters.pivot_table(values='ActivityCount', index = ['Activity'], columns= ['QuarterYear'], aggfunc=np.max)
    
    dfs = dict()
    dfs['AvgVisitsData'] = avgvisits
    dfs['F2FIndirect'] = f2fcounts
    dfs['ActivityEncounters'] = activityencountersp
    
    writer = pd.ExcelWriter("MyData.xlsx", engine='xlsxwriter')
    for name, df in dfs.items():
        if name != 'ActivityEncounters':
            df.to_excel(writer, sheet_name=name, index=False)
        else:
            df.to_excel(writer, sheet_name=name, index=True)
    
    writer.save()
    writer.close()
    
    # re-import the excel book and add the graph image files
    wb = load_workbook('MyData.xlsx')
    png_loc = 'MemberCollateral.png'
    wb.create_sheet('MemberCollateralGraph')
    ws = wb['MemberCollateralGraph']
    my_png = openpyxl.drawing.image.Image(png_loc)
    ws.add_image(my_png, 'A1')
    
    png_loc = 'DirectIndirect.png'
    ws = wb['F2FIndirect']
    my_png = openpyxl.drawing.image.Image(png_loc)
    ws.add_image(my_png, 'A10')
    
    png_loc = 'QuarterlyActivitySummary.png'
    ws = wb['ActivityEncounters']
    my_png = openpyxl.drawing.image.Image(png_loc)
    ws.add_image(my_png, 'A10')
    wb.save('MyData.xlsx')
    

    【讨论】:

    • 您是否尝试过我发布的答案中的解决方案?
    猜你喜欢
    • 2021-09-06
    • 2019-01-16
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多