#Vamos a importar numpy y pandas para jugar un poquillo
import numpy as np
import pandas as pd
from openpyxl import Workbook
from openpyxl import load_workbook

#También usaremos funciones para dibujar gráficos
from openpyxl.chart import (
    ScatterChart,
    Reference,
    Series,
)

"""
Explanation: Siro Moreno Martín
Cómo destruir y corromper todo lo es bueno y bello
A veces, tenemos que usar Excel
Hay que reconocer que hay gente por ahí que hace maravillas, aunque me de cosilla pensarlo:
https://www.youtube.com/watch?v=AmlqgQidXtk
Pero el caso es que quién más, quién menos, todos alguna vez necesitamos tratar con archivos de Excel en algún momento de la vida. Y si tienes que trabajar con los datos y temes que si intentas programar una macro puedas invocar a Shub-Niggurath, siempre podemos contar con el poder de Anaconda!
Para esta charla he utilizado openpyxl, pero hay otros paquetes que también permiten trabajar con ficheros de Excel, como xlsreader y xlsxwriter.
Nota: para que los estilos del notebook se rendericen bien, haz File-> Trust Notebook. Si aún así no salen las letras de colores, ejecuta la última celda. Los colores importan because reasons.
End of explanation
"""


#Vamos a cargar el workbook existente
wb_cargado = load_workbook(filename='datos.xlsx', read_only=True)#wb es un workbook iterable
ws_cargado = wb_cargado['datos'] # El primer elemento de wb, ws, es una worksheet iterable

#Comprobamos que nuestros importantísimos datos científicos se han cargado
for row in ws_cargado.rows: #Podemos iterar en las filas de la worksheet
    for cell in row:    #Cada fila es iterable a su vez, cada elemento es una celda
        print(cell.value) #Las celdas ya no son iterables más. Gracias a los Dioses.

#Vamos a volcar los datos en algo así como más de Python, una lista de listas, que siempre mola.
datos = []
for row in ws_cargado.rows:
    fila = []
    for cell in row:
        fila.append(cell.value)
    datos.append(fila)

#Podemos pasar ahora estos datos a una tabla de pandas, por ejemplo. Pandas mola también.
pd.DataFrame(datos)

#Si intentamos usar indexación como si fuera un array, no podremos.
#Esto evita que los demonios de la dimensión J invadan la tierra.
ws_cargado.rows[1:5]

#Tenemos que usar el método que ya viene para trazar un rectángulo alquímico de celdas:
for row in ws_cargado.iter_rows('A1:B5'):
    for cell in row:
        print (cell.value)

#Inspeccionando los datos científicos, hemos descubierto que no son del todo correctos.
#Debemos corregirlos a algo más apropiado a lo que es usar Excel
nombres = []
for row in ws_cargado.rows:
    nombres.append(row[1].value)

new_data = []
for word in nombres:
    word = word.replace('mariposas', 'avispas')
    word =word.replace('luz', 'oscuridad')
    word =word.replace('amor', 'sufrimiento')
    word =word.replace('paz','odio')
    word =word.replace('felicidad', 'desesperación')
    new_data.append(word)

#Podemos también generar datos nuevos como siempre, que luego guardaremos.
#Ahora, usaremos numpy para calcular vectores y mierdas así.
#Las matematicas son algo así como científico, estos datos son ciencia también.
theta = np.linspace(-0.5 * np.pi, 1.5 *np.pi, 100)
theta_2 = np.linspace(1.5 * np.pi, 7.5*np.pi, 6)
theta = np.concatenate((theta, theta_2))
x = np.cos(theta)
y = np.sin(theta)


"""
Explanation: Empezaremos cargando a Python datos desde un documento de excel.
End of explanation
"""


#Crear workbook nuevo
wb = Workbook()

#Seleccionar la worksheet activa
ws = wb.active

#Vamos a crear más páginas, simplemente porque podemos.
ws1 = wb.create_sheet()
ws1 = wb.create_sheet()

#Te interesa saber los nombres de las worksheet nuevas? Se puede!
wb.get_sheet_names()

#Otra manera de sacar los nombres de las cosas esas es ir iterando en el workbook:
#Cada elemento es una worksheet.
#A la gente que hizo esto les molaba la mierda esta de iterar cosas.
for sheet in wb:
    print(sheet.title)

#Carguemos los datos corregidos en el workbook nuevo usando un bucle
for row in range(len(new_data)):
    cell_name = 'A' + str(row + 1)
    ws[cell_name] = new_data[row]

#Con otro bucle vamos a cargar los datos generados por ciencia.
colname = ['B','C']
data = np.array([x, y])
for col in range(2):
    for row in range(1, len(x)+1):
        letter = colname[col]
        name = letter + str(row)
        ws[name] = data[col, row - 1]


#Ahora vamos a añadir un gráfico al workbook. Es para lo que sirve excel, no?
chart = ScatterChart()
chart.title = "Scatter Chart"
chart.style = 44
chart.x_axis.title = 'Maldad'
chart.y_axis.title = 'Obscenidad'

#Añadimos una serie de datos para pintar la ciencia en la hoja
xvalues = Reference(ws, min_col=2, min_row=1, max_row=len(x)+1)
values = Reference(ws, min_col=3, min_row=1, max_row=len(x)+1)
series = Series(values, xvalues, title_from_data=False)
chart.series.append(series)



#El tamaño importa
chart.height= 15
chart.width = 18

#Después de haberlo definido, lo añadimos al workbook cual pegote
ws.add_chart(chart, "C1")

#Vamos a guardar nuestro coso horrible antes de que nos dé un colapso 
#Y el mundo se quede sin disfrutar de nuestra obra
wb.save('resultado.xlsx')

"""
Explanation: Ahora que ya hemos cargado datos de un excel en Python, y que seguimos pudiendo usar otras librerías a pesar de tamaña atrocidad, crearemos un excel vacío nuevo para guardar toda nuestra mierda y mandársela a alguien que le importe.
End of explanation
"""


# Notebook style. Para que salgan las letras de colorines.
from IPython.core.display import HTML
css_file = './static/style.css'
HTML(open(css_file, "r").read())

"""
Explanation: Eso es todo artemaníacos! Ya podéis jugar con Excel y Python para crear aberraciones que pueblen la tierra!
Espero que esta mini-charla te ayude a crear la Ñapa Definitiva del Universo que seguro que quieres fabricar, pero si aún así quieres saber más sobre este paquete, puedes consultar su documentación:
https://openpyxl.readthedocs.org/en/default/index.html
End of explanation
"""


