Overwriting Data To An Existing Workbook Using Python
Solution 1:
Comments: You have a Dict of
pandas.DataFrame
.
Selecting from a Dict using list(fd_frames.values())[0]
does lead to unpredictable Results. Show the Keys of the Dict and choose the one you interested off using these Key, e.g.:
print(fd_frames.keys())
>>> dict_keys(['key_1', 'key_2', 'key_n']
df_2 = fd_frames['key_2']
Beside this, neither of the Dimension in your pandas.DataFrame
does match M6:M30
= 25. There are only 8 columns with 20 Values. Therfore you have to align your Worksheet Range to 20 Rows. To write Column 2017 to the Worksheet, e.g.:
wb['M6:M25'] = df_2['2017'].values
Note: I have updated the code below to accept
numpy.ndarray
also.
Question: ... the goal is to pull the data and put it into an existing excel file
Update a Workbooks Worksheet Range with List Values. Using: OpenPyXL: A Python library to read/write Excel 2010 xlsx/xlsm files
Note: Observe how the List Values have to be arranged! param values: List: *[row 1(col1, ... ,coln), ..., row n(col1, ... ,coln)]`
from openpyxl import Workbook, load_workbook
classUpdateWorkbook(object):
def__init__(self, fname, worksheet=0):
self.fname = fname
self.wb = load_workbook(fname)
self.ws = self.wb.worksheets[worksheet]
defsave(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
ifnotisinstance(values, (list, numpy.ndarray)):
raise ValueError('Values Type Error: Values have to be "list": values={}'.
format(type(values)))
ifisinstance(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__()
Usage
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()
Tested with Python:3.4.2 - openpyxl:2.4.1 - LibreOffice:4.3.3.2
Solution 2:
Here's how I do a similar procedure for other Stack explorers:
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 inenumerate(rows, 1):
for c_idx, value inenumerate(row, 1):
ws.cell(row=r_idx, column=c_idx, value=value)
# Save file
wb.save('outfile.xlsm')
Post a Comment for "Overwriting Data To An Existing Workbook Using Python"