【问题标题】:export dataframe to new excel worksheet and also write specific values to specific sheet将数据框导出到新的 excel 工作表,并将特定值写入特定工作表
【发布时间】:2021-05-11 10:18:19
【问题描述】:

我遇到了一个我认为需要解决的问题:

  1. 将数据框导出到新的 Excel 工作表(在导出时创建)
  2. 将特定值写入同一工作簿中的现有工作表
  3. 在循环中执行上述两项操作

我可以让 1 和 3 自己工作,我也可以让 2 和 3 自己工作,但是当我尝试做所有这三件事时,它不起作用。我认为使用 xlsxwriter 引擎的 pandas to_excel 存在一些问题,与 sheet.write(row,column, value) 冲突到同一工作簿。

例如,这本身就可以工作(请注意,我将“writer”的东西导出到新工作表中注释掉了):

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()

上面制作了 test.xlsx 工作簿,带有一个 Totals 工作表,在递增的行/列中带有“A1”、“B2”等。

同样,当我注释掉工作簿内容并将联合国将 pandas-export 数据框注释到新工作表时,这也有效:

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 的行的顺序,它仍然只执行其中一个(我没有收到错误,我只是得到一个不是我想要做的两件事的结果)。

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

我正在使用 python 3.x.x。感谢您的帮助。

【问题讨论】:

    标签: python excel pandas dataframe


    【解决方案1】:

    你能不能把它运行在单独的循环中,每个循环打开和关闭文件以确保它对每个进程都可用?比如……

    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'])
    
    with pd.ExcelWriter('C:\\Test\\Test.xlsx', engine = 'xlsxwriter') as writer: 
        for sheets in loopList: 
            df.to_excel(writer, sheet_name = sheets, index=False)
    
    workbook = xlsxwriter.Workbook('C:\\Test\\Test.xlsx')
    totalsSheet = workbook.add_worksheet('Totals')
    
    for sheets in loopList: 
        totalsSheet.write(counter, counter, sheets + str(counter)) 
        counter+=1
        
    workbook.close()
    

    更新

    更多地研究它,正如文档所说的 xlsxwriter:

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

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

    我安装了 xlsxwriter,下面的代码对我有用:

    import pandas as pd
    import xlsxwriter
    
    # data to write
    loopList = ["A","B","C","D","E"]
    data = [['tom', 10], ['nick', 15], ['juli', 14]] 
    
    # Create the pandas DataFrame 
    df = pd.DataFrame(data, columns = ['Name', 'Age'])
    
    # create the writer object
    writer = pd.ExcelWriter('Test.xlsx', engine='xlsxwriter')
    
    # create the workbook object from the current writer object
    # this means that pandas and xlsxwriter can both write to it
    workbook = writer.book 
    totalsSheet = workbook.add_worksheet('Totals')
    
    # set the counter
    counter = 1
    
    # lopo through and use xlsx writer to write specific cells
    for sheets in loopList: 
        totalsSheet.write(counter, counter, sheets + str(counter)) 
        counter+=1
        
    # loop through generating new sheets and writing dfs to the file
    for sheets in loopList: 
        df.to_excel(writer, sheet_name = sheets, index=False)
    
    # save the written data
    writer.save()
    

    【讨论】:

    • 这有同样的问题;无论我放在最后一个循环中的哪一个,这就是生成的文件。我必须包含“writer.save()”和“writer.close()”才能使该循环正常工作,但总体结果是相同的;如果 ExcelWriter 是最后一个循环,我会得到包含 5 张数据框的 excel 工作簿。如果 totalsSheet 是最后一个,我会得到带有“Totals”选项卡的工作簿,没有其他工作表。
    • 我以前没有使用过 xlsxwriter,但请参阅我对编辑所做的微小更改。我认为这可能会有所作为。
    • 感谢您的努力,但这也不起作用,我得到了总计选项卡,但没有别的。如果被要求做两件事,就好像 xlsxwriter 会干扰自己,比如它会覆盖首先完成的任何事情。我有点惊讶没有其他人遇到这个问题,或者没有人需要将数据帧导出到多个工作表并将值写入一个特定的工作表,所有这些都在一个循环中
    • 不用担心。我已经进一步查看并解决了它。请查看我的更新答案。
    • 这行得通,感谢您的帮助。不幸的是,这必须在单独的循环中完成,因为我基本上会重复循环中的所有代码两次,因为写入“总计”页面的很多内容都来自同一来源发生的相同类型的数据争吵在另一个循环中写出的数据和数据帧。这似乎不是很pythonic。但我很高兴至少能够做到这一点,感谢您的帮助。如果其他人知道如何在同一循环中完成此操作,我很乐意看到它。谢谢大家
    猜你喜欢
    • 2018-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多