【问题标题】:Write values to a particular cell in a sheet in pandas in python将值写入python中熊猫工作表中的特定单元格
【发布时间】:2017-02-09 20:49:21
【问题描述】:

我有一个 excel 表,它在某些单元格中已经有一些值。

例如:-

        A      B      C      D
1      val1   val2          val3
2             valx   valy        

我希望 pandas 在不接触任何其他单元格、工作表等的情况下写入特定单元格

这是我试过的代码。

import pandas as pd
from openpyxl import load_workbook

df2 = pd.DataFrame({'Data': [13, 24, 35, 46]})
book = load_workbook('b.xlsx')
writer = pd.ExcelWriter('b.xlsx', engine='openpyxl')

df2.to_excel(writer, "Sheet1", startcol=7,startrow=6)

writer.save()

但是,此代码会删除旧的单元格值。

我参考了:- How to write to an existing excel file without overwriting data (using pandas)? 但这个解决方案不起作用。

【问题讨论】:

    标签: python excel pandas


    【解决方案1】:

    UPDATE2:将数据附加到现有 Excel 工作表,保留其他(旧)工作表:

    import pandas as pd
    from openpyxl import load_workbook
    
    fn = r'C:\Temp\.data\doc.xlsx'
    
    df = pd.read_excel(fn, header=None)
    df2 = pd.DataFrame({'Data': [13, 24, 35, 46]})
    
    writer = pd.ExcelWriter(fn, engine='openpyxl')
    book = load_workbook(fn)
    writer.book = book
    writer.sheets = dict((ws.title, ws) for ws in book.worksheets)
    
    df.to_excel(writer, sheet_name='Sheet1', header=None, index=False)
    df2.to_excel(writer, sheet_name='Sheet1', header=None, index=False,
                 startcol=7,startrow=6)
    
    writer.save()
    

    更新:您的 Excel 文件没有标题,因此您应该相应地处理它:

    In [57]: df = pd.read_excel(fn, header=None)
    
    In [58]: df
    Out[58]:
         0    1
    0  abc  def
    1  ghi  lmn
    
    In [59]: df2
    Out[59]:
       Data
    0    13
    1    24
    2    35
    3    46
    
    In [60]: writer = pd.ExcelWriter(fn)
    
    In [61]: df.to_excel(writer, header=None, index=False)
    
    In [62]: df2.to_excel(writer, startcol=7,startrow=6, header=None, index=False)
    
    In [63]: writer.save()
    

    旧答案:

    您可以使用以下技巧:

    先将现有的excel文件内容读入一个新的DF中:

    In [17]: fn = r'C:\Temp\b.xlsx'
    
    In [18]: df = pd.read_excel(fn)
    
    In [19]: df
    Out[19]:
           A      B     C      D
    0   val1    NaN  val3   val4
    1  val11  val22   NaN  val33
    

    现在我们可以将其写回并附加一个新的 DF2:

    In [20]: writer = pd.ExcelWriter(fn)
    
    In [21]: df.to_excel(writer, index=False)
    
    In [22]: df2.to_excel(writer, startcol=7,startrow=6, header=None)
    
    In [23]: writer.save()
    

    【讨论】:

    • 这个解决方案接近答案,有没有什么方法可以写入特定的单元格,你在你的解决方案中看到,它正在重新制作标题“A B C D”
    • @penta,这些标题是来自原始 Excel 文件的“comming”。如果您不需要它们,您可以在写回 Excel 文件时忽略它们:df.to_excel(writer, index=False, header=None) 或从 excel 读取文件时
    • 感谢您的快速响应,我确实尝试了 df.to_excel(writer, index=False, header=None) 但它删除了第一行
    • @penta,您可以在某处(例如:dropmefile.com)上传您的示例 Excel 文件并在此处发布链接吗?
    • @Datanovice,您可能想查看this answer :)
    【解决方案2】:

    我无法使用 pandas 完成我在问题中提出的问题,但可以使用 Openpyxl 解决它。

    我会写一些代码 sn-ps 这将有助于实现所要求的。

    import openpyxl
    
    # to open the excel sheet and if it has macros
    srcfile = openpyxl.load_workbook('docname.xlsx', read_only=False, keep_vba=True)
    
    # get sheetname from the file
    sheetname = srcfile.get_sheet_by_name('sheetname')
    # write something in B2 cell of the supplied sheet
    sheetname['B2'] = str('write something')
    # write to row 1,col 1 explicitly, this type of writing is useful to
    # write something in loops
    sheetname.cell(row=1, column=1).value = 'something'
    
    # save it as a new file, the original file is untouched and here I am saving
    # it as xlsm(m here denotes macros).
    srcfile.save('newfile.xlsm')
    

    所以 Openpyxl 写入一个 purticular 单元格,而不接触其他表、单元格等。 它基本上写入一个尊重原始文件属性的新文件。

    【讨论】:

    • 2天后会接受这个答案,看看有没有人有更好的解决方案
    【解决方案3】:

    使用pandas读取excel并追加文件

    def getpayment_excel(request):
        df = pd.read_excel(open(str(settings.MEDIA_ROOT)+"/"+"details.xlsx", 'rb'), sheetname='Sheet1')
        XLSX_MIME = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        response = HttpResponse(content_type=XLSX_MIME)
        response['Content-Disposition'] = 'attachment; filename="PythonExport.xlsx"'
        writer = pd.ExcelWriter(response, engine='xlsxwriter')
        df.loc[0,'Bank Name'] = "ICICIW"
        df.to_excel(writer, 'Sheet1', index=False)
        writer.save()
        return response
    

    【讨论】:

      猜你喜欢
      • 2017-09-18
      • 2018-03-05
      • 1970-01-01
      • 1970-01-01
      • 2020-08-19
      • 2021-06-15
      • 1970-01-01
      • 2021-01-20
      • 2020-02-12
      相关资源
      最近更新 更多