Python 将dataframe导出到新的excel工作表,并将特定值写入特定工作表

Python 将dataframe导出到新的excel工作表,并将特定值写入特定工作表,python,excel,pandas,dataframe,Python,Excel,Pandas,Dataframe,我遇到了一个问题,我认为需要: 将数据框导出到新的Excel工作表(导出时创建) 将特定值写入同一工作簿中的现有工作表 在循环中执行上述两项 我可以让1号和3号自己工作,我也可以让2号和3号自己工作,但当我尝试做这三件事时,都不起作用。我认为pandas to_excel使用xlsxwriter引擎与工作表冲突存在一些问题。将(行、列、值)写入同一工作簿 例如,它本身就可以工作(注意,我有“writer”的东西要将dataframe导出到新的工作表中,并注释掉): 上面是test.xlsx工作簿

我遇到了一个问题,我认为需要:

  • 将数据框导出到新的Excel工作表(导出时创建)
  • 将特定值写入同一工作簿中的现有工作表
  • 在循环中执行上述两项
  • 我可以让1号和3号自己工作,我也可以让2号和3号自己工作,但当我尝试做这三件事时,都不起作用。我认为pandas to_excel使用xlsxwriter引擎与工作表冲突存在一些问题。将(行、列、值)写入同一工作簿

    例如,它本身就可以工作(注意,我有“writer”的东西要将dataframe导出到新的工作表中,并注释掉):

    上面是test.xlsx工作簿,带有总计工作表,在递增的行/列中有“A1”、“B2”等

    同样,当我注释掉工作簿内容并取消注释pandas export dataframe到新工作表时,也可以:

    import pandas as pd
    import xlsxwriter
    
    loopList = ["A","B","C","D","E"]
    data = [['tom', 10], ['nick', 15], ['juli', 14]] 
    counter = 1
      
    # Create the pandas DataFrame 
    df = pd.DataFrame(data, columns = ['Name', 'Age'])
     
    workbook = xlsxwriter.Workbook('C:\\Test\\Test.xlsx')
    totalsSheet = workbook.add_worksheet('Totals')
    writer = pd.ExcelWriter('C:\\Test\\Test.xlsx', engine = 'xlsxwriter')
    
    for sheets in loopList:
        
        df.to_excel(writer, sheet_name = sheets, index=False)
        #totalsSheet.write(counter, counter, sheets + str(counter)) 
        counter+=1
        
    writer.save()
    writer.close()
    #workbook.close()
    
    上面给出了一个新的测试工作簿,其中包含5张表(a、B、C等),每个表都导出了相同的数据帧

    然而,我似乎不能两者兼而有之;根据我将行写入Excel的顺序,它仍然只执行一项或另一项操作(我没有得到错误,我只是得到一个结果,这不是我想要做的两件事)

    有没有办法在同一个循环中完成这两件事


    我正在使用Python3.x.x。谢谢您的帮助。

    您能不能将它运行到单独的循环中,每个循环打开和关闭文件,以确保每个进程都可以使用它?类似于

    将熊猫作为pd导入
    导入xlsxwriter
    循环列表=[“A”、“B”、“C”、“D”、“E”]
    数据=[['tom',10],'nick',15],'juli',14]]
    计数器=1
    #创建数据帧
    df=pd.DataFrame(数据,列=['Name','Age'])
    使用pd.ExcelWriter('C:\\Test\\Test.xlsx',引擎='xlsxwriter')作为编写器:
    对于循环列表中的图纸:
    df.to_excel(编写器,工作表名称=工作表,索引=False)
    工作簿=xlsxwriter.workbook('C:\\Test\\Test.xlsx')
    totalsSheet=工作簿。添加工作表(“总计”)
    对于循环列表中的图纸:
    总计纸张。写入(计数器,计数器,纸张+str(计数器))
    计数器+=1
    工作簿.关闭()
    
    更新

    更深入地研究它,正如文档中所说,xlsxwriter:

    无法读取或修改现有Excel XLSX文件

    因此,您之前尝试的是导致覆盖发生的原因。但是,如果查看,您将看到关键是从pd.ExcelWriter对象创建工作簿对象。这意味着两个库可以同时写入文件

    我安装了xlsxwriter,下面的代码适合我:

    将熊猫作为pd导入
    导入xlsxwriter
    #要写入的数据
    循环列表=[“A”、“B”、“C”、“D”、“E”]
    数据=[['tom',10],'nick',15],'juli',14]]
    #创建数据帧
    df=pd.DataFrame(数据,列=['Name','Age'])
    #创建writer对象
    writer=pd.ExcelWriter('Test.xlsx',engine='xlsxwriter')
    #从当前writer对象创建工作簿对象
    #这意味着pandas和xlsxwriter都可以给它写信
    工作簿=writer.book
    totalsSheet=工作簿。添加工作表(“总计”)
    #设置计数器
    计数器=1
    #lopo-through并使用xlsx-writer写入特定的单元格
    对于循环列表中的图纸:
    总计纸张。写入(计数器,计数器,纸张+str(计数器))
    计数器+=1
    #循环生成新工作表并将dfs写入文件
    对于循环列表中的图纸:
    df.to_excel(编写器,工作表名称=工作表,索引=False)
    #保存写入的数据
    writer.save()
    
    这也有同样的问题;无论我最后放哪一个循环,结果文件都是这样的。我必须包含一个“writer.save()”和“writer.close()”才能使循环正常工作,但总体结果是一样的;如果ExcelWriter是最后一个循环,那么我会得到包含5个数据框的excel工作簿。如果totalsSheet是最后一张,我会得到带有“Totals”选项卡的工作簿,没有其他工作表。我以前没有使用过xlsxwriter,但看到了我对编辑所做的微小更改。我想这可能会有所不同。我感谢你的努力,但这也不起作用,我只拿到了总数的账单,其他什么都没有。如果要求xlsxwriter做两件事,就好像xlsxwriter在干扰自己一样,比如它覆盖了先做的事情。我有点惊讶,没有其他人会遇到这个问题,或者没有人需要将数据帧导出到多个工作表,并将值写入一个特定的工作表—所有这些都在一个循环中—不用担心。我已经进一步研究并解决了这个问题。请看我的最新答案。这很有效,我感谢你的帮助。不幸的是,这必须在单独的循环中完成,因为我基本上会将循环中的所有代码重复两次,因为写入Totals页面的许多内容都来自同一类型的数据争用,这些数据争用发生在另一个循环中的同一源数据和数据帧上。这看起来不太像蟒蛇。但我很高兴至少能做到这一点,谢谢你的帮助。如果其他人知道如何在同一个循环中实现这一点,我很乐意看到它。谢谢大家
    import pandas as pd
    import xlsxwriter
    
    loopList = ["A","B","C","D","E"]
    data = [['tom', 10], ['nick', 15], ['juli', 14]] 
    counter = 1
      
    # Create the pandas DataFrame 
    df = pd.DataFrame(data, columns = ['Name', 'Age'])
     
    workbook = xlsxwriter.Workbook('C:\\Test\\Test.xlsx')
    totalsSheet = workbook.add_worksheet('Totals')
    writer = pd.ExcelWriter('C:\\Test\\Test.xlsx', engine = 'xlsxwriter')
    
    for sheets in loopList:
        
        df.to_excel(writer, sheet_name = sheets, index=False)
        #totalsSheet.write(counter, counter, sheets + str(counter)) 
        counter+=1
        
    writer.save()
    writer.close()
    #workbook.close()