【发布时间】:2017-06-30 00:51:56
【问题描述】:
我正在尝试运行一个程序来收集数据,然后将其写入现有的 Excel 文件。我遇到了一个意想不到的问题。我的代码如下:
import good_morning as gm
import numpy
fd = gm.FinancialsDownloader()
fd_frames = fd.download('AAPL')
wb = UpdateWorkbook(r'C:\Users\vince\Project\Spreadsheet.xlsx', worksheet=1)
df_2 = fd_frames['income_statement']
df_2.set_index('title', inplace=True)
df_2 = df_2.drop('parent_index', axis=1)
df_2 = df_2.loc[['Revenue','Operating expenses']] #Add all the names you want from income statement
df_2 = df_2/(10**9)
wb['M6:N6'] = df_2.values
wb.save()
这里是 df_2.values 的输出:
array([[ 156.508, 170.91 , 182.795, 233.715, 215.639, 220.457],
[ 13.421, 15.305, 18.034, 22.396, 24.239, 25.364]])
我不断收到一条错误消息:
ValueError: Cannot convert [ 156.508 170.91 182.795 233.715 215.639 220.457] to Excel
我只是想将这些值写入特定的单元格。我非常接近完成该项目,但遇到了这个意外错误。有谁知道如何解决这个问题?任何帮助是极大的赞赏。谢谢
这是我的其余代码:
class UpdateWorkbook(object):
def __init__(self, fname, worksheet=0):
self.fname = fname
self.wb = load_workbook(fname)
self.ws = self.wb.worksheets[worksheet]
def save(self):
self.wb.save(self.fname)
def __setitem__(self, _range, values):
"""
Assign Values to a Worksheet Range
:param _range: String e.g ['M6:M30']
:param values: List: [row 1(col1, ... ,coln), ..., row n(col1, ... ,coln)]
:return: None
"""
def _gen_value():
for value in values:
yield value
if not isinstance(values, (list, numpy.ndarray)):
raise ValueError('Values Type Error: Values have to be "list": values={}'.
format(type(values)))
if isinstance(values, numpy.ndarray) and values.ndim > 1:
raise ValueError('Values Type Error: Values of Type numpy.ndarray must have ndim=1; values.ndim={}'.
format(values.ndim))
from openpyxl.utils import range_boundaries
min_col, min_row, max_col, max_row = range_boundaries(_range)
cols = ((max_col - min_col)+1)
rows = ((max_row - min_row)+1)
if cols * rows != len(values):
raise ValueError('Number of List Values:{} does not match Range({}):{}'.
format(len(values), _range, cols * rows))
value = _gen_value()
for row_cells in self.ws.iter_rows(min_col=min_col, min_row=min_row,
max_col=max_col, max_row=max_row):
for cell in row_cells:
cell.value = value.__next__()
电子表格中的内容很复杂,但是我只需要替换电子表格中的现有数据即可。上面的代码应该可以做到。每当我使用loc 时,我都会遇到这个错误。当我设置wb['M6:N6'] = df_2.values[0] 时,我已经让它工作了。
【问题讨论】:
-
@downshift,您对如何修复我的代码有任何想法吗?我无法通过您提供的链接找到解决问题的方法。
-
抱歉解决方案不清楚,@vdub32。您可能想尝试类似
for rowNum in range(len(df_2.values)): wb.cell(row=rowNum, column=1).value = df_2[rowNum] -
@downshift,我尝试使用该代码,但不断收到一条错误消息:
KeyError: 0,我还想知道如何在上面的代码中实现这行代码。我正在尝试使用我的 df_values 写入特定的单元格。我是否设置了wb['M6:N6'] = for rowNum in range(len(df_2.values)): wb.cell(row=rowNum, column=1).value = df_2[rowNum],您在上面给出的代码行? -
很抱歉代码没有按原样工作。我遇到的问题是您的代码没有在其当前状态下运行(您的代码如何读取文件数据、缺少导入语句等) - 以及
Spreadsheet.xlsx内容的外观如何,数据是否合二为一列等?有很多缺失的部分可以让你的代码运行,所以我还不能真正建议如何让你的代码工作。如果您可以创建一个重现您的错误的Minimal, Complete, and Verifiable example,我们可以提供更好的建议