如何将列表或数据框中的值输入到现有excel文件中的每个单元格中?

时间:2017-12-07 08:24:01

标签: excel python-3.x pandas

基本上,我想用新数据更新工作表,覆盖excel中的现有单元格。两个文件都具有相同的列名(我不想创建新工作簿,也不想添加新列)。

我正在检索我想要的数据:

import pandas as pd
df1 = pd.read_csv
print(df1)

输出(我只是复制并粘贴前5行,总共约500行):

          Index  Type  Stage  CDID  Period  Index Value
0     812008000     6      2  JTV9  201706      121.570
1     812008000     6      2  JTV9  201707      121.913
2     812008000     6      2  JTV9  201708      121.686
3     812008000     6      2  JTV9  201709      119.809
4     812008000     6      2  JTV9  201710      119.841
5     812128000     6      1  K2VA  201706      122.030

现有的excel文件与df1具有相同的列(和行总数),但我只想拥有'索引'列重新填充新值。我们只是说它看起来像这样(即我希望Index的先前值进入相应的列):

          Index  Type  Stage  CDID  Period  Index Value
0     512901100     6      2  JTV9  201706      121.570
1     412602034     6      2  JTV9  201707      121.913
2     612307802     6      2  JTV9  201708      121.686
3     112808360     6      2  JTV9  201709      119.809
4     912233066     6      2  JTV9  201710      119.841
5     312128003     6      1  K2VA  201706      122.030

这里我正在检索excel文件,并尝试覆盖它:

from win32com.client import Dispatch
import os

xl = Dispatch("Excel.Application")
xl.Visible = True 

wbs_path = ('folder path')

for wbname in os.listdir(wbs_path):
    if not wbname.endswith("file name.xlsx"):
        continue
    wb = xl.Workbooks.Open(wbs_path + '\\' + wbname)
    sh = wb.Worksheets("sheet name")
    sh.Range("A1:A456").Value = df1[["Index"]]
    wb.Save()
    wb.Close()
xl.Quit()

但这并没有做任何事情。 如果我输入字符串,例如:

h.Range("A1:A456").Value = 'o', 'x', 'c'

这在单元格中通过A1到A456(它更新电子表格)重复o,但忽略x和c。我已经尝试将df1转换为列表和numpy数组,但这不起作用。

有没有人知道解决方案或替代解决方法?

1 个答案:

答案 0 :(得分:1)

如果数据框的索引相同,则可以使用update()更新列。它可以像这样工作:

df1.update(df2['Index'].to_frame())

注意:可能不需要to frame()

编辑:

由于您尝试更新excel文件而不是数据框,我的答案可能还不够。 对于这部分,我建议将文件加载到数据帧中,更新数据并保存。

df1 = pd.read_excel('file.xlsx', sheet_name='sheet_name')

# do the update

writer = pd.ExcelWriter('file.xlsx')
df1.to_excel(writer,sheet_name='sheet_name', engine='xlsxwriter')
writer.save()