【问题标题】:python: update dataframe to existing excel sheet without overwriting contents on the same sheet and other sheetspython:将数据框更新到现有的excel工作表而不覆盖同一张工作表和其他工作表上的内容
【发布时间】:2016-08-19 23:53:01
【问题描述】:

为此苦苦挣扎了几个小时,所以我决定在这里向专家寻求帮助:

我想修改现有的 Excel 工作表而不覆盖内容。 我在这个 excel 文件中有其他工作表,我不想影响其他工作表。

我已经创建了示例代码,但不确定如何添加我想要保留的第二张工作表。

t=pd.date_range('2004-01-31', freq='M', periods=4)
first=pd.DataFrame({'A':[1,1,1,1],
             'B':[2,2,2,2]}, index=t)
first.index=first.index.strftime('%Y-%m-%d')
writer=pd.ExcelWriter('test.xlsx')
first.to_excel(writer, sheet_name='Here')
first.to_excel(writer, sheet_name='Keep')

#how to update the sheet'Here', cell A5:C6 with following without overwriting the rest?
#I want to keep the sheet "Keep"
update=pd.DataFrame({'A':[3,4],
                     'B':[4,5]}, index=pd.date_range('2004-04-30', 
                                                     periods=2,
                                                     freq='M'))

我研究过 SO。但不确定如何将数据框写入工作表。

我试过的例子:

import openpyxl
xfile = openpyxl.load_workbook('test.xlsx')
sheet = xfile.get_sheet_by_name('test')
sheet['B5']='wrote!!'
xfile.save('test2.xlsx')

【问题讨论】:

    标签: python pandas openpyxl xlrd


    【解决方案1】:

    我自己想出来的:

    #Prepare the excel we want to write to
    t=pd.date_range('2004-01-31', freq='M', periods=4)
    first=pd.DataFrame({'A':[1,1,1,1],
                 'B':[2,2,2,2]}, index=t)
    first.index=first.index.strftime('%Y-%m-%d')
    writer=pd.ExcelWriter('test.xlsx')
    first.to_excel(writer, sheet_name='Here')
    first.to_excel(writer, sheet_name='Keep')
    
    #read the existing sheets so that openpyxl won't create a new one later
    book = load_workbook('test.xlsx')
    writer = pandas.ExcelWriter('test.xlsx', engine='openpyxl') 
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
    
    #update without overwrites
    update=pd.DataFrame({'A':[3,4],
                         'B':[4,5]}, index=(pd.date_range('2004-04-30', 
                                                         periods=2,
                                                         freq='M').strftime('%Y-%m-%d')))
    
    update.to_excel(writer, "Here", startrow=1, startcol=2)
    
    writer.save()
    

    【讨论】:

      【解决方案2】:

      我建议您更新到 openpyxl 的 2.4(测试版或结帐版)并使用数据帧的内置支持。这些现在可以通过 openypxl 轻松转换为您想要使用的行。

      详情请见http://openpyxl.readthedocs.io/en/latest/pandas.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-07
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 2018-06-07
        • 1970-01-01
        相关资源
        最近更新 更多