使用Python将数据覆盖到现有工作簿

使用Python将数据覆盖到现有工作簿,python,excel,openpyxl,xlwings,Python,Excel,Openpyxl,Xlwings,我是Python新手,正在从事一个需要帮助的项目。因此,我试图修改现有的excel工作簿,以便比较股票数据。幸运的是,有一个在线程序检索了我需要的所有数据,我成功地提取了数据并将数据写入了一个新的excel文件。但是,目标是提取数据并将其放入现有的excel文件中。此外,我需要覆盖现有文件中的单元格值。我相信xlwings能够做到这一点,我认为我的代码是正确的,但我遇到了一个意外的错误。我得到的错误是: TypeError: Objects of type 'Period' can not be

我是Python新手,正在从事一个需要帮助的项目。因此,我试图修改现有的excel工作簿,以便比较股票数据。幸运的是,有一个在线程序检索了我需要的所有数据,我成功地提取了数据并将数据写入了一个新的excel文件。但是,目标是提取数据并将其放入现有的excel文件中。此外,我需要覆盖现有文件中的单元格值。我相信xlwings能够做到这一点,我认为我的代码是正确的,但我遇到了一个意外的错误。我得到的错误是:

TypeError: Objects of type 'Period' can not be converted to a COM VARIANT (but obtaining the buffer() of this object could)
我想知道是否有人知道为什么会出现这个错误?还有,有人知道如何修复它吗?它能修好吗?我的代码错了吗?任何帮助或指导都将不胜感激。多谢各位

import good_morning as gm
import pandas as pd
import xlwings as xw

#import income statement, balance sheet, and cash flow of AAPL
fd = gm.FinancialsDownloader()
fd_frames = fd.download('AAPL')

#Creates a DataFrame for only the balance sheet
df1 = pd.DataFrame(list(fd_frames.values())[0])

#connects to workbook I want to modify 
wb = xw.Book(r'C:\Users\vince\Project\Spreadsheet.xlsm')

#sheet I would like to modify
sht = wb.sheets[1]

#modifies & overwrites values in my spreadsheet(this is where I get the type_error)
sht.range('M6').value = df1
数据类型

type(fd_frames)
>>> <class 'dict'>
fd_frames.values())[0].info()
>>> <class 'pandas.core.frame.DataFrame'> 
RangeIndex: 22 entries, 0 to 21 
Data columns (total 8 columns): 
parent_index 22 non-null int64 
title 22 non-null object 
2012 19 non-null float64 
2013 20 non-null float64 
2014 20 non-null float64 
2015 20 non-null float64 
2016 20 non-null float64 
2017 20 non-null float64 
dtypes: float64(6), int64(1), object(1) 
memory usage: 1.5+ KB
类型(fd_帧)
>>> 
fd_frames.values())[0].info()
>>>  
范围索引:22个条目,0到21
数据列(共8列):
父索引22非空int64
标题22非空对象
2012 19非空浮点64
2013 20非空浮点64
2014年20非空浮动64
2015年20非空浮动64
2016年20非空浮动64
2017年20非空浮动64
数据类型:float64(6)、int64(1)、object(1)
内存使用率:1.5+KB
评论:您拥有
pandas.DataFrame的目录

使用
列表(fd_frames.values())[0]
从Dict中选择会导致不可预测的结果。显示Dict的键,并使用这些键选择您感兴趣的键,例如:

 print(fd_frames.keys())
 >>> dict_keys(['key_1', 'key_2', 'key_n']
 df_2 = fd_frames['key_2']
除此之外,
pandas.DataFrame中的维度都不匹配
M6:M30
=25。只有8列具有20个值。因此,您必须将工作表范围对齐到20行。将2017列写入工作表,例如:

wb['M6:M25'] = df_2['2017'].values
注意:我已经更新了下面的代码以接受
numpy.ndarray


问题:。。。目标是提取数据并将其放入现有的excel文件中

使用列表值更新工作簿工作表范围。
使用:OpenPyXL

注意:观察列表值的排列方式
参数值:列表::[第1行(col1,…,coln),…,第n行(col1,…,coln)]`

wb = UpdateWorkbook(r'C:\Users\vince\Project\Spreadsheet.xlsx', worksheet=1)
df_2 = fd_frames['key_2']
wb['M6:M25'] = df_2['2017'].values
wb.save()
用法

wb = UpdateWorkbook(r'C:\Users\vince\Project\Spreadsheet.xlsx', worksheet=1)
df_2 = fd_frames['key_2']
wb['M6:M25'] = df_2['2017'].values
wb.save()

使用Python:3.4.2-openpyxl:2.4.1-LibreOffice:4.3.2测试

以下是我如何为其他堆栈探索器执行类似的过程:

import pandas as pd
from openpyxl import load_workbook
from openpyxl.utils.dataframe import dataframe_to_rows

... create your pandas dataframe df...

# Writing from pandas back to an existing EXCEL workbook
# Load workbook
wb = load_workbook(filename=target, read_only=False, keep_vba=True)
ws = wb['Sheet1']

# Overwrite Existing data in sheet with a dataframe.
rows = dataframe_to_rows(df, index=False, header=True)

for r_idx, row in enumerate(rows, 1):
    for c_idx, value in enumerate(row, 1):
         ws.cell(row=r_idx, column=c_idx, value=value)

# Save file
wb.save('outfile.xlsm')

pandas.DataFrame.append帮助的可能重复?我有我想要的数据框。我无法用现有的数据框覆盖excel文件中的现有数据。我仍然对如何将数据传输到现有工作簿感到困惑。我认为我无法使用这些函数更新现有工作簿。我已经在网上搜索过了,不认为用这些功能就可以做到。很难找到能够修改现有工作区并替换其中数据的函数。感谢您的帮助和建议。当我使用此代码时,它能够将数据放入现有工作簿文件中。但是,它会覆盖整个工作簿。很抱歉,我不是很清楚,但我只想覆盖现有工作簿中的某些单元格,而不是从工作簿中删除所有数据。你知道这是否可行吗?用我想要的panda数据框替换特定单元格?例如,我想用创建的数据框替换名为data的工作表中的单元格M6到M30。是的,这正是我想做的,而不必擦除或删除该电子表格中的任何现有数据。非常感谢你!谢谢你的代码!我仍然遇到了一个我不理解的意外错误。由于某种原因,它给了我一个值错误。错误状态:ValueError:Values类型错误:值必须是“list”:Values=。这对我来说毫无意义,因为我们将数据帧转换为列表,但我可能看错了。谢谢你的帮助。如果你能再给我一些建议,我会非常感激的!再次感谢您,抱歉,我不知道如何在评论中格式化我的文字谢谢您的帮助,您真是太棒了!!!我还有几个问题,这段代码是否允许我选择工作簿中要放入数据的工作表?另外,您知道如何将数据从指数(例如,10e9到100亿)转换为十亿或百万的单位吗?有没有一个简单的方法来摆脱指数?