0

I am trying to insert data in Excel sheet by mysql table data.

'Feedstock', 'None', 'Naphtha', '5.00000', '2005', 'Y'
'Feedstock', 'None', 'Naphtha', '0.00000', '2006', 'Y'
'Feedstock', 'None', 'Naphtha', '0.00000', '2007', 'Y'
'Feedstock', 'None', 'Naphtha', '5.00000', '2008', 'Y'
'Feedstock', 'None', 'Naphtha', '5.00000', '2012', 'Y'
'Feedstock', 'None', 'Naphtha', '5.00000', '2014', 'Y'
'Feedstock', 'None', 'Naphtha', '5.00000', '2015', 'Y'
'Feedstock', 'None', 'Naphtha', '5.00000', '2016', 'Y'
'Feedstock', 'None', 'Naphtha', '5.00000', '2017', 'Y'
'Building Blocks', 'Olefins', 'Ethylene', '5.00000', '2005', 'Y'
'Building Blocks', 'Olefins', 'Ethylene', '5.00000', '2006', 'Y'

like this table and want to fill this data in excel sheet.

excel format is :

                                    2005-Y  2006-Y  2007-Y  2008-Y  2009-Y  2010-Y  2011-Y  2012-Y  2013-Y  2014-Y  2015-Y  2016-Y  2017-Y 2018-Y 2019-Y

Feedstock                 Naphtha   5   0   0   5   -   -   -   5   -   5   5   5   5 - -
Building Blocks (a)Olefine Ethylene 5   5   5   5   -   -   -   5   -   2.5 2.5 2.5 2.5 - -
                          Propylene 5   5   5   5   -   -   -   5   -   2.5 2.5 2.5 2.5 - - 
                          Butadiene 5   5   5   5   -   -   -   5   -   2.5 2.5 2.5 2.5 - -

I tried:

import pymysql
from xlsxwriter.workbook import Workbook
from openpyxl import load_workbook
import openpyxl
from openpyxl.styles import  Alignment, Font


sqlconn = ".............."
cursor = sqlconn.cursor()


wb = load_workbook('cpm_auto.xlsx')
sheet = wb.get_sheet_by_name('Sheet1')

max_col = (sheet.max_column)
max_row = (sheet.max_row)

for row in range(3,max_row):
    for col in range(4,max_col):
        periods = sheet.cell(row = 1,column = col).value
        period = periods.replace('-Y','')
        val = sheet.cell(row = row,column = 3).value
        if val == 'Naphtha':
            query = "select Value from CPMAI where Product = '%s' and Year = '%s'" %(val,period)
            result = cursor.execute(query)

            if result > 0:
                values = cursor.fetchone()
                if len(values) > 0:
                    prev_value = values[0]
                    print(prev_value)
                    sheet.cell(row = row,column = col).value = values[0]
                else:

                    sheet.cell(row=row, column=col).value = prev_value
    break

wb.save('cpm_auto.xlsx')

My Code: I tried This code but this code inserting value for the year which having values, but i want to insert all year value from 2005- 2019. please see excel format there is no values for 2009, 2010, 2011, 2013, 2018, 2019 so want to carry forward the previous year value to that year.

P.Jhon
  • 15
  • 8
  • What you want to do is create a pivot table. Did you play with panda's pivot and pivot_table functions? – luca.vercelli Apr 08 '19 at 09:48
  • can you please tell me how to do it for above example – P.Jhon Apr 08 '19 at 10:14
  • you question is a little too broad. You must load data from mysql, see e.g. https://pynative.com/python-mysql-select-query-to-fetch-data/ then you have to create the pivot table, see e.g. https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.pivot_table.html You should try to write some code, so that we can help you – luca.vercelli Apr 08 '19 at 10:35
  • thanks luca.vercelli. I edited the question with my code. I am too close but want to carry forward previous year data which year is not mention till 2019.. – P.Jhon Apr 08 '19 at 12:51

2 Answers2

0

I don't know what the data is in your database. If you follow the example below, you can

import xlwt


cols = [
    ['Feedstock', 'None', 'Naphtha', '5.00000', '2005', 'Y'],
    ['Feedstock', 'None', 'Naphtha', '0.00000', '2006', 'Y'],
    ['Feedstock', 'None', 'Naphtha', '0.00000', '2007', 'Y'],
    ['Building Blocks', 'Olefins', 'Ethylene', '5.00000', '2005', 'Y'],
    ['Building Blocks', 'Olefins', 'Ethylene', '5.00000', '2006', 'Y'],
]

res = {}
for c1, c2, c3, c4, c5, c6 in cols:
    res_key = "{}-{}-{}".format(c1, c2, c3)
    year_key = "{}-{}".format(c5, c6)
    years = {"year": year_key, "value": c4}
    res.setdefault(res_key, []).append(years)

title = ["" for _ in range(3)]
_lst = [title]
is_first = True
for info, years in res.items():
    rows = [item if not item == "None" else "" for item in info.split("-")]
    for item in years:
        year = item["year"]
        value = int(float(item["value"]))
        rows.append(value)
        if is_first:
            title.append(year)
    is_first = False
    _lst.append(rows)

book = xlwt.Workbook(encoding='utf8')
sheet = book.add_sheet('untitled', cell_overwrite_ok=True)

for row, rowdata in enumerate(_lst):
    for col, val in enumerate(rowdata):
        sheet.write(row, col, val)
book.save("test.xls")

sunnky
  • 175
  • 6
0

I would do the computation before creating the excel sheet. For example (if the table is not too large):

import pandas as pd
import numpy as np

# Load table into a DataFrame, see https://stackoverflow.com/questions/12047193
query = "select * from CPMAI"
result = cursor.execute(query)
df = pd.DataFrame(result.fetchall())
df.columns = result.keys()

pivot = df.pivot_table(values=["value"], index=["product"], columns=["year"], aggfunc=np.sum)

Later, you can loop over the pivot elements and fill the Excel sheet

luca.vercelli
  • 898
  • 7
  • 24