from io import BytesIO
import os
from random import randint

from openpyxl import Workbook
from openpyxl.xml.functions import XMLGenerator

def make_worksheet():
    wb = Workbook()
    ws = wb.active
    for i in range(1000):
        ws.append(list(range(100)))
    return ws




def make_dump_worksheet():
    wb = Workbook(write_only=True)
    ws = wb.create_sheet()
    return ws

def dump_writer(ws=None):
    if ws is None:
        ws = make_dump_worksheet()
    for i in range(1000):
        ws.append(list(range(100)))


COLUMNS = 100
ROWS = 1000
BOLD = 1
ITALIC = 2
UNDERLINE = 4
RED_BG = 8
formatData = [[None] * COLUMNS for _ in range(ROWS)]

def generate_format_data():
    for row in range(ROWS):
        for col in range(COLUMNS):
            formatData[row][col] = randint(1, 15)


def styled_sheet():
    from openpyxl import Workbook
    from openpyxl.styles import Font, Style, PatternFill, Color, colors

    wb = Workbook()
    ws = wb.active
    ws.title = 'Test 1'

    red_fill = PatternFill(fill_type='solid', fgColor=Color(colors.RED), bgColor=Color(colors.RED))
    empty_fill = PatternFill()
    styles = []
    # pregenerate relevant styles
    for row in range(ROWS):
        _row = []
        for col in range(COLUMNS):
            cell = ws.cell(row=row+1, column=col+1)
            cell.value = 1
            font = {}
            fill = PatternFill()
            if formatData[row][col] & BOLD:
                font['bold'] = True
            if formatData[row][col] & ITALIC:
                font['italic'] = True
            if formatData[row][col] & UNDERLINE:
                font['underline'] = 'single'
            if formatData[row][col] & RED_BG:
                fill = red_fill
            cell.style = Style(font=Font(**font), fill=fill)

    #wb.save(get_output_path('test_openpyxl_style_std_pregen.xlsx'))


def read_workbook():
    from openpyxl import load_workbook
    folder = os.path.split(__file__)[0]
    src = os.path.join(folder, "files", "very_large.xlsx")
    wb = load_workbook(src, read_only=True)
    return wb


def rows_without_values(wb):
    ws = wb.active
    rows = ws.iter_rows()
    for r, row in enumerate(rows):
        for c, col in enumerate(row):
            pass
    print((r+1)* (c+1), "cells")


def rows_with_values(wb):
    ws = wb.active
    rows = ws.iter_rows()
    for r, row in enumerate(rows):
        for c, col in enumerate(row):
            col.value
    print((r+1)* (c+1), "cells")

def col_index1():
    from openpyxl.cell import get_column_letter
    for i in range(1, 18279):
        c = get_column_letter(i)



"""
Sample use
import cProfile
ws = make_worksheet()
cProfile.run("profiling.lxml_writer(ws)", sort="tottime")
"""


if __name__ == '__main__':
    import cProfile
    # ws = make_worksheet()
    wb = read_workbook()
    print("Looping without values")
    cProfile.run("rows_without_values(wb)", sort="tottime")
    print("Looping with values")
    cProfile.run("rows_with_values(wb)", sort="tottime")
    cProfile.run("make_worksheet()", sort="tottime")
    #cProfile.run("lxml_writer(ws)", sort="tottime")
    generate_format_data()
    cProfile.run("styled_sheet()", sort="tottime")
    ws = make_dump_worksheet()
    cProfile.run("dump_writer(ws)", sort="tottime")
    cProfile.run("col_index1()", sort="tottime")
