Example #1
0
def DBLOAD_CHART(worksheet, dbname, chartday, chartrow):
    loadchart = LineChart()
    loadchart.title = dbname + ' ' + chartday + ' DB time'
    loadchart.style = 10
    loadchart.y_axis.title = 'Value'
    loadchart.x_axis.title = 'Housr'

    data = Reference(worksheet, min_col=4, min_row=8, max_col=6, max_row=8 + chartrow)
    loadchart.add_data(data, titles_from_data=True)

    # Style the lines
    loadseries1 = loadchart.series[0]
    loadseries1.marker.symbol = 'triangle'
    loadseries1.marker.graphicalProperties.solidFill = 'FF0000'  # Marker filling
    loadseries1.marker.graphicalProperties.line.solidFill = 'FF0000'  # Marker outline
    loadseries1.smooth = True

    # Style the lines
    loadseries2 = loadchart.series[1]
    loadseries2.marker.symbol = 'circle'
    loadseries2.marker.graphicalProperties.solidFill = '00FF00'  # Marker filling
    loadseries2.marker.graphicalProperties.line.solidFill = '00FF00'  # Marker outline
    loadseries2.smooth = True

    # Style the lines
    loadseries3 = loadchart.series[2]
    loadseries3.marker.symbol = 'plus'
    loadseries3.marker.graphicalProperties.solidFill = '0000FF'  # Marker filling
    loadseries3.marker.graphicalProperties.line.solidFill = '0000FF'  # Marker outline
    loadseries3.smooth = True

    return loadchart
Example #2
0
class TestLineChartWriter(object):

    def setup(self):
        """Setup a worksheet with one column of data and a line chart"""
        wb = Workbook()
        ws = wb.get_active_sheet()
        ws.title = 'Line'
        for i in range(1, 5):
            ws.append([i])
        self.piechart = LineChart()
        self.piechart.add_serie(Serie(Reference(ws, (0, 0), (4, 0))))
        self.cw = LineChartWriter(self.piechart)
        self.root = Element('test')

    def test_write_chart(self):
        """check if some characteristic tags of LineChart are there"""
        self.cw._write_chart(self.root)
        tagnames = ['{%s}lineChart' % CHART_NS,
                    '{%s}valAx' % CHART_NS,
                    '{%s}catAx' % CHART_NS]

        root = safe_iterator(self.root)
        chart_tags = [e.tag for e in root]
        for tag in tagnames:
            assert_true(tag in chart_tags, tag)

    def test_serialised(self):
        """Check the serialised file against sample"""
        xml = self.cw.write()
        expected_file = os.path.join(DATADIR, "writer", "expected", "LineChart.xml")
        with open(expected_file) as expected:
            diff = compare_xml(xml, expected.read())
            assert diff is None, diff
Example #3
0
def line(wb):
    ws = wb.create_sheet(5, "Line")
    for i in range(1, 5):
        ws.append([i])
    chart = LineChart()
    values = Reference(ws, (0, 0), (3,0))
    series = Series(values)
    chart.append(series)
    ws.add_chart(chart)
Example #4
0
    def add_chart(self, sheetname, x_col, y_col):
        ws = self.wb[sheetname]

        xtitle = ws.cell(1, x_col).value
        ytitle = ws.cell(1, y_col).value

        chart = LineChart()
        chart.title = "%s - %s" % (ytitle, xtitle)
        chart.style = 13
        chart.x_axis.title = xtitle
        chart.y_axis.title = ytitle
        chart.marker = True
        chart.smooth = True

        y_data = Reference(ws, min_col=y_col, min_row=1, max_col=y_col, max_row=self.current_row)
        chart.add_data(y_data, titles_from_data=True)
        x_data = Reference(ws, min_col=x_col, min_row=2, max_col=x_col, max_row=self.current_row)
        chart.set_categories(x_data)

        s0 = chart.series[0]
        s0.marker.symbol = "circle"
        s0.smooth = True

        if 0 == self.chart_row:
            self.chart_row = self.current_row

        ws.add_chart(chart, "A%d" % self.chart_row)

        # row height is 7.5/16 cm by default
        self.chart_row = self.chart_row + chart.height / 7.5 * 16 + 2
Example #5
0
def _create_chart(book):
    c1 = LineChart()
    c1.title = "Mean Wind Speed"
    c1.style = 13
    c1.y_axis.title = 'Speed'
    c1.x_axis.title = 'Time'

    mean_sheet = book.get_sheet_by_name(MEAN_WIND_SPEED_SHEET)
    max_sheet = book.get_sheet_by_name(MAX_WIND_SPEED_SHEET)
    max_row = first_empty_row(mean_sheet, 1) - 1
    mean_data = Reference(mean_sheet, min_col=2, min_row=1, max_col=2, max_row=max_row)
    max_data = Reference(max_sheet, min_col=2, min_row=1, max_col=2, max_row=max_row)
    dates = Reference(mean_sheet, min_col=1, min_row=2, max_row=max_row)

    c1.add_data(mean_data, titles_from_data=True)
    c1.add_data(max_data, titles_from_data=True)
    c1.y_axis.scaling.max = 100
    c1.set_categories(dates)
    
    s1 = c1.series[0]
    s2 = c1.series[1]
    s1.graphicalProperties.line.solidFill = "FF0000"
    s2.graphicalProperties.line.solidFill = "0000FF"
    
    ws = book.create_sheet()
    ws.title = "Charts"
    ws.add_chart(c1, "A1")

    return book
Example #6
0
def add_chart(sheet, chart_name, x_axis_name, y_axis_name, start_row, end_row, start_col, end_col, chart_position):

    chart = LineChart()
    chart.title = chart_name
    chart.style = 10
    chart.height = 10
    chart.width = 20
    chart.y_axis.title = y_axis_name
    chart.x_axis.title = x_axis_name

    data = Reference(sheet, min_col = start_col, min_row=start_row, max_col = end_col, max_row=end_row)
    chart.add_data(data, titles_from_data=True)
    
    s1 = chart.series[0]
    s1.graphicalProperties.line.width = 30050
    s2 = chart.series[1]
    s2.graphicalProperties.line.width = 30050
    s3 = chart.series[2]
    s3.graphicalProperties.line.width = 30050
    s4 = chart.series[3]
    s4.graphicalProperties.line.width = 30050
    s5 = chart.series[4]
    s5.graphicalProperties.line.width = 30050
    
    sheet.add_chart(chart, chart_position)
Example #7
0
 def setup(self):
     """Setup a worksheet with one column of data and a line chart"""
     wb = Workbook()
     ws = wb.get_active_sheet()
     ws.title = 'Line'
     for i in range(1, 5):
         ws.append([i])
     self.piechart = LineChart()
     self.piechart.add_serie(Serie(Reference(ws, (0, 0), (4, 0))))
     self.cw = LineChartWriter(self.piechart)
     self.root = Element('test')
Example #8
0
def insertarGraficoMercadoTC(ws):
    maxCol = col2num(getMaxCol(ws, 'B', 46))

    c1 = BarChart()
    v1 = Reference(ws, min_col=1, min_row=47, max_col=maxCol)
    c1.add_data(v1, titles_from_data=True, from_rows=True)
    c1.y_axis.scaling.min = 0
    c1.y_axis.majorGridlines = None

    c2 = LineChart()
    v2 = Reference(ws, min_col=1, min_row=48, max_col=maxCol)
    c2.add_data(v2, titles_from_data=True, from_rows=True)
    c2.y_axis.axId = 200
    c1.z_axis = c2.y_axis

    categories = Reference(ws, min_col=2, min_row=46, max_col=maxCol)
    c1.set_categories(categories)
    
    # Display y-axis of the second chart on the right by setting it to cross the x-axis at its maximum
    c1.y_axis.crosses = "max"
    c1 += c2

    ws.add_chart(c1, "A54")
Example #9
0
def insertarGraficoDevoluciones(ws):
    c1 = LineChart()
    c1.style = 13
    c1.legend.position = 'b'
    c1.width = 25

    maxCol = col2num(getMaxCol(ws, 'B', 4))

    data = Reference(ws, min_col=1, min_row=5, max_col=maxCol, max_row=7)
    c1.add_data(data, titles_from_data=True, from_rows=True)

    categories = Reference(ws, min_col=2, min_row=4, max_col=maxCol)
    c1.set_categories(categories)

    setSerieStyle(c1.series[0], "circle"  , "C00000")
    setSerieStyle(c1.series[1], "diamond" , "0000FF")
    setSerieStyle(c1.series[2], "triangle", "00B050")

    ws.add_chart(c1, "A19")
Example #10
0
    def fill_workbook(self):
        counter = 1

        a=self.has_workbook()

        if a==True:
            wb= openpyxl.load_workbook(self.get_workbook())
        else:
            wb = Workbook()
            wb.save(self.get_workbook())

        b=wb.active
        b.title = self.user.get_name()

        while b['B'+str(counter)].value!=b['C1'].value:
            counter=counter+1


        localtime = time.asctime( time.localtime(time.time()) )


        b['B'+str(counter)]=float(self.web.get_price())
        b['A'+str(counter)]=str(localtime)



        chart = LineChart()

        prices = Reference(b,min_col=2,max_col=2,min_row=1,max_row=int(counter))
        times = Reference(b,min_col=1,max_col=1,min_row=1,max_row=int(counter))

        series = Series(prices, title=self.user.get_name())
        chart.append(series)
        chart.set_categories(times)

        chart.__name__= self.user.get_name()+" Prices"
        b.add_chart(chart)

        wb.save(self.get_workbook())
Example #11
0
#Transfer the dates
for i in range (1, 9):
    a = i-1
    ws.cell(row=i, column=1).value = exampleData[a][0]

#Transfer the temps (needs to be separate in order to parse these into floats)
for i in range (2,9):
    for h in range(2, 5):
        a = i-1
        b = h-1
        ws.cell(row=i, column=h).value = float(exampleData[a][b])

ws = wb.active

#Create Chart object
c1 = LineChart()

#Edit Chart details 
c1.title = "Weekly Temps"
c1.y_axis_title = "Temp"
c1.x_axis_title = "Date"
c1.height = 20
c1.width = 40

#Collect Reference points for the chart
data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=8)
dates = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=8)

#Add Everything to the chart
c1.add_data(data, titles_from_data=True)
c1.set_categories(dates)
# Attendance Numbers - no big data equivalent, but something that is ideal for a church to track
# Example of how this should be used.

rows = [
    ['Date', 'Total Count', 'Saturday', 'Sunday'],
    [date(2015,9, 1), 550, 100, 450],
    [date(2015,9, 8), 400, 75, 325],
    [date(2015,9, 15), 550, 125, 325],
    [date(2015,9, 22), 700, 150, 550],
    [date(2015,9, 29), 600, 100, 500],
    ]

for row in rows:
    ws.append(row)

c1 = LineChart()
c1.title = "Line Chart"
c1.style = 13
c1.y_axis.title = 'Number of People Counted'
c1.x_axis.title = 'Service week'

data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)
c1.add_data(data, titles_from_data=True)

# Style the lines
s1 = c1.series[0]
s1.marker.symbol = "triangle"
s1.marker.graphicalProperties.solidFill = "FF0000" # Marker filling
s1.marker.graphicalProperties.line.solidFill = "FF0000" # Marker outline

s1.graphicalProperties.line.noFill = True
Example #13
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):

    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102

    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    # img = Image("myems.png")
    img.width = img.width * 1.06
    img.height = img.height * 1.06
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local[:
                                              10] + "__" + reporting_end_datetime_local[:
                                                                                        10]
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename
    #################################################
    # First: 能耗分析
    # 6: title
    # 7: table title
    # 8~10 table_data
    # Total: 5 rows
    # if has not energy data: set low height for rows
    #################################################
    reporting_period_data = report['reporting_period']

    has_energy_data_flag = True
    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_energy_data_flag = False

    if has_energy_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + ' 能耗分析'

        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[7].height = 60
        ws['B7'].fill = table_fill
        ws['B7'].border = f_border

        ws['B8'].font = title_font
        ws['B8'].alignment = c_c_alignment
        ws['B8'] = '能耗'
        ws['B8'].border = f_border

        ws['B9'].font = title_font
        ws['B9'].alignment = c_c_alignment
        ws['B9'] = '单位面积能耗'
        ws['B9'].border = f_border

        ws['B10'].font = title_font
        ws['B10'].alignment = c_c_alignment
        ws['B10'] = '环比'
        ws['B10'].border = f_border

        col = ''

        for i in range(0, ca_len):
            col = chr(ord('C') + i)
            row = '7'
            cell = col + row
            ws[col + '7'].fill = table_fill
            ws[col + '7'].font = name_font
            ws[col + '7'].alignment = c_c_alignment
            ws[col + '7'] = reporting_period_data['names'][
                i] + " (" + reporting_period_data['units'][i] + ")"
            ws[col + '7'].border = f_border

            ws[col + '8'].font = name_font
            ws[col + '8'].alignment = c_c_alignment
            ws[col + '8'] = round(reporting_period_data['subtotals'][i], 2)
            ws[col + '8'].border = f_border

            ws[col + '9'].font = name_font
            ws[col + '9'].alignment = c_c_alignment
            ws[col + '9'] = round(
                reporting_period_data['subtotals_per_unit_area'][i], 2)
            ws[col + '9'].border = f_border

            ws[col + '10'].font = name_font
            ws[col + '10'].alignment = c_c_alignment
            ws[col + '10'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \
                if reporting_period_data['increment_rates'][i] is not None else "-"
            ws[col + '10'].border = f_border

        # TCE TCO2E
        end_col = col
        # TCE
        tce_col = chr(ord(end_col) + 1)
        ws[tce_col + '7'].fill = table_fill
        ws[tce_col + '7'].font = name_font
        ws[tce_col + '7'].alignment = c_c_alignment
        ws[tce_col + '7'] = "吨标准煤 (TCE)"
        ws[tce_col + '7'].border = f_border

        ws[tce_col + '8'].font = name_font
        ws[tce_col + '8'].alignment = c_c_alignment
        ws[tce_col + '8'] = round(
            reporting_period_data['total_in_kgce'] / 1000, 2)
        ws[tce_col + '8'].border = f_border

        ws[tce_col + '9'].font = name_font
        ws[tce_col + '9'].alignment = c_c_alignment
        ws[tce_col + '9'] = round(
            reporting_period_data['total_in_kgce_per_unit_area'] / 1000, 2)
        ws[tce_col + '9'].border = f_border

        ws[tce_col + '10'].font = name_font
        ws[tce_col + '10'].alignment = c_c_alignment
        ws[tce_col + '10'] = str(round(reporting_period_data['increment_rate_in_kgce'] * 100, 2)) + "%" \
            if reporting_period_data['increment_rate_in_kgce'] is not None else "-"
        ws[tce_col + '10'].border = f_border

        # TCO2E
        tco2e_col = chr(ord(end_col) + 2)
        ws[tco2e_col + '7'].fill = table_fill
        ws[tco2e_col + '7'].font = name_font
        ws[tco2e_col + '7'].alignment = c_c_alignment
        ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)"
        ws[tco2e_col + '7'].border = f_border

        ws[tco2e_col + '8'].font = name_font
        ws[tco2e_col + '8'].alignment = c_c_alignment
        ws[tco2e_col + '8'] = round(
            reporting_period_data['total_in_kgco2e'] / 1000, 2)
        ws[tco2e_col + '8'].border = f_border

        ws[tco2e_col + '9'].font = name_font
        ws[tco2e_col + '9'].alignment = c_c_alignment
        ws[tco2e_col + '9'] = round(
            reporting_period_data['total_in_kgco2e_per_unit_area'] / 1000, 2)
        ws[tco2e_col + '9'].border = f_border

        ws[tco2e_col + '10'].font = name_font
        ws[tco2e_col + '10'].alignment = c_c_alignment
        ws[tco2e_col + '10'] = str(round(reporting_period_data['increment_rate_in_kgco2e'] * 100, 2)) + "%" \
            if reporting_period_data['increment_rate_in_kgco2e'] is not None else "-"
        ws[tco2e_col + '10'].border = f_border
    else:
        for i in range(6, 10 + 1):
            ws.row_dimensions[i].height = 0.1
    #################################################
    # Second: 分时电耗
    # 12: title
    # 13: table title
    # 14~17 table_data
    # Total: 6 rows
    ################################################
    has_ele_peak_flag = True
    if "toppeaks" not in reporting_period_data.keys() or \
            reporting_period_data['toppeaks'] is None or \
            len(reporting_period_data['toppeaks']) == 0:
        has_ele_peak_flag = False

    if has_ele_peak_flag:
        ws['B12'].font = title_font
        ws['B12'] = name + ' 分时电耗'

        ws.row_dimensions[13].height = 60
        ws['B13'].fill = table_fill
        ws['B13'].font = name_font
        ws['B13'].alignment = c_c_alignment
        ws['B13'].border = f_border

        ws['C13'].fill = table_fill
        ws['C13'].font = name_font
        ws['C13'].alignment = c_c_alignment
        ws['C13'].border = f_border
        ws['C13'] = '分时电耗'

        ws['B14'].font = title_font
        ws['B14'].alignment = c_c_alignment
        ws['B14'] = '尖'
        ws['B14'].border = f_border

        ws['C14'].font = title_font
        ws['C14'].alignment = c_c_alignment
        ws['C14'].border = f_border
        ws['C14'] = round(reporting_period_data['toppeaks'][0], 2)

        ws['B15'].font = title_font
        ws['B15'].alignment = c_c_alignment
        ws['B15'] = '峰'
        ws['B15'].border = f_border

        ws['C15'].font = title_font
        ws['C15'].alignment = c_c_alignment
        ws['C15'].border = f_border
        ws['C15'] = round(reporting_period_data['onpeaks'][0], 2)

        ws['B16'].font = title_font
        ws['B16'].alignment = c_c_alignment
        ws['B16'] = '平'
        ws['B16'].border = f_border

        ws['C16'].font = title_font
        ws['C16'].alignment = c_c_alignment
        ws['C16'].border = f_border
        ws['C16'] = round(reporting_period_data['midpeaks'][0], 2)

        ws['B17'].font = title_font
        ws['B17'].alignment = c_c_alignment
        ws['B17'] = '谷'
        ws['B17'].border = f_border

        ws['C17'].font = title_font
        ws['C17'].alignment = c_c_alignment
        ws['C17'].border = f_border
        ws['C17'] = round(reporting_period_data['offpeaks'][0], 2)

        pie = PieChart()
        pie.title = name + ' 分时电耗'
        labels = Reference(ws, min_col=2, min_row=14, max_row=17)
        pie_data = Reference(ws, min_col=3, min_row=13, max_row=17)
        pie.add_data(pie_data, titles_from_data=True)
        pie.set_categories(labels)
        pie.height = 7.25  # cm 1.05*5 1.05cm = 30 pt
        pie.width = 9
        # pie.title = "Pies sold by category"
        s1 = pie.series[0]
        s1.dLbls = DataLabelList()
        s1.dLbls.showCatName = False  # 标签显示
        s1.dLbls.showVal = True  # 数量显示
        s1.dLbls.showPercent = True  # 百分比显示
        # s1 = CharacterProperties(sz=1800)     # 图表中字体大小 *100

        ws.add_chart(pie, "D13")

    else:
        for i in range(12, 18 + 1):
            ws.row_dimensions[i].height = 0.1

    ################################################
    # Fourth: 能耗详情
    # current_row_number: title
    # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line
    # current_row_number+1+ca_len*6: table title
    # current_row_number+1+ca_len*6~: table_data
    ################################################
    current_row_number = 19
    reporting_period_data = report['reporting_period']
    times = reporting_period_data['timestamps']
    has_detail_data_flag = True
    ca_len = len(report['reporting_period']['names'])
    parameters_names_len = len(report['parameters']['names'])
    parameters_parameters_datas_len = 0
    for i in range(0, parameters_names_len):
        if len(report['parameters']['timestamps'][i]) == 0:
            continue
        parameters_parameters_datas_len += 1
    table_row = current_row_number + (ca_len +
                                      parameters_parameters_datas_len) * 6 + 2
    chart_start_row_number = current_row_number + 1
    if "timestamps" not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0:
        has_detail_data_flag = False

    if has_detail_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 详细数据'

        ws.row_dimensions[table_row].height = 60
        ws['B' + str(table_row)].fill = table_fill
        ws['B' + str(table_row)].font = title_font
        ws['B' + str(table_row)].border = f_border
        ws['B' + str(table_row)].alignment = c_c_alignment
        ws['B' + str(table_row)] = '日期时间'
        time = times[0]
        has_data = False
        max_row = 0
        if len(time) > 0:
            has_data = True
            max_row = table_row + len(time)
            print("max_row", max_row)

        if has_data:
            for i in range(0, len(time)):
                col = 'B'
                row = str(table_row + 1 + i)
                # col = chr(ord('B') + i)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = time[i]
                ws[col + row].border = f_border

            for i in range(0, ca_len):
                # 38 title
                col = chr(ord('C') + i)

                ws[col + str(table_row)].fill = table_fill
                ws[col + str(table_row)].font = title_font
                ws[col + str(table_row)].alignment = c_c_alignment
                ws[col + str(table_row)] = reporting_period_data['names'][i] + \
                    " (" + reporting_period_data['units'][i] + ")"
                ws[col + str(table_row)].border = f_border

                # 39 data
                time = times[i]
                time_len = len(time)

                for j in range(0, time_len):
                    row = str(table_row + 1 + j)
                    # col = chr(ord('B') + i)
                    ws[col + row].font = title_font
                    ws[col + row].alignment = c_c_alignment
                    ws[col + row] = round(
                        reporting_period_data['values'][i][j], 2)
                    ws[col + row].border = f_border

            current_row_number = table_row + 1 + len(times[0])

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = '小计'

            for i in range(0, ca_len):
                col = chr(ord('C') + i)
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)].border = f_border
                ws[col + str(current_row_number)] = round(
                    reporting_period_data['subtotals'][i], 2)

                # line
                # 39~: line
                line = LineChart()
                line.title = '报告期消耗 - ' + ws.cell(column=3 + i,
                                                  row=table_row).value
                labels = Reference(ws,
                                   min_col=2,
                                   min_row=table_row + 1,
                                   max_row=max_row)
                line_data = Reference(ws,
                                      min_col=3 + i,
                                      min_row=table_row,
                                      max_row=max_row)  # openpyxl bug
                line.add_data(line_data, titles_from_data=True)
                line.set_categories(labels)
                line_data = line.series[0]
                line_data.marker.symbol = "circle"
                line_data.smooth = True
                line.x_axis.crosses = 'min'
                line.height = 8.25  # cm 1.05*5 1.05cm = 30 pt
                line.width = 24
                # pie.title = "Pies sold by category"
                line.dLbls = DataLabelList()
                line.dLbls.dLblPos = 't'
                # line.dLbls.showCatName = True  # label show
                line.dLbls.showVal = True  # val show
                line.dLbls.showPercent = True  # percent show
                # s1 = CharacterProperties(sz=1800)     # font size *100
                chart_col = 'B'
                chart_cell = chart_col + str(chart_start_row_number + 6 * i)
                ws.add_chart(line, chart_cell)

    ##########################################
    has_parameters_names_and_timestamps_and_values_data = True

    ca_len = len(report['reporting_period']['names'])
    current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']

        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(
                i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws[
            'G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' +
                      str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' +
                      str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[
            parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 'B'

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            parameters_ws[table_current_col_number +
                          str(parameters_ws_current_row_number -
                              1)].fill = table_fill
            parameters_ws[table_current_col_number +
                          str(parameters_ws_current_row_number -
                              1)].border = f_border

            col = decimal_to_column(
                column_to_decimal(table_current_col_number) + 1)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = table_current_col_number

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = decimal_to_column(column_to_decimal(col) + 1)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(
                    parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = decimal_to_column(
                column_to_decimal(table_current_col_number) + 3)

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws,
                               min_col=labels_col,
                               min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) +
                                        parameters_table_start_row_number))
            line_data = Reference(
                parameters_ws,
                min_col=data_col,
                min_row=parameters_table_start_row_number,
                max_row=(len(parameters_data['timestamps'][i]) +
                         parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #14
0
def generate_excel(report,
                   name,
                   reporting_start_datetime_local,
                   reporting_end_datetime_local,
                   period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000')
                      )
    b_border = Border(
        bottom=Side(border_style='medium', color='00000000'),
    )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period_efficiency" not in report.keys() or \
            "names" not in report['reporting_period_efficiency'].keys() or len(
            report['reporting_period_efficiency']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    ##################################

    current_row_number = 6

    reporting_period_data = report['reporting_period_efficiency']

    has_names_data_flag = True

    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_names_data_flag = False

    if has_names_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 报告期累积效率'

        current_row_number += 1

        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[current_row_number].height = 80
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].border = f_border

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = \
                reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '累积效率'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(reporting_period_data['cumulations'][i], 2)

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '环比'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = str(
                round(reporting_period_data['increment_rates'][i] * 100, 2)) + '%' \
                if reporting_period_data['increment_rates'][i] is not None else '-'

            col = chr(ord(col) + 1)

        current_row_number += 2

    #####################################

    has_parameters_names_and_timestamps_and_values_data = True
    current_sheet_parameters_row_number = current_row_number

    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):

        has_parameters_names_and_timestamps_and_values_data = False

    #####################################

    has_values_data = True
    has_timestamps_data = True

    if 'values' not in reporting_period_data.keys() or \
            reporting_period_data['values'] is None or \
            len(reporting_period_data['values']) == 0:
        has_values_data = False

    if 'timestamps' not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0 or \
            len(reporting_period_data['timestamps'][0]) == 0:
        has_timestamps_data = False

    if has_values_data and has_timestamps_data:
        ca_len = len(reporting_period_data['names'])
        time = reporting_period_data['timestamps'][0]

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 报告期累积效率'

        current_row_number += 1

        chart_start_row_number = current_row_number

        current_row_number += ca_len * 6 + 1

        if has_parameters_names_and_timestamps_and_values_data:
            current_sheet_parameters_row_number = current_row_number
            real_timestamps_len = timestamps_data_not_equal_0(report['parameters']['timestamps'])
            current_row_number += 6*real_timestamps_len + 2

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 详细数据'

        current_row_number += 1

        table_start_row_number = current_row_number

        ws.row_dimensions[current_row_number].height = 85
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '日期时间'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = title_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = \
                reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            col = chr(ord(col) + 1)

        current_row_number += 1

        for i in range(0, len(time)):
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = time[i]

            col = 'C'
            for j in range(0, ca_len):
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)].border = f_border
                ws[col + str(current_row_number)] = round(reporting_period_data['values'][j][i], 2) \
                    if reporting_period_data['values'][j][i] is not None else 0.00
                col = chr(ord(col) + 1)

            current_row_number += 1

        table_end_row_number = current_row_number - 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '小计'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = title_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(reporting_period_data['cumulations'][i], 2)
            col = chr(ord(col) + 1)

        current_row_number += 2

        format_time_width_number = 1.0
        min_len_number = 1.0
        min_width_number = 11.0  # format_time_width_number * min_len_number + 4 and min_width_number > 11.0

        if period_type == 'hourly':
            format_time_width_number = 4.0
            min_len_number = 2
            min_width_number = 12.0
        elif period_type == 'daily':
            format_time_width_number = 2.5
            min_len_number = 4
            min_width_number = 14.0
        elif period_type == 'monthly':
            format_time_width_number = 2.1
            min_len_number = 4
            min_width_number = 12.4
        elif period_type == 'yearly':
            format_time_width_number = 1.5
            min_len_number = 5
            min_width_number = 11.5

        for i in range(0, ca_len):
            line = LineChart()
            line.title = '报告期累积效率 - ' + \
                         reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
            line_data = Reference(ws, min_col=3 + i, min_row=table_start_row_number, max_row=table_end_row_number)
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = format_time_width_number * len(time) if len(time) > min_len_number else min_width_number
            if line.width > 24:
                line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = True
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

    #####################################################################

    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']
        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12+parameters_names_len*3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 2

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            col = format_cell.get_column_letter(table_current_col_number)

            parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border

            col = format_cell.get_column_letter(table_current_col_number + 1)

            parameters_ws[col + str(parameters_ws_current_row_number-1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number-1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number-1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number-1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number-1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = format_cell.get_column_letter(table_current_col_number)

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = format_cell.get_column_letter(table_current_col_number + 1)

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = table_current_col_number + 3

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3+col_index*3
            labels_col = 2+col_index*3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i])+parameters_table_start_row_number))
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
                                  max_row=(len(parameters_data['timestamps'][i])+parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #15
0
def SaveXlsxFile():
    wb = Workbook()
    wsSummary = wb.active
    wsSummary.title = 'Summary'

    wsSummary.append(["Name", roast.name])
    wsSummary.append(["Start Weight", roast.preWeight])
    wsSummary.append(["End Weight", roast.postWeight])
    wsSummary.append(["Weight Loss", roast.getWeightLoss()])
    wsSummary.append(["First Crack", roast.firstCrack])
    wsSummary.append(["Second Crack", roast.secondCrack])

    wsSummary['B5'].number_format = 'mm:ss.00'
    wsSummary['B6'].number_format = 'mm:ss.00'
    wsSummary.column_dimensions['A'].width = 12
    wsSummary.column_dimensions['B'].width = 25

    wsData = wb.create_sheet(title="Data")
    wsData.append([
        'Time', 'Internal Temp', 'Target Temp', 'Thermocouple Temp',
        'Delta Temp', 'Fan Speed', 'Heat', 'PID Output', 'P', 'I', 'D',
        'Heat State Index'
    ])
    for log in roaster.log:
        wsData.append(log)

    for index in range(2, len(roaster.log) + 2):
        wsData['A' + str(index)].number_format = 'mm:ss.00'

    chart = LineChart()
    chart.title = "Temperature Profile"
    chart.style = 2
    chart.y_axis.title = 'Temperature (F)'
    chart.x_axis.title = 'Time'

    data = Reference(wsData,
                     min_col=3,
                     min_row=1,
                     max_col=4,
                     max_row=len(roaster.log) + 1)
    timings = Reference(wsData,
                        min_col=1,
                        min_row=1,
                        max_col=1,
                        max_row=len(roaster.log) + 1)
    chart.add_data(data, titles_from_data=True)
    chart.set_categories(timings)

    wsSummary.add_chart(chart, "A9")

    chart2 = LineChart()
    chart2.title = "Roaster Settings"
    chart2.style = 2
    chart2.y_axis.title = 'Setting'
    chart2.x_axis.title = 'Time'

    fanHeatData = Reference(wsData,
                            min_col=5,
                            min_row=1,
                            max_col=6,
                            max_row=len(roaster.log) + 1)
    chart2.add_data(fanHeatData, titles_from_data=True)
    chart2.set_categories(timings)

    wsSummary.add_chart(chart2, "A24")
    # Save the file
    wb.save('roasts/' + roast.startTime.strftime('%y-%m-%d ') + roast.name +
            ".xlsx")
Example #16
0
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active

from openpyxl.chart import BarChart, Reference, LineChart
# bar_value = Reference(ws, min_row=2, max_row=11, min_col=2, max_col=3)
# bar_chart = BarChart() #차트 종류 설정
# bar_chart.add_data(bar_value)# 차트 데이터 추가

# ws.add_chart(bar_chart, "E1") #차트 넣을 위치 정ㅇ의

line_value = Reference(ws, min_row=1, max_row=11, min_col=2, max_col=3)
line_chart = LineChart()
line_chart.add_data(line_value, titles_from_data=True)
line_chart.title = "성적표"
line_chart.style = 10
line_chart.y_axis.title = "점수"
line_chart.x_axis.title = "번호"
ws.add_chart(line_chart, "E1")

wb.save("sample_chart.xlsx")
Example #17
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    ##################################

    reporting_period_data = report['reporting_period']

    has_cost_data_flag = True

    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_cost_data_flag = False

    if has_cost_data_flag:
        ws['B5'].font = title_font
        ws['B5'] = name + ' 报告期收入'
        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[7].height = 60
        ws['B6'].fill = table_fill
        ws['B6'].border = f_border

        ws['B7'].font = title_font
        ws['B7'].alignment = c_c_alignment
        ws['B7'] = '报告期收入总计'
        ws['B7'].border = f_border

        ws['B8'].font = title_font
        ws['B8'].alignment = c_c_alignment
        ws['B8'] = '单位面积值'
        ws['B8'].border = f_border

        ws['B9'].font = title_font
        ws['B9'].alignment = c_c_alignment
        ws['B9'] = '环比'
        ws['B9'].border = f_border

        col = ''

        for i in range(0, ca_len):
            col = chr(ord('C') + i)

            ws[col + '6'].fill = table_fill
            ws[col + '6'].font = name_font
            ws[col + '6'].alignment = c_c_alignment
            ws[col + '6'] = reporting_period_data['names'][
                i] + " (" + reporting_period_data['units'][i] + ")"
            ws[col + '6'].border = f_border

            ws[col + '7'].font = name_font
            ws[col + '7'].alignment = c_c_alignment
            ws[col + '7'] = round(reporting_period_data['subtotals'][i], 2)
            ws[col + '7'].border = f_border

            ws[col + '8'].font = name_font
            ws[col + '8'].alignment = c_c_alignment
            ws[col + '8'] = round(
                reporting_period_data['subtotals_per_unit_area'][i], 2)
            ws[col + '8'].border = f_border

            ws[col + '9'].font = name_font
            ws[col + '9'].alignment = c_c_alignment
            ws[col + '9'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \
                if reporting_period_data['increment_rates'][i] is not None else "-"
            ws[col + '9'].border = f_border

        col = chr(ord(col) + 1)

        ws[col + '6'].fill = table_fill
        ws[col + '6'].font = name_font
        ws[col + '6'].alignment = c_c_alignment
        ws[col + '6'] = "总计 (" + reporting_period_data['total_unit'] + ")"
        ws[col + '6'].border = f_border

        ws[col + '7'].font = name_font
        ws[col + '7'].alignment = c_c_alignment
        ws[col + '7'] = round(reporting_period_data['total'], 2)
        ws[col + '7'].border = f_border

        ws[col + '8'].font = name_font
        ws[col + '8'].alignment = c_c_alignment
        ws[col + '8'] = round(reporting_period_data['total_per_unit_area'], 2)
        ws[col + '8'].border = f_border

        ws[col + '9'].font = name_font
        ws[col + '9'].alignment = c_c_alignment
        ws[col + '9'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['total_increment_rate'] is not None else "-"
        ws[col + '9'].border = f_border

    else:
        for i in range(6, 9 + 1):
            ws.row_dimensions[i].height = 0.1
    ##################################
    current_row_number = 11
    has_subtotals_data_flag = True
    if "subtotals" not in reporting_period_data.keys() or \
            reporting_period_data['subtotals'] is None or \
            len(reporting_period_data['subtotals']) == 0:
        has_subtotals_data_flag = False

    if has_subtotals_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 收入占比'

        current_row_number += 1

        table_start_row_number = current_row_number

        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = name_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border

        ws['C' + str(current_row_number)].fill = table_fill
        ws['C' + str(current_row_number)].font = name_font
        ws['C' + str(current_row_number)].alignment = c_c_alignment
        ws['C' + str(current_row_number)].border = f_border
        ws['C' + str(current_row_number)] = '收入'

        ws['D' + str(current_row_number)].fill = table_fill
        ws['D' + str(current_row_number)].font = name_font
        ws['D' + str(current_row_number)].alignment = c_c_alignment
        ws['D' + str(current_row_number)].border = f_border
        ws['D' + str(current_row_number)] = '收入占比'

        current_row_number += 1

        ca_len = len(reporting_period_data['names'])
        total = Decimal(0.0)
        for i in range(0, ca_len):
            total = reporting_period_data['subtotals'][i] + total

        for i in range(0, ca_len):
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' +
               str(current_row_number)] = reporting_period_data['names'][i]
            ws['B' + str(current_row_number)].border = f_border

            ws['C' + str(current_row_number)].font = title_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = round(
                reporting_period_data['subtotals'][i], 2)

            ws['D' + str(current_row_number)].font = title_font
            ws['D' + str(current_row_number)].alignment = c_c_alignment
            ws['D' + str(current_row_number)].border = f_border
            ws['D' + str(current_row_number)] = '{:.2%}'.format(reporting_period_data['subtotals'][i] / total) \
                if total > Decimal(0.0) else '-'

            current_row_number += 1

        table_end_row_number = current_row_number - 1

        pie = PieChart()
        pie.title = name + ' 收入占比'
        labels = Reference(ws,
                           min_col=2,
                           min_row=table_start_row_number + 1,
                           max_row=table_end_row_number)
        pie_data = Reference(ws,
                             min_col=3,
                             min_row=table_start_row_number,
                             max_row=table_end_row_number)
        pie.add_data(pie_data, titles_from_data=True)
        pie.set_categories(labels)
        pie.height = 6.6
        pie.width = 9
        s1 = pie.series[0]
        s1.dLbls = DataLabelList()
        s1.dLbls.showCatName = False
        s1.dLbls.showVal = True
        s1.dLbls.showPercent = True
        table_cell = 'E' + str(table_start_row_number)
        ws.add_chart(pie, table_cell)

        if ca_len < 4:
            current_row_number = current_row_number - ca_len + 4

        current_row_number += 1

    #################################################

    reporting_period_data = report['reporting_period']
    times = reporting_period_data['timestamps']
    has_detail_data_flag = True
    ca_len = len(report['reporting_period']['names'])
    real_timestamps_len = timestamps_data_not_equal_0(
        report['parameters']['timestamps'])
    table_row = (current_row_number + 1) + ca_len * 6 + real_timestamps_len * 7
    current_end_row_number = current_row_number
    if "timestamps" not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0:
        has_detail_data_flag = False

    if has_detail_data_flag:
        current_end_row_number += ca_len * 6 + 1
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 详细数据'

        ws.row_dimensions[table_row].height = 60
        ws['B' + str(table_row)].fill = table_fill
        ws['B' + str(table_row)].font = title_font
        ws['B' + str(table_row)].border = f_border
        ws['B' + str(table_row)].alignment = c_c_alignment
        ws['B' + str(table_row)] = '日期时间'
        time = times[0]
        has_data = False
        max_row = 0
        if len(time) > 0:
            has_data = True
            max_row = table_row + len(time)
            current_end_row_number += (len(time) + 3)

        if has_data:
            for i in range(0, len(time)):
                col = 'B'
                row = str(table_row + 1 + i)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = time[i]
                ws[col + row].border = f_border

            for i in range(0, ca_len):

                col = chr(ord('C') + i)

                ws[col + str(table_row)].fill = table_fill
                ws[col + str(table_row)].font = title_font
                ws[col + str(table_row)].alignment = c_c_alignment
                ws[col + str(table_row)] = reporting_period_data['names'][
                    i] + " (" + reporting_period_data['units'][i] + ")"
                ws[col + str(table_row)].border = f_border

                # 39 data
                time = times[i]
                time_len = len(time)

                for j in range(0, time_len):
                    row = str(table_row + 1 + j)
                    ws[col + row].font = title_font
                    ws[col + row].alignment = c_c_alignment
                    ws[col + row] = round(
                        reporting_period_data['values'][i][j], 2)
                    ws[col + row].border = f_border

                line = LineChart()
                line.title = \
                    '报告期收入 - ' + reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
                labels = Reference(ws,
                                   min_col=2,
                                   min_row=table_row + 1,
                                   max_row=max_row)
                line_data = Reference(ws,
                                      min_col=3 + i,
                                      min_row=table_row,
                                      max_row=max_row)
                line.add_data(line_data, titles_from_data=True)
                line.set_categories(labels)
                line_data = line.series[0]
                line_data.marker.symbol = "circle"
                line_data.smooth = True
                line.x_axis.crosses = 'min'
                line.height = 8.25
                line.width = 24
                line.dLbls = DataLabelList()
                line.dLbls.dLblPos = 't'
                line.dLbls.showVal = True
                line.dLbls.showPercent = False
                chart_col = 'B'
                chart_cell = chart_col + str(current_row_number + 1 + 6 * i)
                table_start_draw_flag = current_row_number
                ws.add_chart(line, chart_cell)

            row = str(max_row + 1)

            ws['B' + row].font = title_font
            ws['B' + row].alignment = c_c_alignment
            ws['B' + row] = '小计'
            ws['B' + row].border = f_border

            col = ''

            for i in range(0, ca_len):
                col = chr(ord('C') + i)
                row = str(max_row + 1)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = round(reporting_period_data['subtotals'][i], 2)
                ws[col + row].border = f_border

            col = chr(ord(col) + 1)

            ws[col + str(table_row)].fill = table_fill
            ws[col + str(table_row)].font = title_font
            ws[col + str(table_row)].alignment = c_c_alignment
            ws[col +
               str(table_row
                   )] = '总计 (' + report['reporting_period']['total_unit'] + ')'
            ws[col + str(table_row)].border = f_border

            total_sum = Decimal(0.0)

            for j in range(0, len(time)):
                row = str(table_row + 1 + j)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                every_day_sum = reporting_period_values_every_day_sum(
                    reporting_period_data, j, ca_len)
                total_sum += every_day_sum
                ws[col + row] = round(every_day_sum, 2)
                ws[col + row].border = f_border

            row = str(table_row + 1 + len(time))
            ws[col + row].font = title_font
            ws[col + row].alignment = c_c_alignment
            ws[col + row] = round(total_sum, 2)
            ws[col + row].border = f_border

        current_row_number = current_end_row_number

    ##################################

    has_child_flag = True

    if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \
            len(report['child_space']["energy_category_names"]) == 0 \
            or 'child_space_names_array' not in report['child_space'].keys() \
            or report['child_space']['energy_category_names'] is None \
            or len(report['child_space']['child_space_names_array']) == 0 \
            or len(report['child_space']['child_space_names_array'][0]) == 0:
        has_child_flag = False

    if has_child_flag:
        child = report['child_space']
        current_row_number = int(row) + 1
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 子空间数据'

        current_row_number += 1
        table_start_row_number = current_row_number

        ws.row_dimensions[current_row_number].height = 60
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = name_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '子空间'
        ca_len = len(child['energy_category_names'])

        col = ''

        for i in range(0, ca_len):
            col = chr(ord('C') + i)
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = child['energy_category_names'][
                i] + ' (' + child['units'][i] + ')'

        col = chr(ord(col) + 1)
        ws[col + str(current_row_number)].fill = table_fill
        ws[col + str(current_row_number)].font = name_font
        ws[col + str(current_row_number)].alignment = c_c_alignment
        ws[col + str(current_row_number)].border = f_border
        ws[col +
           str(current_row_number
               )] = '总计 (' + report['reporting_period']['total_unit'] + ')'

        space_len = len(child['child_space_names_array'][0])

        for i in range(0, space_len):
            current_row_number += 1
            row = str(current_row_number)

            ws['B' + row].font = title_font
            ws['B' + row].alignment = c_c_alignment
            ws['B' + row] = child['child_space_names_array'][0][i]
            ws['B' + row].border = f_border

            col = ''
            every_day_sum = Decimal(0.0)

            for j in range(0, ca_len):
                col = chr(ord('C') + j)
                ws[col + row].font = name_font
                ws[col + row].alignment = c_c_alignment
                every_day_sum += child['subtotals_array'][j][i]
                ws[col + row] = round(child['subtotals_array'][j][i], 2)
                ws[col + row].border = f_border

            col = chr(ord(col) + 1)
            ws[col + row].font = name_font
            ws[col + row].alignment = c_c_alignment
            ws[col + row] = round(every_day_sum, 2)
            ws[col + row].border = f_border

        table_end_row_number = current_row_number

        current_row_number += 1

        chart_start_row_number = current_row_number

        # Pie
        for i in range(0, ca_len):
            pie = PieChart()
            labels = Reference(ws,
                               min_col=2,
                               min_row=table_start_row_number + 1,
                               max_row=table_end_row_number)
            pie_data = Reference(ws,
                                 min_col=3 + i,
                                 min_row=table_start_row_number,
                                 max_row=table_end_row_number)
            pie.add_data(pie_data, titles_from_data=True)
            pie.set_categories(labels)
            pie.height = 6.6
            pie.width = 8
            pie.title = ws.cell(column=3 + i, row=table_start_row_number).value
            s1 = pie.series[0]
            s1.dLbls = DataLabelList()
            s1.dLbls.showCatName = False
            s1.dLbls.showVal = True
            s1.dLbls.showPercent = True
            chart_cell = ''
            if i % 2 == 0:
                chart_cell = 'B' + str(chart_start_row_number)
            else:
                chart_cell = 'E' + str(chart_start_row_number)
                chart_start_row_number += 5
            ws.add_chart(pie, chart_cell)

        current_row_number = chart_start_row_number

        if ca_len % 2 == 1:
            current_row_number += 5

        current_row_number += 1

    #############################################
    current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6 + 1
    has_parameters_names_and_timestamps_and_values_data = True
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']
        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(
                i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws[
            'G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' +
                      str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' +
                      str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[
            parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 2

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            col = format_cell.get_column_letter(table_current_col_number)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border

            col = format_cell.get_column_letter(table_current_col_number + 1)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = format_cell.get_column_letter(table_current_col_number)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = format_cell.get_column_letter(table_current_col_number +
                                                    1)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(
                    parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = table_current_col_number + 3

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws,
                               min_col=labels_col,
                               min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) +
                                        parameters_table_start_row_number))
            line_data = Reference(
                parameters_ws,
                min_col=data_col,
                min_row=parameters_table_start_row_number,
                max_row=(len(parameters_data['timestamps'][i]) +
                         parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1
    ##########################################
    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #18
0
ws = wb.get_sheet_by_name('newsum')
'''
rows = [
    ['Date', 'Batch 1', 'Batch 2', 'Batch 3'],
    [date(2015,9, 1), 40, 30, 25],
    [date(2015,9, 2), 40, 25, 30],
    [date(2015,9, 3), 50, 30, 45],
    [date(2015,9, 4), 30, 25, 40],
    [date(2015,9, 5), 25, 35, 30],
    [date(2015,9, 6), 20, 40, 35],
]

for row in rows:
    ws.append(row)
'''
c1 = LineChart()
c1.title = "Activity覆盖率随时间变化关系"
c1.style = 13
c1.y_axis.title = '覆盖率'
c1.x_axis.title = '时间/分钟'

data = Reference(ws, min_col=1, min_row=2, max_col=61, max_row=5)
c1.add_data(data, from_rows=True,titles_from_data=True)

# Style the lines
'''
s1 = c1.series[0]
s1.marker.symbol = "triangle"
s1.marker.graphicalProperties.solidFill = "FF0000" # Marker filling
s1.marker.graphicalProperties.line.solidFill = "FF0000" # Marker outline
s1.graphicalProperties.line.width = 15005 # width in EMUs
Example #19
0
def write_status_to_xls(status, xls_file='./log.xls'):
    """将获取的内容写到excel文件里"""
    wb = Workbook()
    sheet_name = 'cpu'
    sheet = wb.active
    sheet.title = sheet_name
    cpu_status = ['cpu0', 'cpu1', 'cpu2', 'cpu3', 'cpu4', 'cpu5']
    # 真正的数据从第三行开始
    base_offset_value = 3
    # cpu频率
    sheet.cell(row=1, column=1, value='cpu frequency')
    for i in range(6):
        sheet.cell(row=2, column=i + 1, value=cpu_status[i])
    for i in range(0, len(status.cpu_freq[0])):
        for j in range(0, 6):
            sheet.cell(row=i + base_offset_value,
                       column=j + 1,
                       value=status.cpu_freq[j][i])
    # cpu占用率
    base_offset_cpu_utilization = 8
    sheet.cell(row=1,
               column=base_offset_cpu_utilization,
               value='cpu utilization')
    for i in range(6):
        sheet.cell(row=2,
                   column=i + base_offset_cpu_utilization,
                   value=cpu_status[i])
    for i in range(0, len(status.cpu_utilization[0])):
        for j in range(0, 6):
            sheet.cell(row=i + base_offset_value,
                       column=j + base_offset_cpu_utilization,
                       value=status.cpu_utilization[j][i])
    # ram
    base_offset_ram = 15
    sheet.cell(row=2, column=base_offset_ram, value='ram')
    for i in range(0, len(status.ram)):
        sheet.cell(row=i + base_offset_value,
                   column=base_offset_ram,
                   value=status.ram[i])
    # emc
    base_offset_emc = 16
    sheet.cell(row=2, column=base_offset_emc, value='emc')
    for i in range(0, len(status.emc)):
        sheet.cell(row=i + base_offset_value,
                   column=base_offset_emc,
                   value=status.emc[i])
    # gpu
    base_offset_gpu = 17
    sheet.cell(row=2, column=base_offset_gpu, value='gpu')
    for i in range(0, len(status.gpu)):
        sheet.cell(row=i + base_offset_value,
                   column=base_offset_gpu,
                   value=status.gpu[i])

    # 制作line chart
    chart = LineChart()
    chart.y_axis.title = 'Rate'
    # where is the data
    data = Reference(sheet,
                     min_col=base_offset_cpu_utilization,
                     min_row=2,
                     max_row=len(status.gpu) + base_offset_value - 1,
                     max_col=base_offset_cpu_utilization + 5)
    data_gpu = Reference(sheet,
                         min_col=base_offset_gpu,
                         min_row=2,
                         max_row=len(status.gpu) + base_offset_value - 1,
                         max_col=base_offset_gpu)
    chart.add_data(data, titles_from_data=True)
    chart.add_data(data_gpu, titles_from_data=True)
    # chart.layout = Layout(
    #     manualLayout=ManualLayout(
    #         x=2, y=2,
    #         h=2, w=2,
    #     )
    # )
    # chart.add_series({
    #     # 'categories': '=%s!$H$3:$H$%d' % (sheet_name, 2+len(status.gpu)),
    #     'values': '=%s!$H$3:$H$%d' % (sheet_name, 2+len(status.gpu)),
    #     'line': {'color': 'red'},
    # }
    # )
    sheet.add_chart(chart, 'A%d' % (len(status.gpu) + base_offset_value + 1))

    wb.save(xls_file)
    print("Done!")
Example #20
0
print('Выборка: ', bump_plot)
print('Количество значений выборки', len(bump_plot))

# Записываю данные в excel
dataToExcel(bump_plot, file_name)
dataToExcel(accel_list, file_raw_name)

# А здесь попробуем нарисовать красивые графики

wb = openpyxl.load_workbook(file_name)
raw_wb = openpyxl.load_workbook(file_raw_name)  # файл с сырыми данными

ws = wb['Res']
raw_ws = raw_wb['Res']

chart = LineChart()
data = Reference(ws,
                 min_col=1,
                 min_row=1,
                 max_col=ws.max_column,
                 max_row=ws.max_row)
chart.add_data(data, titles_from_data=True)

raw_chart = LineChart()
raw_data = Reference(raw_ws,
                     min_col=1,
                     min_row=1,
                     max_col=raw_ws.max_column,
                     max_row=raw_ws.max_row)
raw_chart.add_data(raw_data, titles_from_data=False)
Example #21
0
def ronava_bar_chart(writingSheet, dataSheet, params):
    # TODO add dictionary in parameters to avoid overlapping
    if params["use"] == "bars":
        data = Reference(
            dataSheet,
            min_col=params["data_min_col"],
            min_row=params["data_min_row"],
            max_row=params["data_max_row"],
            max_col=params["data_max_col"],
        )
        cats = Reference(
            dataSheet,
            min_col=params["cats_min_col"],
            min_row=params["cats_min_row"],
            max_row=params["cats_max_row"],
            max_col=params["cats_max_col"],
        )
        chart = BarChart()
        chart.type = params["type"]
        chart.style = 12
        # chart.grouping = "stacked"
        chart.title = params["title"]
        chart.y_axis.title = params["y_axis"]
        chart.x_axis.title = params["x_axis"]
        chart.add_data(data, titles_from_data=True)
        chart.set_categories(cats)
        chart.height = params["heigth"]
        chart.width = params["width"]
        writingSheet.add_chart(chart, "D2")
    elif params["use"] == "single":
        c1 = BarChart()
        v1 = Reference(
            dataSheet, min_col=params["data_min_col"], min_row=params["data_min_row"], max_col=params["data_max_col"]
        )

        cats = Reference(
            dataSheet, min_col=params["cats_min_col"], min_row=params["cats_min_row"], max_col=params["cats_max_col"]
        )
        c1.series = [Series(v1, title_from_data=True)]
        c1.style = 12
        c1.set_categories(cats)
        c1.x_axis.title = params["x_axis"]
        c1.y_axis.title = params["y_axis"]
        c1.height = params["heigth"]
        c1.width = params["width"]
        c1.title = params["title"]
        writingSheet.add_chart(c1, "D4")
    else:
        c1 = BarChart()
        v1 = Reference(
            dataSheet, min_col=params["data_min_col"], min_row=params["data_min_row"], max_col=params["data_max_col"]
        )

        cats = Reference(
            dataSheet, min_col=params["cats_min_col"], min_row=params["cats_min_row"], max_col=params["cats_max_col"]
        )
        c1.series = [Series(v1, title_from_data=True)]
        c1.y_axis.majorGridlines = None
        c1.set_categories(cats)
        c1.x_axis.title = params["x_axis"]
        c1.y_axis.title = params["y_axis"]
        c1.height = params["heigth"]
        c1.width = params["width"]
        c1.title = params["title"]
        c1.style = 12
        # Create a second chart
        c2 = LineChart()
        v2 = Reference(
            dataSheet,
            min_col=params["data_min_col"],
            min_row=params["data_min_row"] + 1,
            max_col=params["data_max_col"],
        )
        c2.series = [Series(v2, title_from_data=True)]
        c2.y_axis.axId = 20
        c2.y_axis.title = "Porcentaje Produccion"
        # Assign the y-axis of the second chart to the third axis of the first chart
        c1.z_axis = c2.y_axis
        c1.y_axis.crosses = "max"
        c1 += c2

        writingSheet.add_chart(c1, "D4")
Example #22
0
def main():
    if len(sys.argv) != 2:
        print("Usage: $ python %s excel_file" % sys.argv[0])
        quit()

    excel_file = sys.argv[1]
    logger.info(excel_file)

    wb = load_workbook(excel_file, read_only=True)
    out_excel_file = "{}_result.xlsx".format(re.sub(r"\.[^\.]+$", "", excel_file))
    wb_out = Workbook()
    ws_summary = wb_out.active
    ws_summary.title = "summary"
    ws_summary['A1'] = "FuguAutoML summary file"
    ws_summary['A2'] = "create timedate"
    ws_summary['B2'] = datetime.datetime.now().strftime("%Y/%m/%d %H:%M:%S")
    wb_out.save(out_excel_file)

    logger.info("out_excel_file = {}".format(out_excel_file))

    logger.info("load conf sheet")
    conf_sheet = wb["conf"]
    conf = {}
    for i in range(1, conf_sheet.max_row + 1):
        key_cel = conf_sheet[i][0].value
        val_cel = conf_sheet[i][2].value
        if key_cel:
            conf[key_cel] = val_cel

    logger.info(pp.pformat(conf))

    table_structure_sheet = conf["table_structure"]
    main_table = conf["main_table"]
    operation = conf["operation"]
    objective_column = conf["objective_column"]
    key_column = conf["key_column"]
    apply_table = conf["apply_table"]

    logger.info("load table_structure sheet")
    table_sheet = wb[table_structure_sheet]
    table_structure = {}
    for i in range(2, table_sheet.max_row + 1):
        table_name = table_sheet[i][0].value
        col_name = table_sheet[i][1].value
        ope = table_sheet[i][2].value
        if table_name and col_name and ope:
            if table_name not in table_structure:
                table_structure[table_name] = {}
            if col_name not in table_structure[table_name]:
                table_structure[table_name][col_name] = ope
    logger.info(pp.pformat(table_structure))

    logger.info("load data")
    Xs = {}
    X_apply = None
    for data_table in table_structure:
        data_sheet = wb[data_table]
        data_type = {}
        use_col = []
        for i in range(data_sheet.max_column):
            col_name = data_sheet[1][i].value
            if col_name in table_structure[data_table]:
                use_col.append(i)
                ope = table_structure[data_table][col_name]
                if ope == CONSTANT.KEY_TYPE or ope == CONSTANT.CATEGORY_TYPE or \
                        ope == CONSTANT.TEXT_TYPE or ope == CONSTANT.TEXTJA_TYPE:
                    data_type[col_name] = str
                elif ope == CONSTANT.NUMERICAL_TYPE:
                    data_type[col_name] = np.float64
                elif ope == CONSTANT.OBJ_TYPE:
                    data_type[col_name] = np.int64
                else:
                    logger.warn("type handling error")

        pd_sheet = pd.read_excel(excel_file, sheet_name=data_table, usecols=use_col,
                                 dtype=data_type)
        Xs[data_table] = pd_sheet
        if data_table == main_table:
            X_apply = pd.read_excel(excel_file, sheet_name=apply_table, usecols=use_col,
                                 dtype=data_type)
    logger.info(pp.pformat(Xs))

    for ws_name in Xs.keys():
        write_excel_sheet(wb_out, "{}_desc".format(ws_name), Xs[ws_name].describe(include="all"), min_len=1)
    write_excel_sheet(wb_out, "{}_desc".format(apply_table), X_apply.describe(include="all"), min_len=1)

    logger.info("new AutoML instance")
    amt_struct = {}
    for t in table_structure:
        for c in table_structure[t]:
            if t not in amt_struct:
                amt_struct[t] = []
            if table_structure[t][c] != CONSTANT.OBJ_TYPE:
                amt_struct[t].append((c, table_structure[t][c]))
    logger.info(amt_struct)

    amt = AutoMLTable({"struct": amt_struct}, key_col=key_column, main_tbl=main_table, apply_tbl=apply_table)
    amt.n_trials = 100
    obj = np.array(Xs[main_table][objective_column]).ravel()
    scores, importance, proba_importances, cv_result, proba_cv_result, main_features = amt.make_model(Xs, obj)
    pp.pprint(proba_importances)

    ws_summary["A3"] = "cv scores (roc auc)"
    for i, s in enumerate(scores):
        ws_summary.cell(column=2+i, row=3, value=s)
    ws_summary["A4"] = "cv scores prob (roc auc)"
    for i, s in enumerate(proba_cv_result["scores"]):
        ws_summary.cell(column=2+i, row=4, value=s)

    imp_data = importance[0]
    importance_sheet = pd.DataFrame()
    importance_sheet["feature_name"] = [im[2] for im in imp_data]
    importance_sheet["all_gain"] = [im[0] for im in imp_data]
    importance_sheet["all_split"] = [im[1] for im in imp_data]
    for i, imp in enumerate(proba_importances):
        importance_sheet["all_probability-{}_gain".format(i)] = [imp[im[2]][0] for im in importance[0]]
    for i, imp in enumerate(cv_result["importances"]):
        importance_sheet["CVfold-{}_gain".format(i)] = [imp[1][im[2]][0] for im in importance[0]]
        importance_sheet["CVfold-{}_split".format(i)] = [imp[1][im[2]][1] for im in importance[0]]
    for j, imps in enumerate(proba_cv_result["importances"]):
        for i, imp in enumerate(imps):
            importance_sheet["CVfold_probability-{}-{}_gain".format(j, i)] = [imp[im[2]][0] for im in importance[0]]
    write_excel_sheet(wb_out, "importance", importance_sheet, index=False)

    cv_sheet = pd.DataFrame()
    cv_sheet["predict_score"] = cv_result["preds"]
    cv_sheet["fold_num"] = cv_result["preds_fold_num"]
    cv_sheet["calibrated_probability"] = proba_cv_result["preds"]
    cv_sheet["rank_in_fold"] = [-1 for i in cv_result["preds_fold_num"]]
    cv_sheet["rank_percentile"] = [-1 for i in cv_result["preds_fold_num"]]
    for fold_num, m in enumerate(cv_result["models"]):
        cv_sheet.loc[cv_sheet["fold_num"] == fold_num, "rank_in_fold"] = \
            cv_sheet[cv_sheet["fold_num"] == fold_num]["predict_score"].rank()
        cv_sheet.loc[cv_sheet["fold_num"] == fold_num, "rank_percentile"] = \
            cv_sheet[cv_sheet["fold_num"] == fold_num]["rank_in_fold"] / \
            cv_sheet[cv_sheet["fold_num"] == fold_num]["rank_in_fold"].max()
    cv_sheet[key_column] = Xs[main_table][key_column]
    cv_sheet["truth"] = obj
    for mf in main_features:
        cv_sheet["feature[{}]".format(mf[0])] = mf[1].todense()
    write_excel_sheet(wb_out, "cv_result", cv_sheet, index=False)

    for_gain_graph = pd.DataFrame()
    for_gain_graph["predict_score"] = [f for f in cv_sheet["predict_score"]]
    for_gain_graph["rank"] = [f for f in cv_sheet["rank_percentile"]]
    for_gain_graph["truth"] = [float(t) for t in cv_sheet["truth"]]
    for_gain_graph[key_column] = [k for k in cv_sheet[key_column]]
    for_gain_graph["fold_num"] = [k for k in cv_sheet["fold_num"]]
    sum_truth = for_gain_graph["truth"].sum()
    subsum_truth = 0.0
    perfect_truth = 0.0
    gain_list = []
    perfect_list = []
    random_list = []
    for_gain_graph.sort_values("rank", inplace=True, ascending=False)
    for idx, row in enumerate(for_gain_graph.itertuples()):
        obj = row[3]
        subsum_truth += obj
        perfect_truth += 1.0
        gain_list.append(subsum_truth / sum_truth)
        perfect_list.append(min(perfect_truth / sum_truth, 1.0))
        random_list.append((idx + 1.0) / len(for_gain_graph["rank"]))
    for_gain_graph["this_model"] = gain_list
    for_gain_graph["perfect_model"] = perfect_list
    for_gain_graph["random"] = random_list
    for_gain_graph["threasolds"] = ["=HLOOKUP(E{}, summary!A6:Z7, 2, FALSE)".format(2+i)
                                    for i, r in enumerate(random_list)]
    for_gain_graph["predict_label"] = ["=IF(A{} >= I{}, 1, 0)".format(2+i, 2+i) for i, r in enumerate(random_list)]
    for_gain_graph["flag"] = ["=INT(100 + C{}*10 +  J{})".format(2+i, 2+i) for i, r in enumerate(random_list)]
    ws = write_excel_sheet(wb_out, "gain", for_gain_graph, index=False)

    c1 = LineChart()
    c1.title = "Gain chart"
    c1.y_axis.title = 'cumulative gain'
    c1.x_axis.title = 'rank'

    data = Reference(ws, min_col=6, min_row=1, max_col=8, max_row=1 + len(gain_list))
    c1.add_data(data, titles_from_data=True)
    s2 = c1.series[1]
    s2.graphicalProperties.line.dashStyle = "sysDot"
    s3 = c1.series[2]
    s3.graphicalProperties.line.dashStyle = "sysDot"
    ws_summary["A20"] = "gain chart"
    ws_summary.add_chart(c1, "A21")
    ws_summary["A6"] = "model no"
    for i, s in enumerate(range(len(cv_result["threasholds"]))):
        ws_summary.cell(column=2+i, row=6, value=s)
    ws_summary["A7"] = "threashold"
    for i, s in enumerate(cv_result["threasholds"]):
        ws_summary.cell(column=2+i, row=7, value=s)
    ws_summary["A8"] = "precision"
    ws_summary["A9"] = "recall"
    ws_summary["A10"] = "f-value"
    ws_summary["C11"] = "truth"
    ws_summary["A13"] = "predict"
    ws_summary["C12"] = "1"
    ws_summary["D12"] = "0"
    ws_summary["B13"] = "1"
    ws_summary["B14"] = "0"
    ws_summary["C13"] = "=COUNTIF(gain!K:K, 111)"
    ws_summary["D13"] = "=COUNTIF(gain!K:K, 101)"
    ws_summary["C14"] = "=COUNTIF(gain!K:K, 110)"
    ws_summary["D14"] = "=COUNTIF(gain!K:K, 100)"
    ws_summary["B8"] = "=C13/(C13+D13)"
    ws_summary["B9"] = "=C13/(C13+C14)"
    ws_summary["B10"] = "=(2*B9*B8)/(B8+B9)"

    ws_summary["A16"] = "TOP"
    ws_summary["B16"] = 0.1
    ws_summary['B16'].number_format = '0.0%'
    ws_summary["C16"] = "capture"
    ws_summary["D16"] = '=SUM(INDIRECT("gain!C2:C"&INT(SUM(C13:D14)*(B16))+1))/SUM(INDIRECT("gain!C2:C"&INT(SUM(C13:D14))+1))'
    ws_summary['D16'].number_format = '0.0%'



    Xs[apply_table] = X_apply
    del Xs[main_table]
    pred, pred_proba, main_features = amt.apply(Xs, proba=True, out_main_feature=True)
    pred_sheet = pd.DataFrame()
    pred_sheet["predict_score"] = pred
    pred_sheet["calibrated_probability"] = pred_proba
    pred_sheet[key_column] = X_apply[key_column]
    for mf in main_features:
        pred_sheet["feature[{}]".format(mf[0])] = mf[1].todense()
    write_excel_sheet(wb_out, "predict_all", pred_sheet, index=False)

    pred, pred_proba, main_features = amt.apply_cv(Xs, proba=True, out_main_feature=True)
    pred_sheet = pd.DataFrame()
    pred_sheet["predict_score"] = pred
    pred_sheet["calibrated_probability"] = pred_proba
    pred_sheet[key_column] = X_apply[key_column]
    for mf in main_features:
        pred_sheet["feature[{}]".format(mf[0])] = mf[1].todense()
    write_excel_sheet(wb_out, "predict_cv", pred_sheet, index=False)

    wb_out.save(out_excel_file)
    return
Example #23
0
    ['Humans', 10, 40, 50, 20, 10, 50],
]

for row in rows:
    ws.append(row)

c1 = BarChart()
v1 = Reference(ws, min_col=1, min_row=1, max_col=7)
c1.series = [Series(v1, title_from_data=True)]

c1.x_axis.title = 'Days'
c1.y_axis.title = 'Aliens'
c1.y_axis.majorGridlines = None
c1.title = 'Survey results'


# Create a second chart
c2 = LineChart()
v2 = Reference(ws, min_col=1, min_row=2, max_col=7)
c2.series = [Series(v2, title_from_data=True)]
c2.y_axis.axId = 20
c2.y_axis.title = "Humans"
# Assign the y-axis of the second chart to the third axis of the first chart
c1.z_axis = c2.y_axis
c1.y_axis.crosses = "max"
c1 += c2

ws.add_chart(c1, "D4")

wb.save("secondary.xlsx")
Example #24
0
def test_monitor():
    wb_tpl = Workbook()
    ws = wb_tpl.active
    # ws = wb_tpl.worksheets[0]
    ws.title = "Monitor"
    """
    [
        [2018/06/17 23:47:11,17.0,16.71],
        [2018/06/17 23:47:13,1.5,17.01],
        [2018/06/17 23:47:15,2.9,17.04],
        ...
    ]
    """
    data_list = CSVUtils.readCSVRowsList("Monitor.csv")
    _max_row = len(data_list)
    _max_col = 3
    for row_index, rows in enumerate(data_list):
        for col_index, value in enumerate(rows):
            if (row_index == 0):
                ws.cell(row=row_index + 1, column=col_index + 1).value = value
            else:
                if (col_index == 0):
                    ws.cell(row=row_index + 1,
                            column=col_index + 1).value = datetime.strptime(
                                value, DATE_TIME_FORMAT)
                    ws.cell(row=row_index + 1,
                            column=col_index + 1).number_format = 'HH:mm:ss'
                else:
                    ws.cell(row=row_index + 1,
                            column=col_index + 1).value = float(value)
    chart1 = LineChart()
    chart1.title = "CPU/Memory Mornitor"
    chart1.style = 2  # default style when new a line chart
    chart1.height = 15  # default is 7.5
    chart1.width = 30  # default is 15
    chart1.legend.position = "b"
    chart1.y_axis.scaling.min = 0
    chart1.y_axis.scaling.max = 100
    # chart1.y_axis.title = 'Pecent'
    # chart1.x_axis.title = 'Time'

    # set y-axis
    data = Reference(ws,
                     min_col=2,
                     min_row=1,
                     max_col=_max_col,
                     max_row=_max_row)
    chart1.add_data(data, titles_from_data=True)

    # set time as category(x-axis)
    cats = Reference(ws, min_col=1, min_row=1, max_row=_max_row)
    chart1.set_categories(cats)

    # Style the lines
    # s1 = c1.series[0]
    # s1.marker.symbol = "triangle"
    # s1.marker.graphicalProperties.solidFill = "FF0000" # Marker filling
    # s1.marker.graphicalProperties.line.solidFill = "FF0000" # Marker outline

    # s1.graphicalProperties.line.noFill = True

    s2 = chart1.series[0]
    s2.smooth = True  # Make the line smooth
    # s2.graphicalProperties.line.solidFill = "00AAAA"
    # s2.graphicalProperties.line.dashStyle = "sysDot"
    # s2.graphicalProperties.line.width = 100050 # width in EMUs

    s2 = chart1.series[1]
    s2.smooth = True  # Make the line smooth
    # chart1.x_axis.tickLblPos = "low"
    # chart1.x_axis.tickLblSkip = 3 # whatever you like
    ws.add_chart(chart1, "F10")

    dest_filename = 'test2.xlsx'
    wb_tpl.save(filename=dest_filename)
    def writeReport(self, filename, trades):
        if not isinstance(trades, ExtendedTradesAnalyzer):
            raise Exception(
                "trades should be an instance of ExtendedTradesAnalyzer")

        wb = Workbook()

        names = wb.sheetnames
        for name in names:
            wb.remove_sheet(wb.get_sheet_by_name(name))

        summarySheet = wb.create_sheet(title="Summary")
        trades_sheet = wb.create_sheet(title="Trades")
        equityGraph_sheet = wb.create_sheet(title="EquityChart")
        detailedEquityGraph_sheet = wb.create_sheet(
            title="DetailedEquityChart")

        # ----- Trades sheeet -----
        numFormat = "[BLACK][>=0]#,##0.0000;[RED][<0]\\(#,##0.0000\\);General"
        perFormat = "[BLACK][>=0]#0.00%;[RED][<0]\\(#0.00%\);General"

        headerFont = Font(name="Arial", bold=True)
        headerAlign = Alignment(horizontal='center')
        header_fill = PatternFill(start_color='AAAAAA',
                                  end_color='AAAAAA',
                                  fill_type='solid')

        highlightFill = PatternFill(start_color='EEEE99',
                                    end_color='EEEE99',
                                    fill_type='solid')
        highlightBorder = Border(
            bottom=Side(border_style="thin", color="000000"))

        standardFont = Font(name="Arial", size="10")

        for col in range(1, 10):
            trades_sheet.cell(row=1, column=col).font = headerFont
            trades_sheet.cell(row=1, column=col).fill = header_fill
            trades_sheet.cell(row=1, column=col).alignment = headerAlign

        trades_sheet['A1'] = "Trade #\nType"
        trades_sheet['B1'] = "Date"
        trades_sheet['C1'] = "Time"
        trades_sheet['D1'] = "Price"
        trades_sheet['E1'] = "Contracts\nProfit"
        trades_sheet['F1'] = "% Profit\nCum Profit"
        trades_sheet['G1'] = "Run-up\nDrawdown"
        trades_sheet['H1'] = "Entry Eff.\nExit Eff."
        trades_sheet['I1'] = "Total\nEfficiency"

        allTrades = trades.getAll()
        allReturns = trades.getAllReturns()
        allEntryDates = trades.allEnterDates
        allExitDates = trades.allExitDates
        longFlags = trades.allLongFlags
        entryPrices = trades.allEntryPrices
        exitPrices = trades.allExitPrices
        allContracts = trades.allContracts
        allCommissions = trades.getCommissionsForAllTrades()

        excelRow = 2
        cumulativeProfit = 0
        cumulativePnL = 0
        cumulativeLosses = 0

        # ----- Equity graph sheet  -----
        equityGraph_sheet.cell(row=1, column=1, value="Trade #")
        equityGraph_sheet.cell(row=1, column=2, value="Equity")

        # -----Detailed Equity graph sheet  -----
        detailedEquityGraph_sheet.cell(row=1, column=1, value="Timestamp")
        detailedEquityGraph_sheet.cell(row=1, column=2, value="Equity")
        r = 2
        for x in sorted(trades.cumPnlDict):
            detailedEquityGraph_sheet.cell(row=r, column=1, value=x)
            detailedEquityGraph_sheet.cell(row=r,
                                           column=2,
                                           value=trades.cumPnlDict[x])
            r += 1
        # Add chart
        c1 = LineChart()
        c1.title = "Equity curve"
        c1.style = 13
        c1.y_axis.title = 'Equity'
        c1.x_axis.title = 'Date'
        c1.y_axis.auto = True
        c1.y_axis.delete = False
        c1.x_axis = DateAxis(crossAx=100)
        c1.x_axis.number_format = 'd-mmm'
        c1.x_axis.majorTimeUnit = "days"
        c1.x_axis.delete = False
        # c1.x_axis.auto = True
        c1.legend = None
        x = Reference(detailedEquityGraph_sheet,
                      min_col=1,
                      min_row=2,
                      max_row=len(trades.cumPnlDict) + 2)
        y = Reference(detailedEquityGraph_sheet,
                      min_col=2,
                      min_row=2,
                      max_row=len(trades.cumPnlDict) + 2)
        c1.add_data(y)
        c1.series[0].smooth = False
        c1.series[0].graphicalProperties.line.solidFill = "000000"
        c1.series[0].graphicalProperties.line.width = 10000  # width in EMUs
        c1.width = 30
        c1.height = 15

        detailedEquityGraph_sheet.add_chart(c1, "D3")

        for i in range(0, trades.getCount()):
            # --- Trades sheet ---
            for col in range(1, 10):
                trades_sheet.cell(row=excelRow, column=col).font = standardFont
                trades_sheet.cell(row=excelRow + 1,
                                  column=col).font = standardFont

            trades_sheet.cell(row=excelRow, column=1, value=i + 1)
            trades_sheet.cell(
                row=excelRow,
                column=1).alignment = Alignment(horizontal='center')
            if longFlags[i]:
                buySell = "Buy"
            else:
                buySell = "Sell"
            trades_sheet.cell(row=excelRow + 1, column=1, value=buySell)
            trades_sheet.cell(
                row=excelRow + 1,
                column=1).alignment = Alignment(horizontal='center')

            entryDate = allEntryDates[i]
            exitDate = allExitDates[i]
            trades_sheet.cell(row=excelRow,
                              column=2,
                              value=entryDate.strftime("%Y-%m-%d"))
            trades_sheet.cell(row=excelRow + 1,
                              column=2,
                              value=exitDate.strftime("%Y-%m-%d"))

            trades_sheet.cell(row=excelRow,
                              column=3,
                              value=entryDate.strftime("%H:%M"))
            trades_sheet.cell(row=excelRow + 1,
                              column=3,
                              value=exitDate.strftime("%H:%M"))

            trades_sheet.cell(row=excelRow, column=4, value=entryPrices[i])
            trades_sheet.cell(row=excelRow + 1, column=4, value=exitPrices[i])

            trades_sheet.cell(row=excelRow,
                              column=5,
                              value=abs(allContracts[i]))
            trades_sheet.cell(row=excelRow + 1, column=5, value=allTrades[i])
            # TODO(max): Should this include or exclude commissions?
            trades_sheet.cell(row=excelRow + 1,
                              column=5).number_format = numFormat

            # TODO(max): Check formula with commissions!
            profitPerc = (
                (exitPrices[i] - allCommissions[i] / allContracts[i]) /
                entryPrices[i]) - 1
            if not longFlags[i]:
                # TODO(max): Check formula with commissions!
                profitPerc = -profitPerc

            trades_sheet.cell(row=excelRow, column=6, value=profitPerc)
            trades_sheet.cell(row=excelRow, column=6).number_format = perFormat

            # if longFlags[i]:
            #     profit = (exitPrices[i]-entryPrices[i])*allContracts[i]
            # else:
            #     profit = -(exitPrices[i]-entryPrices[i])*allContracts[i]
            cumulativePnL = cumulativePnL + allTrades[i]
            if allTrades[i] > 0:
                cumulativeProfit = cumulativeProfit + allTrades[i]
            else:
                cumulativeLosses = cumulativeLosses + allTrades[i]
            trades_sheet.cell(row=excelRow + 1, column=6, value=cumulativePnL)
            trades_sheet.cell(row=excelRow + 1,
                              column=6).number_format = numFormat

            # Runup & Drawdown
            trades_sheet.cell(row=excelRow,
                              column=7,
                              value=trades.allRunups[i])
            trades_sheet.cell(row=excelRow, column=7).number_format = numFormat
            trades_sheet.cell(row=excelRow + 1,
                              column=7,
                              value=trades.allDrawDowns[i])
            trades_sheet.cell(row=excelRow + 1,
                              column=7).number_format = numFormat

            # Entry & Exit efficiencies
            trades_sheet.cell(row=excelRow,
                              column=8,
                              value=trades.allEntryEff[i])
            trades_sheet.cell(row=excelRow, column=8).number_format = perFormat
            trades_sheet.cell(row=excelRow + 1,
                              column=8,
                              value=trades.allExitEff[i])
            trades_sheet.cell(row=excelRow + 1,
                              column=8).number_format = perFormat

            # Total efficiency
            trades_sheet.cell(row=excelRow + 1,
                              column=9,
                              value=trades.allTotalEff[i])
            trades_sheet.cell(row=excelRow + 1,
                              column=9).number_format = perFormat

            # Set standard font, and highlight style for 2nd row of trade
            for col in range(1, 10):
                # 1st row
                trades_sheet.cell(row=excelRow, column=col).font = standardFont

                # 2nd row
                trades_sheet.cell(row=excelRow + 1,
                                  column=col).font = standardFont
                trades_sheet.cell(row=excelRow + 1,
                                  column=col).fill = highlightFill
                trades_sheet.cell(row=excelRow + 1,
                                  column=col).border = highlightBorder

            excelRow = excelRow + 2

            # ----- Equity graph sheet  -----
            equityGraph_sheet.cell(row=i + 2, column=1, value=i + 1)
            equityGraph_sheet.cell(row=i + 2,
                                   column=2,
                                   value=trades.initialEquity + cumulativePnL)

        if trades.openPosition is not None:
            pos = trades.openPosition.getPosition()
            if pos != 0:
                i += 1
                for col in range(1, 10):
                    trades_sheet.cell(row=excelRow,
                                      column=col).font = standardFont
                    trades_sheet.cell(row=excelRow + 1,
                                      column=col).font = standardFont
                    trades_sheet.cell(row=excelRow + 1,
                                      column=col).fill = highlightFill
                    trades_sheet.cell(row=excelRow + 1,
                                      column=col).border = highlightBorder

                isLong = trades.openPosition.isLong

                trades_sheet.cell(row=excelRow, column=1, value=i + 1)
                trades_sheet.cell(
                    row=excelRow,
                    column=1).alignment = Alignment(horizontal='center')
                if isLong:
                    buySell = "Buy"
                else:
                    buySell = "Sell"
                trades_sheet.cell(row=excelRow + 1, column=1, value=buySell)
                trades_sheet.cell(
                    row=excelRow + 1,
                    column=1).alignment = Alignment(horizontal='center')

                entryDate = trades.openPosition.entryDate
                trades_sheet.cell(row=excelRow,
                                  column=2,
                                  value=entryDate.strftime("%Y-%m-%d"))
                trades_sheet.cell(row=excelRow + 1,
                                  column=2,
                                  value=entryDate.strftime("Open"))

                trades_sheet.cell(row=excelRow,
                                  column=3,
                                  value=entryDate.strftime("%H:%M"))

                entryPrice = trades.openPosition.entryPrice
                trades_sheet.cell(row=excelRow, column=4, value=entryPrice)
                trades_sheet.cell(row=excelRow + 1, column=4, value="--")

                trades_sheet.cell(row=excelRow, column=5, value=abs(pos))
                trades_sheet.cell(row=excelRow + 1, column=5, value="--")

                trades_sheet.cell(row=excelRow, column=6, value="--")
                trades_sheet.cell(row=excelRow + 1, column=6, value="--")

                trades_sheet.cell(row=excelRow, column=8, value="--")
                trades_sheet.cell(row=excelRow + 1, column=8, value="--")

                trades_sheet.cell(row=excelRow + 1, column=9, value="--")

        # ----- Equity graph sheet -----
        # Add chart
        c1 = LineChart()
        c1.title = "Equity curve"
        c1.style = 13
        c1.y_axis.title = 'Equity'
        c1.x_axis.title = 'Trade #'
        c1.x_axis.scaling.min = 0
        c1.x_axis.scaling.max = len(allTrades) + 3
        c1.x_axis.auto = True
        c1.y_axis.auto = True
        c1.x_axis.delete = False
        c1.y_axis.delete = False
        c1.legend = None
        x = Reference(equityGraph_sheet,
                      min_col=1,
                      min_row=2,
                      max_row=len(allTrades) + 2)
        y = Reference(equityGraph_sheet,
                      min_col=2,
                      min_row=2,
                      max_row=len(allTrades) + 2)
        c1.add_data(y)
        c1.series[0].smooth = False
        c1.series[0].graphicalProperties.line.solidFill = "000000"
        c1.series[0].graphicalProperties.line.width = 10000  # width in EMUs
        c1.width = 30
        c1.height = 15

        equityGraph_sheet.add_chart(c1, "D3")

        # ----- Summary sheeet -----
        titleFont = Font(name="Arial", size=18, bold=True)
        titleAlign = Alignment(horizontal='center')

        headerFont = Font(name="Arial", size=14, bold=True)
        headerAlign = Alignment(horizontal='left')

        standardFont = Font(name="Arial", size=10)

        summarySheet['A1'] = "Strategy Performance Report"
        summarySheet.merge_cells("A1:I1")
        summarySheet['A1'].font = titleFont
        summarySheet['A1'].alignment = titleAlign

        summarySheet["B6"] = "Performance Summary: All Trades"
        summarySheet["B6"].font = headerFont
        summarySheet["B6"].alignment = headerAlign

        summarySheet["B8"] = "Net Profits"
        summarySheet["D8"] = cumulativeProfit + cumulativeLosses
        summarySheet["D8"].number_format = numFormat

        summarySheet["F8"] = "Open position P/L"
        summarySheet["H8"] = ""

        summarySheet["B9"] = "Gross Profits"
        summarySheet["D9"] = cumulativeProfit
        summarySheet["D9"].number_format = numFormat
        summarySheet["D9"].comment = Comment(
            "Net profits - Gross losses, i.e. Net profits + Abs(Gross losses)",
            "Report")

        summarySheet["F9"] = "Gross Losses"
        summarySheet["H9"] = cumulativeLosses
        summarySheet["H9"].number_format = numFormat

        summarySheet["B11"] = "Total num. of trades"
        summarySheet["D11"] = trades.getCount()

        summarySheet["F11"] = "Percent profitable"
        if trades.getCount() > 0:
            summarySheet["H11"] = float(trades.getProfitableCount()) / float(
                trades.getCount())
        else:
            summarySheet["H11"] = 0
        summarySheet["H11"].number_format = perFormat

        summarySheet["B12"] = "Num. of winning trades"
        summarySheet["D12"] = trades.getProfitableCount()

        summarySheet["F12"] = "Num. of losing trades"
        summarySheet["H12"] = trades.getUnprofitableCount()

        summarySheet["B14"] = "Largest winning trade"
        if trades.getProfitableCount() > 0:
            summarySheet["D14"] = allTrades.max()
        else:
            summarySheet["D14"] = 0
        summarySheet["D14"].number_format = numFormat

        summarySheet["F14"] = "Largest losing trade"
        if trades.getUnprofitableCount() > 0:
            summarySheet["H14"] = allTrades.min()
        else:
            summarySheet["H14"] = 0
        summarySheet["H14"].number_format = numFormat

        def negativeToZero(x):
            if x > 0:
                return x
            else:
                return 0

        def positiveToZero(x):
            if x >= 0:
                return 0
            else:
                return x

        avgWin = 0
        avgLoss = 0
        if trades.getProfitableCount() > 0:
            avgWin = cumulativeProfit / trades.getProfitableCount()
        summarySheet["B15"] = "Average winning trade"
        summarySheet["D15"] = avgWin
        summarySheet["D15"].number_format = numFormat

        if trades.getUnprofitableCount() > 0:
            avgLoss = cumulativeLosses / trades.getUnprofitableCount()
        summarySheet["F15"] = "Average losing trade"
        summarySheet["H15"] = avgLoss
        summarySheet["H15"].number_format = numFormat

        summarySheet["B16"] = "Ratio avg. win/avg. loss"
        if avgLoss != 0:
            summarySheet["D16"] = -avgWin / avgLoss
        else:
            summarySheet["D16"] = 'NaN'
        summarySheet["D16"].number_format = numFormat

        summarySheet["F16"] = "Avg trade (win & loss)"
        if trades.getCount() > 0:
            summarySheet["H16"] = cumulativePnL / trades.getCount()
        else:
            summarySheet["H16"] = 0
        summarySheet["H16"].number_format = numFormat

        summarySheet["B21"] = "Max intraday drawdown"
        summarySheet["D21"] = ""

        summarySheet["B22"] = "Profit factor"
        if cumulativeLosses != 0:
            summarySheet["D22"] = -cumulativeProfit / cumulativeLosses
            summarySheet["D22"].number_format = numFormat
        else:
            summarySheet["D22"] = "Inf"
        summarySheet["D22"].comment = Comment("- Gross profits / Gross losses",
                                              "Report")

        summarySheet["F22"] = "Max contracts held"
        summarySheet["H22"] = ""

        summarySheet["B23"] = "Account size required"
        summarySheet["D23"] = ""  # ABS(max intraday drawdown)

        summarySheet["F23"] = "Return on account"
        summarySheet["H23"] = ""  # net profit / account size required

        # Save the file
        wb.save(filename)
Example #26
0
for row in rows:
    ws.append(row)

c1 = BarChart()
v1 = Reference(ws, min_col=1, min_row=1, max_col=7)
c1.add_data(v1, titles_from_data=True, from_rows=True)

c1.x_axis.title = 'Days'
c1.y_axis.title = 'Aliens'
c1.y_axis.majorGridlines = None
c1.title = 'Survey results'


# Create a second chart
c2 = LineChart()
v2 = Reference(ws, min_col=1, min_row=2, max_col=7)
v3 = Reference(ws, min_col=1, min_row=3, max_col=7)
v4 = Reference(ws, min_col=1, min_row=4, max_col=7)
v5 = Reference(ws, min_col=1, min_row=5, max_col=7)
c2.add_data(v2, titles_from_data=True, from_rows=True)
c2.y_axis.axId = 200
c2.y_axis.title = "Humans"
c2.add_data(v3, titles_from_data=True, from_rows=True)
c2.add_data(v4, titles_from_data=True, from_rows=True)
c2.add_data(v5, titles_from_data=True, from_rows=True)
s1 = c2.series[3]
s1.graphicalProperties.line.noFill = True
s1.marker.symbol = "circle"
s1.marker.size = 14 # width in EMUs
Example #27
0
def generate_excel(report,
                   name,
                   reporting_start_datetime_local,
                   reporting_end_datetime_local,
                   period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # for i in range(2, 37 + 1):
    #     ws.row_dimensions[i].height = 30
    #
    # for i in range(38, 90 + 1):
    #     ws.row_dimensions[i].height = 30

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000')
                      )
    b_border = Border(
        bottom=Side(border_style='medium', color='00000000'),
    )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    #################################################

    reporting_period_data = report['reporting_period']

    has_energy_data_flag = True
    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_energy_data_flag = False

    if has_energy_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + ' 报告期成本'

        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[7].height = 60
        ws['B7'].fill = table_fill
        ws['B7'].border = f_border

        ws['B8'].font = title_font
        ws['B8'].alignment = c_c_alignment
        ws['B8'] = '成本'
        ws['B8'].border = f_border

        ws['B9'].font = title_font
        ws['B9'].alignment = c_c_alignment
        ws['B9'] = '单位面积值'
        ws['B9'].border = f_border

        ws['B10'].font = title_font
        ws['B10'].alignment = c_c_alignment
        ws['B10'] = '环比'
        ws['B10'].border = f_border

        col = 'B'

        for i in range(0, ca_len):
            col = chr(ord('C') + i)
            ws[col + '7'].fill = table_fill
            ws[col + '7'].font = name_font
            ws[col + '7'].alignment = c_c_alignment
            ws[col + '7'] = reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            ws[col + '7'].border = f_border

            ws[col + '8'].font = name_font
            ws[col + '8'].alignment = c_c_alignment
            ws[col + '8'] = round(reporting_period_data['subtotals'][i], 2)
            ws[col + '8'].border = f_border

            ws[col + '9'].font = name_font
            ws[col + '9'].alignment = c_c_alignment
            ws[col + '9'] = round(reporting_period_data['subtotals_per_unit_area'][i], 2)
            ws[col + '9'].border = f_border

            ws[col + '10'].font = name_font
            ws[col + '10'].alignment = c_c_alignment
            ws[col + '10'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \
                if reporting_period_data['increment_rates'][i] is not None else "-"
            ws[col + '10'].border = f_border

        end_col = chr(ord(col) + 1)
        ws[end_col + '7'].fill = table_fill
        ws[end_col + '7'].font = name_font
        ws[end_col + '7'].alignment = c_c_alignment
        ws[end_col + '7'] = "总计 (" + reporting_period_data['total_unit'] + ")"
        ws[end_col + '7'].border = f_border

        ws[end_col + '8'].font = name_font
        ws[end_col + '8'].alignment = c_c_alignment
        ws[end_col + '8'] = round(reporting_period_data['total'], 2)
        ws[end_col + '8'].border = f_border

        ws[end_col + '9'].font = name_font
        ws[end_col + '9'].alignment = c_c_alignment
        ws[end_col + '9'] = round(reporting_period_data['total_per_unit_area'], 2)
        ws[end_col + '9'].border = f_border

        ws[end_col + '10'].font = name_font
        ws[end_col + '10'].alignment = c_c_alignment
        ws[end_col + '10'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['total_increment_rate'] is not None else "-"
        ws[end_col + '10'].border = f_border

    else:
        for i in range(6, 10 + 1):
            ws.row_dimensions[i].height = 0.1

    #################################################

    has_ele_peak_flag = True
    if "toppeaks" not in reporting_period_data.keys() or \
            reporting_period_data['toppeaks'] is None or \
            len(reporting_period_data['toppeaks']) == 0:
        has_ele_peak_flag = False

    if has_ele_peak_flag:
        ws['B12'].font = title_font
        ws['B12'] = name + '分时用电成本'

        ws['B13'].fill = table_fill
        ws['B13'].font = name_font
        ws['B13'].alignment = c_c_alignment
        ws['B13'].border = f_border

        ws['C13'].fill = table_fill
        ws['C13'].font = name_font
        ws['C13'].alignment = c_c_alignment
        ws['C13'].border = f_border
        ws['C13'] = '分时用电成本'

        ws['D13'].fill = table_fill
        ws['D13'].font = name_font
        ws['D13'].alignment = c_c_alignment
        ws['D13'].border = f_border
        ws['D13'] = '分时用电成本占比'

        wssum = round(reporting_period_data['toppeaks'][0], 2) + round(reporting_period_data['onpeaks'][0], 2) + round(
            reporting_period_data['midpeaks'][0], 2) + round(reporting_period_data['offpeaks'][0], 2)

        ws['B14'].font = title_font
        ws['B14'].alignment = c_c_alignment
        ws['B14'] = '尖'
        ws['B14'].border = f_border

        ws['C14'].font = title_font
        ws['C14'].alignment = c_c_alignment
        ws['C14'].border = f_border
        ws['C14'] = round(reporting_period_data['toppeaks'][0], 2)

        ws['D14'].font = title_font
        ws['D14'].alignment = c_c_alignment
        ws['D14'].border = f_border
        ws['D14'] = '{:.2%}'.format(round(reporting_period_data['toppeaks'][0], 2) / wssum) \
            if wssum is not None and wssum != 0 else "0.00%"

        ws['B15'].font = title_font
        ws['B15'].alignment = c_c_alignment
        ws['B15'] = '峰'
        ws['B15'].border = f_border

        ws['C15'].font = title_font
        ws['C15'].alignment = c_c_alignment
        ws['C15'].border = f_border
        ws['C15'] = round(reporting_period_data['onpeaks'][0], 2)

        ws['D15'].font = title_font
        ws['D15'].alignment = c_c_alignment
        ws['D15'].border = f_border
        ws['D15'] = '{:.2%}'.format(round(reporting_period_data['onpeaks'][0], 2) / wssum) \
            if wssum is not None and wssum != 0 else "0.00%"

        ws['B16'].font = title_font
        ws['B16'].alignment = c_c_alignment
        ws['B16'] = '平'
        ws['B16'].border = f_border

        ws['C16'].font = title_font
        ws['C16'].alignment = c_c_alignment
        ws['C16'].border = f_border
        ws['C16'] = round(reporting_period_data['midpeaks'][0], 2)

        ws['D16'].font = title_font
        ws['D16'].alignment = c_c_alignment
        ws['D16'].border = f_border
        ws['D16'] = '{:.2%}'.format(round(reporting_period_data['midpeaks'][0], 2) / wssum) \
            if wssum is not None and wssum != 0 else "0.00%"

        ws['B17'].font = title_font
        ws['B17'].alignment = c_c_alignment
        ws['B17'] = '谷'
        ws['B17'].border = f_border

        ws['C17'].font = title_font
        ws['C17'].alignment = c_c_alignment
        ws['C17'].border = f_border
        ws['C17'] = round(reporting_period_data['offpeaks'][0], 2)

        ws['D17'].font = title_font
        ws['D17'].alignment = c_c_alignment
        ws['D17'].border = f_border
        ws['D17'] = '{:.2%}'.format(round(reporting_period_data['offpeaks'][0], 2) / wssum) \
            if wssum is not None and wssum != 0 else "0.00%"

        pie = PieChart()
        pie.title = name + '分时用电成本'
        labels = Reference(ws, min_col=2, min_row=14, max_row=17)
        pie_data = Reference(ws, min_col=3, min_row=13, max_row=17)
        pie.add_data(pie_data, titles_from_data=True)
        pie.set_categories(labels)
        pie.height = 6.6
        pie.width = 9
        s1 = pie.series[0]
        s1.dLbls = DataLabelList()
        s1.dLbls.showCatName = False
        s1.dLbls.showVal = True
        s1.dLbls.showPercent = True
        ws.add_chart(pie, "E13")

    else:
        for i in range(12, 18 + 1):
            ws.row_dimensions[i].height = 0.1

    ################################################

    current_row_number = 19

    has_subtotals_data_flag = True
    if "subtotals" not in reporting_period_data.keys() or \
            reporting_period_data['subtotals'] is None or \
            len(reporting_period_data['subtotals']) == 0:
        has_subtotals_data_flag = False

    if has_subtotals_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 成本占比'

        current_row_number += 1

        table_start_row_number = current_row_number

        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = name_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border

        ws['C' + str(current_row_number)].fill = table_fill
        ws['C' + str(current_row_number)].font = name_font
        ws['C' + str(current_row_number)].alignment = c_c_alignment
        ws['C' + str(current_row_number)].border = f_border
        ws['C' + str(current_row_number)] = '成本'

        ws['D' + str(current_row_number)].fill = table_fill
        ws['D' + str(current_row_number)].font = name_font
        ws['D' + str(current_row_number)].alignment = c_c_alignment
        ws['D' + str(current_row_number)].border = f_border
        ws['D' + str(current_row_number)] = '成本占比'

        current_row_number += 1

        ca_len = len(reporting_period_data['names'])
        wssum = 0
        for i in range(0, ca_len):
            wssum = round(reporting_period_data['subtotals'][i], 2) + wssum
        for i in range(0, ca_len):
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)] = reporting_period_data['names'][i]
            ws['B' + str(current_row_number)].border = f_border

            ws['C' + str(current_row_number)].font = title_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2)

            ws['D' + str(current_row_number)].font = title_font
            ws['D' + str(current_row_number)].alignment = c_c_alignment
            ws['D' + str(current_row_number)].border = f_border
            ws['D' + str(current_row_number)] = '{:.2%}'.format(round(reporting_period_data['subtotals'][i], 2) /
                                                                wssum) if wssum is not None and wssum != 0 else "0.00%"

            current_row_number += 1

        table_end_row_number = current_row_number - 1

        pie = PieChart()
        pie.title = name + ' 成本占比'
        labels = Reference(ws, min_col=2, min_row=table_start_row_number + 1, max_row=table_end_row_number)
        pie_data = Reference(ws, min_col=3, min_row=table_start_row_number, max_row=table_end_row_number)
        pie.add_data(pie_data, titles_from_data=True)
        pie.set_categories(labels)
        pie.height = 6.6
        pie.width = 9
        s1 = pie.series[0]
        s1.dLbls = DataLabelList()
        s1.dLbls.showCatName = False
        s1.dLbls.showVal = True
        s1.dLbls.showPercent = True
        table_cell = 'E' + str(table_start_row_number)
        ws.add_chart(pie, table_cell)

        if ca_len < 4:
            current_row_number = current_row_number - ca_len + 4

    else:
        for i in range(21, 29 + 1):
            current_row_number = 30
            ws.row_dimensions[i].height = 0.1

    ###############################################

    current_row_number += 1

    has_detail_data_flag = True

    table_start_draw_flag = current_row_number + 1

    if "timestamps" not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0:
        has_detail_data_flag = False

    if has_detail_data_flag:
        reporting_period_data = report['reporting_period']
        times = reporting_period_data['timestamps']
        ca_len = len(report['reporting_period']['names'])
        parameters_names_len = len(report['parameters']['names'])
        parameters_parameters_datas_len = 0
        for i in range(0, parameters_names_len):
            if len(report['parameters']['timestamps'][i]) == 0:
                continue
            parameters_parameters_datas_len += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 详细数据'

        detail_data_table_start_row_number = current_row_number + (ca_len + parameters_parameters_datas_len) * 6 + 3
        current_row_number = detail_data_table_start_row_number

        time = times[0]
        has_data = False

        if len(time) > 0:
            has_data = True

        if has_data:

            ws.row_dimensions[current_row_number].height = 60
            ws['B' + str(current_row_number)].fill = table_fill
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)] = '日期时间'

            col = 'B'

            for i in range(0, ca_len):
                col = chr(ord('C') + i)

                ws[col + str(current_row_number)].fill = table_fill
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)] = \
                    reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
                ws[col + str(current_row_number)].border = f_border

            end_col = chr(ord(col) + 1)

            ws[end_col + str(current_row_number)].fill = table_fill
            ws[end_col + str(current_row_number)].font = title_font
            ws[end_col + str(current_row_number)].alignment = c_c_alignment
            ws[end_col + str(current_row_number)] = "总计 (" + reporting_period_data['total_unit'] + ")"
            ws[end_col + str(current_row_number)].border = f_border

            current_row_number += 1

            for i in range(0, len(time)):
                ws['B' + str(current_row_number)].font = title_font
                ws['B' + str(current_row_number)].alignment = c_c_alignment
                ws['B' + str(current_row_number)] = time[i]
                ws['B' + str(current_row_number)].border = f_border

                col = 'B'

                every_day_total = 0

                for j in range(0, ca_len):
                    col = chr(ord('C') + j)

                    ws[col + str(current_row_number)].font = title_font
                    ws[col + str(current_row_number)].alignment = c_c_alignment
                    value = round(reporting_period_data['values'][j][i], 2)
                    every_day_total += value
                    ws[col + str(current_row_number)] = value
                    ws[col + str(current_row_number)].border = f_border

                end_col = chr(ord(col) + 1)
                ws[end_col + str(current_row_number)].font = title_font
                ws[end_col + str(current_row_number)].alignment = c_c_alignment
                ws[end_col + str(current_row_number)] = round(every_day_total, 2)
                ws[end_col + str(current_row_number)].border = f_border

                current_row_number += 1

            table_end_row_number = current_row_number - 1

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)] = '小计'
            ws['B' + str(current_row_number)].border = f_border

            col = 'B'

            for i in range(0, ca_len):
                col = chr(ord('C') + i)
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2)
                ws[col + str(current_row_number)].border = f_border

                # line
                line = LineChart()
                line.title = '报告期成本 - ' + \
                             reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
                labels = Reference(ws, min_col=2, min_row=detail_data_table_start_row_number + 1,
                                   max_row=table_end_row_number)
                line_data = Reference(ws, min_col=3 + i, min_row=detail_data_table_start_row_number,
                                      max_row=table_end_row_number)
                line.add_data(line_data, titles_from_data=True)
                line.set_categories(labels)
                line_data = line.series[0]
                line_data.marker.symbol = "circle"
                line_data.smooth = True
                line.x_axis.crosses = 'min'
                line.height = 8.25
                line.width = 24
                line.dLbls = DataLabelList()
                line.dLbls.dLblPos = 't'
                line.dLbls.showVal = True
                line.dLbls.showPercent = False
                chart_col = 'B'
                chart_cell = chart_col + str(table_start_draw_flag + 6 * i)
                ws.add_chart(line, chart_cell)

            end_col = chr(ord(col) + 1)
            ws[end_col + str(current_row_number)].font = title_font
            ws[end_col + str(current_row_number)].alignment = c_c_alignment
            ws[end_col + str(current_row_number)] = round(reporting_period_data['total'], 2)
            ws[end_col + str(current_row_number)].border = f_border

            current_row_number += 1

    else:
        for i in range(30, 69 + 1):
            current_row_number = 70
            ws.row_dimensions[i].height = 0.1
    ##########################################
    has_parameters_names_and_timestamps_and_values_data = True

    ca_len = len(report['reporting_period']['names'])
    current_sheet_parameters_row_number = table_start_draw_flag + ca_len * 6
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']

        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 'B'

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill
            parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border

            col = decimal_to_column(column_to_decimal(table_current_col_number) + 1)

            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = table_current_col_number

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = decimal_to_column(column_to_decimal(col) + 1)

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3)

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #28
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102

    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5
    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    # data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=False,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=False,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=False,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename
    #################################################
    # First: 统计分析
    # 6: title
    # 7: table title
    # 8~ca_len table_data
    #################################################
    reporting_period_data = report['reporting_period']

    has_energy_data_flag = True

    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_energy_data_flag = False

        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    if has_energy_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + ' 统计分析'

        category = reporting_period_data['names']

        # table_title
        ws['B7'].fill = table_fill
        ws['B7'].font = title_font
        ws['B7'].alignment = c_c_alignment
        ws['B7'] = '报告期'
        ws['B7'].border = f_border

        ws['C7'].font = title_font
        ws['C7'].alignment = c_c_alignment
        ws['C7'] = '算术平均数'
        ws['C7'].border = f_border

        ws['D7'].font = title_font
        ws['D7'].alignment = c_c_alignment
        ws['D7'] = '中位数'
        ws['D7'].border = f_border

        ws['E7'].font = title_font
        ws['E7'].alignment = c_c_alignment
        ws['E7'] = '最小值'
        ws['E7'].border = f_border

        ws['F7'].font = title_font
        ws['F7'].alignment = c_c_alignment
        ws['F7'] = '最大值'
        ws['F7'].border = f_border

        ws['G7'].font = title_font
        ws['G7'].alignment = c_c_alignment
        ws['G7'] = '样本标准差'
        ws['G7'].border = f_border

        ws['H7'].font = title_font
        ws['H7'].alignment = c_c_alignment
        ws['H7'] = '样本方差'
        ws['H7'].border = f_border

        # table_data

        for i, value in enumerate(category):
            row = i * 2 + 8
            ws['B' + str(row)].font = name_font
            ws['B' + str(row)].alignment = c_c_alignment
            ws['B' + str(row)] = reporting_period_data['names'][
                i] + " (" + reporting_period_data['units'][i] + " )"
            ws['B' + str(row)].border = f_border

            ws['B' + str(row + 1)].font = name_font
            ws['B' + str(row + 1)].alignment = c_c_alignment
            ws['B' + str(row + 1)] = "环比"
            ws['B' + str(row + 1)].border = f_border

            ws['C' + str(row)].font = name_font
            ws['C' + str(row)].alignment = c_c_alignment
            ws['C' + str(row)] = round(reporting_period_data['means'][i], 2) \
                if reporting_period_data['means'][i] is not None else ''
            ws['C' + str(row)].border = f_border
            ws['C' + str(row)].number_format = '0.00'

            ws['C' + str(row + 1)].font = name_font
            ws['C' + str(row + 1)].alignment = c_c_alignment
            ws['C' + str(row + 1)] = str(round(reporting_period_data['means_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['means_increment_rate'][i] is not None else '0.00%'
            ws['C' + str(row + 1)].border = f_border

            ws['D' + str(row)].font = name_font
            ws['D' + str(row)].alignment = c_c_alignment
            ws['D' + str(row)] = round(reporting_period_data['medians'][i], 2) \
                if reporting_period_data['medians'][i] is not None else ''
            ws['D' + str(row)].border = f_border
            ws['D' + str(row)].number_format = '0.00'

            ws['D' + str(row + 1)].font = name_font
            ws['D' + str(row + 1)].alignment = c_c_alignment
            ws['D' + str(row + 1)] = str(round(reporting_period_data['medians_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['medians_increment_rate'][i] is not None else '0.00%'
            ws['D' + str(row + 1)].border = f_border

            ws['E' + str(row)].font = name_font
            ws['E' + str(row)].alignment = c_c_alignment
            ws['E' + str(row)] = round(reporting_period_data['minimums'][i], 2) \
                if reporting_period_data['minimums'][i] is not None else ''
            ws['E' + str(row)].border = f_border
            ws['E' + str(row)].number_format = '0.00'

            ws['E' + str(row + 1)].font = name_font
            ws['E' + str(row + 1)].alignment = c_c_alignment
            ws['E' + str(row + 1)] = str(round(reporting_period_data['minimums_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['minimums_increment_rate'][i] is not None else '0.00%'
            ws['E' + str(row + 1)].border = f_border

            ws['F' + str(row)].font = name_font
            ws['F' + str(row)].alignment = c_c_alignment
            ws['F' + str(row)] = round(reporting_period_data['maximums'][i], 2) \
                if reporting_period_data['maximums'][i] is not None else ''
            ws['F' + str(row)].border = f_border
            ws['F' + str(row)].number_format = '0.00'

            ws['F' + str(row + 1)].font = name_font
            ws['F' + str(row + 1)].alignment = c_c_alignment
            ws['F' + str(row + 1)] = str(round(reporting_period_data['maximums_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['maximums_increment_rate'][i] is not None else '0.00%'
            ws['F' + str(row + 1)].border = f_border

            ws['G' + str(row)].font = name_font
            ws['G' + str(row)].alignment = c_c_alignment
            ws['G' + str(row)] = round(reporting_period_data['stdevs'][i], 2) \
                if reporting_period_data['stdevs'][i] is not None else ''
            ws['G' + str(row)].border = f_border
            ws['G' + str(row)].number_format = '0.00'

            ws['G' + str(row + 1)].font = name_font
            ws['G' + str(row + 1)].alignment = c_c_alignment
            ws['G' + str(row + 1)] = str(round(reporting_period_data['stdevs_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['stdevs_increment_rate'][i] is not None else '0.00%'
            ws['G' + str(row + 1)].border = f_border

            ws['H' + str(row)].font = name_font
            ws['H' + str(row)].alignment = c_c_alignment
            ws['H' + str(row)] = round(reporting_period_data['variances'][i], 2) \
                if reporting_period_data['variances'][i] is not None else ''
            ws['H' + str(row)].border = f_border
            ws['H' + str(row)].number_format = '0.00'

            ws['H' + str(row + 1)].font = name_font
            ws['H' + str(row + 1)].alignment = c_c_alignment
            ws['H' + str(row + 1)] = str(round(reporting_period_data['variances_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['variances_increment_rate'][i] is not None else '0.00%'
            ws['H' + str(row + 1)].border = f_border
    #################################################
    # Second: 报告期消耗
    # 9 + ca_len * 2: title
    # 10 + ca_len * 2: table title
    # per_unit_area_start_row_number + 2 ~ per_unit_area_start_row_number + 2 + ca_len :  table_data
    #################################################

    if has_energy_data_flag:
        names = reporting_period_data['names']
        ca_len = len(names)

        per_unit_area_start_row_number = 9 + ca_len * 2

        ws['B' + str(per_unit_area_start_row_number)].font = title_font
        ws['B' + str(per_unit_area_start_row_number)] = name + ' 单位面积值' + str(
            report['tenant']['area']) + 'M²'

        category = reporting_period_data['names']

        # table_title
        ws['B' + str(per_unit_area_start_row_number + 1)].fill = table_fill
        ws['B' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['B' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['B' + str(per_unit_area_start_row_number + 1)] = '报告期'
        ws['B' + str(per_unit_area_start_row_number + 1)].border = f_border

        ws['C' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['C' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['C' + str(per_unit_area_start_row_number + 1)] = '算术平均数'
        ws['C' + str(per_unit_area_start_row_number + 1)].border = f_border

        ws['D' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['D' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['D' + str(per_unit_area_start_row_number + 1)] = '中位数'
        ws['D' + str(per_unit_area_start_row_number + 1)].border = f_border

        ws['E' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['E' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['E' + str(per_unit_area_start_row_number + 1)] = '最小值'
        ws['E' + str(per_unit_area_start_row_number + 1)].border = f_border

        ws['F' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['F' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['F' + str(per_unit_area_start_row_number + 1)] = '最大值'
        ws['F' + str(per_unit_area_start_row_number + 1)].border = f_border

        ws['G' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['G' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['G' + str(per_unit_area_start_row_number + 1)] = '样本标准差'
        ws['G' + str(per_unit_area_start_row_number + 1)].border = f_border

        ws['H' + str(per_unit_area_start_row_number + 1)].font = title_font
        ws['H' +
           str(per_unit_area_start_row_number + 1)].alignment = c_c_alignment
        ws['H' + str(per_unit_area_start_row_number + 1)] = '样本方差'
        ws['H' + str(per_unit_area_start_row_number + 1)].border = f_border

        # table_data

        for i, value in enumerate(category):
            row_data = per_unit_area_start_row_number + 2 + i
            ws['B' + str(row_data)].font = name_font
            ws['B' + str(row_data)].alignment = c_c_alignment
            ws['B' + str(row_data)] = reporting_period_data['names'][
                i] + " (" + reporting_period_data['units'][i] + "/M²)"
            ws['B' + str(row_data)].border = f_border

            ws['C' + str(row_data)].font = name_font
            ws['C' + str(row_data)].alignment = c_c_alignment
            if reporting_period_data['means_per_unit_area'][i] \
                    or reporting_period_data['means_per_unit_area'][i] == 0:
                ws['C' + str(row_data)] = round(
                    reporting_period_data['means_per_unit_area'][i], 2)
            ws['C' + str(row_data)].border = f_border
            ws['C' + str(row_data)].number_format = '0.00'

            ws['D' + str(row_data)].font = name_font
            ws['D' + str(row_data)].alignment = c_c_alignment
            if reporting_period_data['medians_per_unit_area'][i] \
                    or reporting_period_data['medians_per_unit_area'][i] == 0:
                ws['D' + str(row_data)] = round(
                    reporting_period_data['medians_per_unit_area'][i], 2)
            ws['D' + str(row_data)].border = f_border
            ws['D' + str(row_data)].number_format = '0.00'

            ws['E' + str(row_data)].font = name_font
            ws['E' + str(row_data)].alignment = c_c_alignment
            if reporting_period_data['minimums_per_unit_area'][i] \
                    or reporting_period_data['minimums_per_unit_area'][i] == 0:
                ws['E' + str(row_data)] = round(
                    reporting_period_data['minimums_per_unit_area'][i], 2)
            ws['E' + str(row_data)].border = f_border
            ws['E' + str(row_data)].number_format = '0.00'

            ws['F' + str(row_data)].font = name_font
            ws['F' + str(row_data)].alignment = c_c_alignment
            if reporting_period_data['maximums_per_unit_area'][i] \
                    or reporting_period_data['maximums_per_unit_area'][i] == 0:
                ws['F' + str(row_data)] = round(
                    reporting_period_data['maximums_per_unit_area'][i], 2)
            ws['F' + str(row_data)].border = f_border
            ws['F' + str(row_data)].number_format = '0.00'

            ws['G' + str(row_data)].font = name_font
            ws['G' + str(row_data)].alignment = c_c_alignment
            if (reporting_period_data['stdevs_per_unit_area'][i]) \
                    or reporting_period_data['stdevs_per_unit_area'][i] == 0:
                ws['G' + str(row_data)] = round(
                    reporting_period_data['stdevs_per_unit_area'][i], 2)
            ws['G' + str(row_data)].border = f_border
            ws['G' + str(row_data)].number_format = '0.00'

            ws['H' + str(row_data)].font = name_font
            ws['H' + str(row_data)].alignment = c_c_alignment
            if reporting_period_data['variances_per_unit_area'][i] \
                    or reporting_period_data['variances_per_unit_area'][i] == 0:
                ws['H' + str(row_data)] = round(
                    reporting_period_data['variances_per_unit_area'][i], 2)
            ws['H' + str(row_data)].border = f_border
            ws['H' + str(row_data)].number_format = '0.00'

    ########################################################
    # Third: 详细数据
    # detailed_start_row_number~ detailed_start_row_number+time_len: line
    # detailed_start_row_number + 1: table title
    # i + analysis_end_row_number + 2 + 6 * ca_len~: table_data
    ########################################################
    has_timestamps_flag = True
    if "timestamps" not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0:
        has_timestamps_flag = False

    if has_timestamps_flag:
        timestamps = reporting_period_data['timestamps'][0]
        values = reporting_period_data['values']
        names = reporting_period_data['names']
        ca_len = len(names)
        time_len = len(timestamps)
        real_timestamps_len = timestamps_data_not_equal_0(
            report['parameters']['timestamps'])
        # title
        line_charts_row_number = 6 * ca_len + real_timestamps_len * 7
        analysis_end_row_number = 12 + 3 * ca_len
        detailed_start_row_number = analysis_end_row_number + line_charts_row_number + 1

        ws['B' + str(detailed_start_row_number)].font = title_font
        ws['B' + str(detailed_start_row_number)] = name + ' 详细数据'
        # table_title
        ws['B' + str(detailed_start_row_number + 1)].fill = table_fill
        ws['B' + str(detailed_start_row_number + 1)].font = name_font
        ws['B' + str(detailed_start_row_number + 1)].alignment = c_c_alignment
        ws['B' + str(detailed_start_row_number + 1)] = "时间"
        ws['B' + str(detailed_start_row_number + 1)].border = f_border

        for i in range(0, ca_len):
            col = chr(ord('C') + i)

            ws[col + str(detailed_start_row_number + 1)].font = name_font
            ws[col +
               str(detailed_start_row_number + 1)].alignment = c_c_alignment
            ws[col + str(detailed_start_row_number + 1)] = names[
                i] + " - (" + reporting_period_data['units'][i] + ")"
            ws[col + str(detailed_start_row_number + 1)].border = f_border
        # table_date
        for i in range(0, time_len):
            rows = i + detailed_start_row_number + 2

            ws['B' + str(rows)].font = name_font
            ws['B' + str(rows)].alignment = c_c_alignment
            ws['B' + str(rows)] = timestamps[i]
            ws['B' + str(rows)].border = f_border

            for index in range(0, ca_len):
                col = chr(ord('C') + index)

                ws[col + str(rows)].font = name_font
                ws[col + str(rows)].alignment = c_c_alignment
                ws[col + str(rows)] = round(values[index][i], 2)
                ws[col + str(rows)].number_format = '0.00'
                ws[col + str(rows)].border = f_border

        # 小计
        row_subtotals = detailed_start_row_number + 2 + time_len
        ws['B' + str(row_subtotals)].font = name_font
        ws['B' + str(row_subtotals)].alignment = c_c_alignment
        ws['B' + str(row_subtotals)] = "小计"
        ws['B' + str(row_subtotals)].border = f_border

        for i in range(0, ca_len):
            col = chr(ord('C') + i)

            ws[col + str(row_subtotals)].font = name_font
            ws[col + str(row_subtotals)].alignment = c_c_alignment
            ws[col + str(row_subtotals)] = round(
                reporting_period_data['subtotals'][i], 2)
            ws[col + str(row_subtotals)].border = f_border
            ws[col + str(row_subtotals)].number_format = '0.00'

    ########################################################
    # third: LineChart
    # LineChart requires data from the detailed data table in the Excel file
    # so print the detailed data table first and then print LineChart
    ########################################################
        for i in range(0, ca_len):

            line = LineChart()
            line.title = "报告期消耗" + " - " + names[
                i] + "(" + reporting_period_data['units'][i] + ")"
            line.style = 10
            line.x_axis.majorTickMark = 'in'
            line.y_axis.majorTickMark = 'in'
            line.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = True
            times = Reference(ws,
                              min_col=2,
                              min_row=detailed_start_row_number + 2,
                              max_row=detailed_start_row_number + 2 + time_len)
            line_data = Reference(ws,
                                  min_col=3 + i,
                                  min_row=detailed_start_row_number + 1,
                                  max_row=detailed_start_row_number + 1 +
                                  time_len)
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(times)
            ser = line.series[0]
            ser.marker.symbol = "diamond"
            ser.marker.size = 5
            ws.add_chart(line, 'B' + str(analysis_end_row_number + 6 * i))
    ##########################################
    current_sheet_parameters_row_number = analysis_end_row_number + ca_len * 6 + 1
    has_parameters_names_and_timestamps_and_values_data = True
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False

    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']
        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(
                i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws[
            'G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' +
                      str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' +
                      str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[
            parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 'B'

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            parameters_ws[table_current_col_number +
                          str(parameters_ws_current_row_number -
                              1)].fill = table_fill
            parameters_ws[table_current_col_number +
                          str(parameters_ws_current_row_number -
                              1)].border = f_border

            col = chr(ord(table_current_col_number) + 1)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = table_current_col_number

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = chr(ord(col) + 1)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(
                    parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = chr(ord(table_current_col_number) + 3)

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws,
                               min_col=labels_col,
                               min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) +
                                        parameters_table_start_row_number))
            line_data = Reference(
                parameters_ws,
                min_col=data_col,
                min_row=parameters_table_start_row_number,
                max_row=(len(parameters_data['timestamps'][i]) +
                         parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1
    ##########################################
    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #29
0
def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type):
    wb = Workbook()
    # todo
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000')
                      )
    b_border = Border(
        bottom=Side(border_style='medium', color='00000000'),
    )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws.merge_cells("G3:H3")
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local

    if "reporting_period" not in report.keys() or \
            "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    ###############################

    has_cost_data_flag = True

    if "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
        has_cost_data_flag = False

    if has_cost_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + '报告期消耗'

        reporting_period_data = report['reporting_period']
        category = report['virtual_meter']['energy_category_name']
        ca_len = len(category)

        ws.row_dimensions[7].height = 60
        ws['B7'].fill = table_fill
        ws['B7'].border = f_border

        ws['B8'].font = title_font
        ws['B8'].alignment = c_c_alignment
        ws['B8'] = '能耗'
        ws['B8'].border = f_border

        ws['B9'].font = title_font
        ws['B9'].alignment = c_c_alignment
        ws['B9'] = '环比'
        ws['B9'].border = f_border

        col = 'B'

        for i in range(0, ca_len):
            col = chr(ord('C') + i)

            ws[col + '7'].fill = table_fill
            ws[col + '7'].font = name_font
            ws[col + '7'].alignment = c_c_alignment
            ws[col + '7'] = report['virtual_meter']['energy_category_name'] + " (" \
                + report['virtual_meter']['unit_of_measure'] + ")"
            ws[col + '7'].border = f_border

            ws[col + '8'].font = name_font
            ws[col + '8'].alignment = c_c_alignment
            ws[col + '8'] = round(reporting_period_data['total_in_category'], 2)
            ws[col + '8'].border = f_border

            ws[col + '9'].font = name_font
            ws[col + '9'].alignment = c_c_alignment
            ws[col + '9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
                if reporting_period_data['increment_rate'] is not None else "-"
            ws[col + '9'].border = f_border

        # TCE TCO2E
        end_col = col
        # TCE
        tce_col = chr(ord(end_col) + 1)
        ws[tce_col + '7'].fill = table_fill
        ws[tce_col + '7'].font = name_font
        ws[tce_col + '7'].alignment = c_c_alignment
        ws[tce_col + '7'] = "吨标准煤 (TCE)"
        ws[tce_col + '7'].border = f_border

        ws[tce_col + '8'].font = name_font
        ws[tce_col + '8'].alignment = c_c_alignment
        ws[tce_col + '8'] = round(reporting_period_data['total_in_kgce'] / 1000, 2)
        ws[tce_col + '8'].border = f_border

        ws[tce_col + '9'].font = name_font
        ws[tce_col + '9'].alignment = c_c_alignment
        ws[tce_col + '9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['increment_rate'] is not None else "-"
        ws[tce_col + '9'].border = f_border

        # TCO2E
        tco2e_col = chr(ord(end_col) + 2)
        ws[tco2e_col + '7'].fill = table_fill
        ws[tco2e_col + '7'].font = name_font
        ws[tco2e_col + '7'].alignment = c_c_alignment
        ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)"
        ws[tco2e_col + '7'].border = f_border

        ws[tco2e_col + '8'].font = name_font
        ws[tco2e_col + '8'].alignment = c_c_alignment
        ws[tco2e_col + '8'] = round(reporting_period_data['total_in_kgco2e'] / 1000, 2)
        ws[tco2e_col + '8'].border = f_border

        ws[tco2e_col + '9'].font = name_font
        ws[tco2e_col + '9'].alignment = c_c_alignment
        ws[tco2e_col + '9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['increment_rate'] is not None else "-"
        ws[tco2e_col + '9'].border = f_border

    else:
        for i in range(6, 9 + 1):
            ws.rows_dimensions[i].height = 0.1

    ######################################

    has_cost_detail_flag = True
    reporting_period_data = report['reporting_period']
    category = report['virtual_meter']['energy_category_name']
    ca_len = len(category)
    times = reporting_period_data['timestamps']

    if "values" not in reporting_period_data.keys() or len(reporting_period_data['values']) == 0:
        has_cost_detail_flag = False

    if has_cost_detail_flag:
        ws['B11'].font = title_font
        ws['B11'] = name + '详细数据'

        ws.row_dimensions[18].height = 60
        ws['B18'].fill = table_fill
        ws['B18'].font = title_font
        ws['B18'].border = f_border
        ws['B18'].alignment = c_c_alignment
        ws['B18'] = '日期时间'
        time = times
        has_data = False
        max_row = 0
        if len(time) > 0:
            has_data = True
            max_row = 18 + len(time)

        if has_data:

            end_data_row_number = 19

            for i in range(0, len(time)):
                col = 'B'
                end_data_row_number = 19 + i
                row = str(end_data_row_number)

                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = time[i]
                ws[col + row].border = f_border

            ws['B' + str(end_data_row_number + 1)].font = title_font
            ws['B' + str(end_data_row_number + 1)].alignment = c_c_alignment
            ws['B' + str(end_data_row_number + 1)] = '总计'
            ws['B' + str(end_data_row_number + 1)].border = f_border

            for i in range(0, ca_len):

                col = chr(ord('C') + i)

                ws[col + '18'].fill = table_fill
                ws[col + '18'].font = title_font
                ws[col + '18'].alignment = c_c_alignment
                ws[col + '18'] = report['virtual_meter']['energy_category_name'] + " (" \
                    + report['virtual_meter']['unit_of_measure'] + ")"
                ws[col + '18'].border = f_border

                time = times
                time_len = len(time)

                for j in range(0, time_len):
                    row = str(19 + j)

                    ws[col + row].font = title_font
                    ws[col + row].alignment = c_c_alignment
                    ws[col + row] = round(reporting_period_data['values'][j], 2)
                    ws[col + row].border = f_border

                ws[col + str(end_data_row_number + 1)].font = title_font
                ws[col + str(end_data_row_number + 1)].alignment = c_c_alignment
                ws[col + str(end_data_row_number + 1)] = round(reporting_period_data['total_in_category'], 2)
                ws[col + str(end_data_row_number + 1)].border = f_border

            line = LineChart()
            labels = Reference(ws, min_col=2, min_row=19, max_row=max_row)
            line_data = Reference(ws, min_col=3, min_row=18, max_row=max_row)
            line.series.append(Series(line_data, title_from_data=True))
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.title = '报告期消耗 - ' + report['virtual_meter']['energy_category_name'] + \
                         " (" + report['virtual_meter']['unit_of_measure'] + ")"
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = True
            line.height = 8.25
            line.width = 24
            ws.add_chart(line, "B12")
    else:
        for i in range(11, 43 + 1):
            ws.row_dimensions[i].height = 0.0

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
def place_in_excel(name, latest_fin_data, last_fin_data, baseline_fin_data):
    '''
    function places all data into excel spreadsheet and creates chart.
    data is placed into sheet in reverse order (see how data_list is ordered) so that most recent
    data is displayed on right hand side of the data table
    '''

    wb = Workbook()
    ws = wb.active
    data_list = [baseline_fin_data, last_fin_data, latest_fin_data]
    count = 0
    '''places in raw/reported data'''
    for data in data_list:
        for i, key in enumerate(capture_rdel):
            try:
                ws.cell(row=i + 3, column=2 + count, value=data[name][key])
            except KeyError:
                ws.cell(row=i + 3, column=2 + count, value=0)
        for i, key in enumerate(capture_cdel):
            try:
                ws.cell(row=i + 3, column=3 + count, value=data[name][key])
            except KeyError:
                ws.cell(row=i + 3, column=3 + count, value=0)
        for i, key in enumerate(capture_ng):
            try:
                ws.cell(row=i + 3, column=4 + count, value=data[name][key])
            except KeyError:
                ws.cell(row=i + 3, column=4 + count, value=0)
        count += 4
    '''places in totals'''
    baseline_totals = calculate_totals(name, baseline_fin_data)
    last_q_totals = calculate_totals(name, last_fin_data)
    latest_q_totals = calculate_totals(name, latest_fin_data)

    total_list = [baseline_totals, last_q_totals, latest_q_totals]

    c = 0
    for l in total_list:
        for i, total in enumerate(l):
            ws.cell(row=i + 3, column=5 + c, value=total)
        c += 4
    '''labeling data in table'''

    labeling_list_quarter = ['Baseline', 'Last Quarter', 'Latest quarter']

    ws.cell(row=1, column=2, value=labeling_list_quarter[0])
    ws.cell(row=1, column=6, value=labeling_list_quarter[1])
    ws.cell(row=1, column=10, value=labeling_list_quarter[2])

    labeling_list_type = ['RDEL', 'CDEL', 'Non-Gov', 'Total']
    repeat = 3
    c = 0
    while repeat > 0:
        for i, label in enumerate(labeling_list_type):
            ws.cell(row=2, column=2 + i + c, value=label)
        c += 4
        repeat -= 1

    labeling_list_year = [
        'Spend', '19/20', '20/21', '21/22', '22/23', '23/24', '24/25', '25/26',
        '26/27', '27/28', '28/29', 'Unprofiled'
    ]

    for i, label in enumerate(labeling_list_year):
        ws.cell(row=2 + i, column=1, value=label)
    '''process for showing total cost profile. starting with data'''

    row_start = 16
    for x, l in enumerate(total_list):
        for i, total in enumerate(l):
            ws.cell(row=i + row_start, column=x + 2, value=total)
    '''data for graph labeling'''

    for i, quarter in enumerate(labeling_list_quarter):
        ws.cell(row=15, column=i + 2, value=quarter)

    for i, label in enumerate(labeling_list_year):
        ws.cell(row=15 + i, column=1, value=label)

    chart = LineChart()
    chart.title = str(name) + ' Cost Profile'
    chart.style = 4
    chart.x_axis.title = 'Financial Year'
    chart.y_axis.title = 'Cost £m'
    '''styling chart'''
    # axis titles
    font = Font(typeface='Calibri')
    size = 1200  # 12 point size
    cp = CharacterProperties(latin=font, sz=size, b=True)  # Bold
    pp = ParagraphProperties(defRPr=cp)
    rtp = RichText(p=[Paragraph(pPr=pp, endParaRPr=cp)])
    chart.x_axis.title.tx.rich.p[0].pPr = pp
    chart.y_axis.title.tx.rich.p[0].pPr = pp
    # chart.title.tx.rich.p[0].pPr = pp

    # title
    size_2 = 1400
    cp_2 = CharacterProperties(latin=font, sz=size_2, b=True)
    pp_2 = ParagraphProperties(defRPr=cp_2)
    rtp_2 = RichText(p=[Paragraph(pPr=pp_2, endParaRPr=cp_2)])
    chart.title.tx.rich.p[0].pPr = pp_2
    '''unprofiled costs not included in the chart'''
    data = Reference(ws, min_col=2, min_row=15, max_col=4, max_row=25)
    chart.add_data(data, titles_from_data=True)
    cats = Reference(ws, min_col=1, min_row=16, max_row=25)
    chart.set_categories(cats)

    s3 = chart.series[0]
    s3.graphicalProperties.line.solidFill = "cfcfea"  # light blue
    s8 = chart.series[1]
    s8.graphicalProperties.line.solidFill = "5097a4"  # medium blue
    s9 = chart.series[2]
    s9.graphicalProperties.line.solidFill = "0e2f44"  # dark blue'''

    ws.add_chart(chart, "H15")
    '''process for creating income chart'''

    baseline_total_income = calculate_income_totals(name, baseline_fin_data)
    last_q_total_income = calculate_income_totals(name, last_fin_data)
    latest_q_total_income = calculate_income_totals(name, latest_fin_data)

    total_income_list = [
        baseline_total_income, last_q_total_income, latest_q_total_income
    ]

    if sum(latest_q_total_income) is not 0:
        for x, l in enumerate(total_income_list):
            for i, total in enumerate(l):
                ws.cell(row=i + 32, column=x + 2, value=total)
        '''data for graph labeling'''

        for i, quarter in enumerate(labeling_list_quarter):
            ws.cell(row=32, column=i + 2, value=quarter)

        for i, label in enumerate(labeling_list_year):
            ws.cell(row=32 + i, column=1, value=label)
        '''income graph'''

        chart = LineChart()
        chart.title = str(name) + ' Income Profile'
        chart.style = 4
        chart.x_axis.title = 'Financial Year'
        chart.y_axis.title = 'Cost £m'

        font = Font(typeface='Calibri')
        size = 1200  # 12 point size
        cp = CharacterProperties(latin=font, sz=size, b=True)  # Bold
        pp = ParagraphProperties(defRPr=cp)
        rtp = RichText(p=[Paragraph(pPr=pp, endParaRPr=cp)])
        chart.x_axis.title.tx.rich.p[0].pPr = pp
        chart.y_axis.title.tx.rich.p[0].pPr = pp
        # chart.title.tx.rich.p[0].pPr = pp

        # title
        size_2 = 1400
        cp_2 = CharacterProperties(latin=font, sz=size_2, b=True)
        pp_2 = ParagraphProperties(defRPr=cp_2)
        rtp_2 = RichText(p=[Paragraph(pPr=pp_2, endParaRPr=cp_2)])
        chart.title.tx.rich.p[0].pPr = pp_2

        #unprofiled costs not included in the chart
        data = Reference(ws, min_col=2, min_row=32, max_col=4, max_row=42)
        chart.add_data(data, titles_from_data=True)
        cats = Reference(ws, min_col=1, min_row=33, max_row=42)
        chart.set_categories(cats)
        '''
        keeping as colour coding is useful
        s1 = chart.series[0]
        s1.graphicalProperties.line.solidFill = "cfcfea" #light blue
        s2 = chart.series[1]
        s2.graphicalProperties.line.solidFill = "e2f1bb" #light green 
        s3 = chart.series[2]
        s3.graphicalProperties.line.solidFill = "eaba9d" #light red
        s4 = chart.series[3]
        s4.graphicalProperties.line.solidFil = "5097a4" #medium blue
        s5 = chart.series[4]
        s5.graphicalProperties.line.solidFill = "a0db8e" #medium green
        s6 = chart.series[5]
        s6.graphicalProperties.line.solidFill = "b77575" #medium red
        s7 = chart.series[6]
        s7.graphicalProperties.line.solidFil = "0e2f44" #dark blue
        s8 = chart.series[7]
        s8.graphicalProperties.line.solidFill = "29ab87" #dark green
        s9 = chart.series[8]
        s9.graphicalProperties.line.solidFill = "691c1c" #dark red
        '''

        s3 = chart.series[0]
        s3.graphicalProperties.line.solidFill = "e2f1bb"  # light green
        s8 = chart.series[1]
        s8.graphicalProperties.line.solidFill = "a0db8e"  # medium green
        s9 = chart.series[2]
        s9.graphicalProperties.line.solidFill = "29ab87"  # dark green

        ws.add_chart(chart, "H31")

    else:
        pass

    return wb
    def submit(self):

        ## Create workbook and sheets
        wb = openpyxl.Workbook()
        sheet0 = wb.create_sheet(index=0, title='Read_Me')
        sheet1 = wb.create_sheet(index=1, title='2017_2018')

        ## Create Read me sheet
        sheet0['B2'].value = 'Hey all. This excel file is the result of a python script'
        sheet0['B4'].value = 'The script uses the FPL API and json data to import your history from the ' \
                             'website and then exports it to this file '
        sheet0['B6'].value = 'Report bugs, Contact/Donate at [email protected].'
        sheet0['B8'].value = 'be aware that the code is VERY raw and a lof of improvements can be made.'
        sheet0['B10'].value = 'Your data is in the next sheet. Change sheet tabs below or hold "CTRL+PgDown"'

        ## Import history JSON data
        url1 = 'https://fantasy.premierleague.com/drf/entry/{}/history'.format(self.fpl_prompt.get())
        url2 = 'https://fantasy.premierleague.com/drf/bootstrap-static'
        json_history = requests.get(url1).json()
        json_live = requests.get(url2).json()
        json_teamname = json_history['entry']['name']
        num_of_gw = len(json_history['history'])

        ## Import gameweek history and insert data in sheet
        header1 = ['GW', 'GP', 'GW AVG', 'GW HS', 'PB', 'TM', 'TC', 'GR', 'OP', 'OR', 'Position', 'TV']
        headerrow = 1
        for key in range(12):
            sheet1.cell(row=headerrow, column=key + 3).value = str(header1[key])
        for each in json_history['history']:
            g_w = each['event']
            points = each['points']
            p_b = each['points_on_bench']
            t_m = each['event_transfers']
            t_c = each['event_transfers_cost']
            g_w_r = each['rank']
            o_r = each['overall_rank']
            t_v = each['value']
            p_o_s = each['movement']
            o_p = each['total_points']
            if p_o_s == 'up':
                p_o_s = 1
            elif p_o_s == 'new':
                p_o_s = 0
            else:
                p_o_s = -1
            history_list = [g_w, points, p_b, t_m, t_c, g_w_r, o_p, o_r, p_o_s, t_v / 10]
            for rownum in range(g_w + 1, g_w + 2):
                sheet1.cell(row=rownum, column=3).value = g_w
            for rownum in range(g_w + 1, g_w + 2):
                sheet1.cell(row=rownum, column=4).value = points
            for rownum in range(g_w + 1, g_w + 2):
                for key in range(2, 10):
                    sheet1.cell(row=rownum, column=key + 5).value = history_list[key]

        ## Import gameweek average points and highest points
        for each in json_live['events']:
            g_w = each['id']
            h_p = each['highest_score']
            a_v_g = each['average_entry_score']
            for rownum in range(g_w + 1, g_w + 2):
                sheet1.cell(row=rownum, column=5).value = a_v_g
            for rownum in range(g_w + 1, g_w + 2):
                sheet1.cell(row=rownum, column=6).value = h_p

        ## Import all player data in premier league
        player_d = {}
        for each in json_live['elements']:
            pl_position = each['element_type']
            pl_id = each['id']
            pl_name = each['web_name']
            player_d[pl_id] = pl_name
        tot_player = len(player_d)

        ## Select data for Chip usage and enter in GW history as highlights
        wildcardfill = PatternFill(start_color='ffff0000', end_color='ffff0000', fill_type='solid')
        freehitfill = PatternFill(start_color='ffff00ff', end_color='ffff00ff', fill_type='solid')
        bboostfill = PatternFill(start_color='ffffa500', end_color='ffffa500', fill_type='solid')
        triplecapfill = PatternFill(start_color='ff0099ff', end_color='ff0099ff', fill_type='solid')
        gwh_col = range(3, 15)
        for each in json_history['chips']:
            chipgw = each['event']
            chip = each['name']
            while chip == 'wildcard':
                for key in gwh_col:
                    wc = sheet1.cell(row=chipgw + 1, column=key)
                    wc.fill = wildcardfill
                break
            while chip == 'bboost':
                for key in gwh_col:
                    wc = sheet1.cell(row=chipgw + 1, column=key)
                    wc.fill = bboostfill
                break
            while chip == 'freehit':
                for key in gwh_col:
                    wc = sheet1.cell(row=chipgw + 1, column=key)
                    wc.fill = freehitfill
                break
            while chip == '3xc':
                for key in gwh_col:
                    wc = sheet1.cell(row=chipgw + 1, column=key)
                    wc.fill = triplecapfill
                break

        ## Import weekly team player data and points
        gwteamheaderow = 41
        gwtitle = 3
        for gw in range(1, 39):
            sheet1.cell(row=gwteamheaderow, column=gwtitle).value = str('GW {}'.format(gw))
            sheet1.cell(row=gwteamheaderow, column=gwtitle + 1).value = str('P {}'.format(gw))
            gwtitle = gwtitle + 2
        capfill = PatternFill(start_color='ff15dd43', end_color='ff15dd43', fill_type='solid')
        vcapfill = PatternFill(start_color='ff00FFDA', end_color='ff00FFDA', fill_type='solid')
        benchfill = PatternFill(start_color='ffBA6B12', end_color='ffBA6B12', fill_type='solid')
        for rownum in range(53, 57):
            for colnum in range(3, 79):
                bench = sheet1.cell(row=rownum, column=colnum)
                bench.fill = benchfill

        gwteamcol = (39 * 2 - int(num_of_gw * 2)) - 1  # To accomodate for people who started late.
        capfont = Font(underline='single')
        for each in json_history['history']:
            g_w = each['event']
            url3 = 'https://fantasy.premierleague.com/drf/entry/{}/event/{}/picks'.format(self.fpl_prompt.get(), g_w)
            json_pick = requests.get(url3).json()
            gwteamcol = gwteamcol + 2
            gwteamrow = 42
            url4 = 'https://fantasy.premierleague.com/drf/event/{}/live'.format(g_w)
            json_points = requests.get(url4).json()
            total_players = len(json_points['elements'])
            for each1 in json_pick['picks']:
                player_id = each1['element']
                captain = each1['is_captain']
                vicecapt = each1['is_vice_captain']
                multiplier = each1['multiplier']
                pl_name = player_d[player_id]
                plist = {player_id: pl_name}
                player_idnew = str(player_id)
                for each2 in json_points['elements'][player_idnew]['stats'].keys():
                    while each2 == 'total_points':
                        pl_points = (json_points['elements'][player_idnew]['stats']['total_points'])
                        sheet1.cell(row=gwteamrow, column=gwteamcol + 1).value = pl_points
                        if multiplier == 2:
                            sheet1.cell(row=gwteamrow, column=gwteamcol + 1).value = pl_points * 2
                        elif multiplier == 3:
                            sheet1.cell(row=gwteamrow, column=gwteamcol + 1).value = pl_points * 3
                        break
                for values in plist.values():
                    sheet1.cell(row=gwteamrow, column=gwteamcol).value = values
                if captain == True:
                    capf = sheet1.cell(row=gwteamrow, column=gwteamcol)
                    capf.fill = capfill
                    capf.font = capfont
                if vicecapt == True:
                    vcapf = sheet1.cell(row=gwteamrow, column=gwteamcol)
                    vcapf.fill = vcapfill
                gwteamrow = gwteamrow + 1

        ## Import classic league history
        sheet1.merge_cells('BR1:BS1')  # League Rank header
        sheet1['BR1'].value = 'League Rank History'

        clrow = 2
        num_of_leagues = len(json_history['leagues']['classic'])
        clheader = ['League Name', 'Rank']
        for leaguecolumn in range(2):
            sheet1.cell(row=clrow, column=leaguecolumn + 70).value = str(clheader[leaguecolumn])
        for each in json_history['leagues']['classic']:
            leaguename = each['name']
            leagueposition = each['entry_rank']
            league_data = [leaguename, leagueposition]
            clrow = clrow + 1
            for clcol in range(2):
                sheet1.cell(row=clrow, column=clcol + 70).value = league_data[clcol]

        ## Import Cup History
        sheet1.merge_cells('BV1:BZ1')  # Cup History Header
        sheet1['BV1'].value = 'FPL Cup History'

        url8 = 'https://fantasy.premierleague.com/drf/entry/{}/cup'.format(self.fpl_prompt.get())
        json_cup = requests.get(url8).json()
        num_of_cups = len(json_cup['cup_matches'])
        cuplist = ['GW', 'Team Name 1', 'Points 1', 'Team Name 2', 'Points 2 ']
        cuprow = 2
        for col in range(5):
            sheet1.cell(row=cuprow, column=col + 74).value = str(cuplist[col])

        if num_of_cups > 0:
            for each in json_cup['cup_matches']:
                cupgw = each['event']
                entry_1 = each['entry_1_name']
                entry_2 = each['entry_2_name']
                entrypoints_1 = each['entry_1_points']
                entrypoints_2 = each['entry_2_points']
                cup_data = [cupgw, entry_1, entrypoints_1, entry_2, entrypoints_2]
                cuprow = cuprow + 1
                for colnum in range(5):
                    sheet1.cell(row=cuprow, column=colnum + 74).value = cup_data[colnum]
        else:
            sheet1.cell(row=3, column=74).value = "Failed to qualify for the cup. Noob."

        ## Import h2h details
        sheet1.merge_cells('BN1:BO1')  # H2H Team Header
        sheet1['BN1'].value = 'H2H History'
        num_of_h2h = len(json_history['leagues']['h2h'])

        h2h_header = ['H2H League', 'Rank']
        h2hrow = 2
        for h2hcol in range(2):
            sheet1.cell(row=h2hrow, column=h2hcol + 66).value = str(h2h_header[h2hcol])

        if num_of_h2h > 0:
            for each in json_history['leagues']['h2h']:
                h2hname = each['name']
                h2hrank = each['entry_rank']
                h2h_data = [h2hname, h2hrank]
                h2hrow = h2hrow + 1
                for colnum in range(2):
                    sheet1.cell(row=h2hrow, column=colnum + 66).value = h2h_data[colnum]
        else:
            sheet1.cell(row=3, column=66).value = "No H2H leagues entered." \
                                                  ""
        ## Import Gameweek Transfer history
        sheet1.merge_cells('CD1:CH1')
        sheet1['CD1'].value = 'Transfer History'

        transferheader = ['GW', 'Transfer In', 'Value In ', 'Transfer Out', 'Value Out']
        transferhrow = 2
        for tkey in range(5):
            sheet1.cell(row=transferhrow, column=tkey + 82).value = str(transferheader[tkey])
        url5 = 'https://fantasy.premierleague.com/drf/entry/{}/transfers'.format(self.fpl_prompt.get())
        json_transfer = requests.get(url5).json()
        gwtransferrow = 2
        gwtransfercol = 82
        num_of_t = len(json_transfer['history'])

        if num_of_t == 0:
            sheet1.cell(row=gwtransferrow + 1, column=gwtransfercol).value = "No Transfers Made"
        else:
            for each in json_transfer['history']:
                transferin = each['element_in']
                transferout = each['element_out']
                incost = each['element_in_cost']
                outcost = each['element_out_cost']
                transfergw = each['event']
                t_in_name = player_d.get(transferin, 0)
                t_out_name = player_d.get(transferout, 0)
                trans_data = [transfergw, t_in_name, incost / 10, t_out_name, outcost / 10]
                gwtransferrow = gwtransferrow + 1
                for colnum in range(5):
                    sheet1.cell(row=gwtransferrow, column=colnum + gwtransfercol).value = trans_data[colnum]

        ## Import Overall Dream Team Data
        sheet1.merge_cells('BI1:BJ1')  # Dream Team Header
        sheet1['BI1'].value = str('Overall Dream Team')

        overalldtheader = ['Player Name', 'Total Points']
        for odtcol in range(2):
            sheet1.cell(row=2, column=odtcol + 61).value = str(overalldtheader[odtcol])

        url6 = 'https://fantasy.premierleague.com/drf/dream-team'
        json_dreamteam = requests.get(url6).json()
        dtrow = 2

        for each in json_dreamteam['team']:
            dtpoints = each['points']
            dtplayer = each['element']
            dt_name = player_d.get(dtplayer, 0)
            dt_data = [dt_name, dtpoints]
            dtrow = dtrow + 1
            for colnum in range(2):
                sheet1.cell(row=dtrow, column=colnum + 61).value = dt_data[colnum]

        ## Import Weekly Dream Team Data
        dtteamheaderrow = 59
        dttitle = 3
        for dt in range(1, 39):
            sheet1.cell(row=dtteamheaderrow, column=dttitle).value = str('GW {}'.format(dt))
            sheet1.cell(row=dtteamheaderrow, column=dttitle + 1).value = str('P {}'.format(dt))
            dttitle = dttitle + 2

        dtteamcol = 1
        for each in range(1, 39):
            url7 = 'https://fantasy.premierleague.com/drf/dream-team/{}'.format(each)
            json_weeklydt = requests.get(url7).json()
            dtteamrow = 60
            dtteamcol = dtteamcol + 2
            for each1 in json_weeklydt['team']:
                dtpl_id = each1['element']
                dt_points = each1['points']
                pl_name = player_d[dtpl_id]
                dtlist = {pl_name: dt_points}
                for values in dtlist.values():
                    sheet1.cell(row=dtteamrow, column=dtteamcol + 1).value = values
                for values2 in dtlist.keys():
                    sheet1.cell(row=dtteamrow, column=dtteamcol).value = values2
                dtteamrow = dtteamrow + 1

        ## Creating Legend
        legendlist = ['Legend', 'Wildcard', 'Benchboost', 'Triple Captain', 'Free Hit', 'Captain', 'Vice Captain',
                      'Bench']
        legendrow = 5
        for lkey in range(8):
            sheet1.cell(row=lkey + legendrow, column=1).value = legendlist[lkey]
            lewc = sheet1.cell(row=legendrow + 1, column=1)
            lewc.fill = wildcardfill
            lebb = sheet1.cell(row=legendrow + 2, column=1)
            lebb.fill = bboostfill
            letc = sheet1.cell(row=legendrow + 3, column=1)
            letc.fill = triplecapfill
            lefh = sheet1.cell(row=legendrow + 4, column=1)
            lefh.fill = freehitfill
            leca = sheet1.cell(row=legendrow + 5, column=1)
            leca.fill = capfill
            levca = sheet1.cell(row=legendrow + 6, column=1)
            levca.fill = vcapfill
            leben = sheet1.cell(row=legendrow + 7, column=1)
            leben.fill = benchfill

        ## Creating Team name and FPL ID
        sheet1['A2'].value = 'FPL ID: {}'.format(self.fpl_prompt.get())
        sheet1['A1'].value = 'Team: {}'.format(json_teamname)

        ## Cell Styling
        headerfont = Font(bold=True)
        alignment = Alignment(horizontal='center')

        for key in range(74, 79):  # FPL CUP 'GW/Team Name/Points/Team Name/Points'
            row2 = sheet1.cell(row=2, column=key)
            row2.font = headerfont
            row2.alignment = alignment

        for row in range(1, num_of_cups + 3):  # FPL CUP History details
            for col in range(74, 79):
                cup1 = sheet1.cell(row=row, column=col)
                cup1.alignment = alignment

        cup2 = sheet1.cell(row=1, column=74)  # 'FPL CUP History'
        cup2.font = headerfont
        cup2.alignment = alignment

        for key in range(3, 15):  # 'GW/GP/GW AVG/GW HS/PB/......'
            row1 = sheet1.cell(row=1, column=key)
            row1.font = headerfont
            row1.alignment = alignment

        for key in range(3, 79):  # GW Teams 'GW1/P1/GW2/P2.....'
            row41 = sheet1.cell(row=41, column=key)
            row41.font = headerfont
            row41.alignment = alignment

        for key1 in range(2, 40):  # GW history full table
            for key2 in range(3, 10):
                set1 = sheet1.cell(row=key1, column=key2)
                set1.alignment = alignment

        for key1 in range(42, 57):  # Team history full table
            for key2 in range(3, 79):
                set2 = sheet1.cell(row=key1, column=key2)
                set2.alignment = alignment

        for key in range(2, 40):  # GW history table value format
            col3 = sheet1.cell(row=key, column=14)  # Team Value
            col3.number_format = '0.0'
            col3.alignment = alignment
            col4 = sheet1.cell(row=key, column=11)  # Overall Points
            col4.alignment = alignment
            col5 = sheet1.cell(row=key, column=10)  # Gameweek Rank
            col5.number_format = '#,##0'
            col6 = sheet1.cell(row=key, column=12)  # Overall Rank
            col6.number_format = '#,##0'
            col4 = sheet1.cell(row=key, column=13)  # Position
            col4.alignment = alignment

        for key1 in range(1, 3 + num_of_t):  # Transfer history table
            for key2 in range(82, 88):
                set3 = sheet1.cell(row=key1, column=key2)
                set3.alignment = alignment
        for key in range(82, 88):
            set4 = sheet1.cell(row=1, column=key)
            set4.alignment = alignment
            set4.font = headerfont

        for key in range(82, 88):  # Transfer history 'GW/Transfer in/Value....'
            row1 = sheet1.cell(row=1, column=key)
            row1.font = headerfont

        for key1 in range(2, num_of_t + 1):  # Transfer table value In
            col7 = sheet1.cell(row=key1, column=84)
            col7.number_format = '0.0'

        for key1 in range(2, num_of_t + 1):  # Transfer table value Out
            col7 = sheet1.cell(row=key1, column=86)
            col7.number_format = '0.0'

        for col8 in range(70, 73):  # League Rank table
            lrh = sheet1.cell(row=1, column=col8)
            lrh.font = headerfont
            for row8 in range(2, num_of_leagues + 3):
                lr = sheet1.cell(row=row8, column=col8)
                lr.alignment = alignment

        lr1 = sheet1.cell(row=1, column=70)  # League Rank title
        lr1.font = headerfont
        lr1.alignment = alignment

        for col9 in range(3, 79):  # Gameweek Dream Team full table and title
            gwdt = sheet1.cell(row=59, column=col9)
            gwdt.font = headerfont
            for row9 in range(59, 71):
                gwdtt = sheet1.cell(row=row9, column=col9)
                gwdtt.alignment = alignment

        for col10 in range(61, 63):  # Overall dream team table and titles
            odt = sheet1.cell(row=1, column=col10)
            odt.font = headerfont
            odt.alignment = alignment
        for col10 in range(61, 63):
            for row10 in range(2, 14):
                odtt = sheet1.cell(row=row10, column=col10)
                odtt.alignment = alignment
        for col10 in range(61, 63):
            odt = sheet1.cell(row=2, column=col10)
            odt.font = headerfont

        for col11 in range(66, 68):  # Head2Head table and titles
            h2ht = sheet1.cell(row=1, column=col11)
            h2ht.font = headerfont
            h2ht.alignment = alignment
        for col11 in range(66, 68):
            for row11 in range(2, num_of_h2h + 3):
                h2htt = sheet1.cell(row=row11, column=col11)
                h2htt.alignment = alignment
        for col11 in range(66, 68):
            h2ht = sheet1.cell(row=2, column=col11)
            h2ht.font = headerfont

        ## Creating Position symbols for GW history
        first = FormatObject(type='num', val=-1)
        second = FormatObject(type='num', val=0)
        third = FormatObject(type='num', val=1)
        iconset = IconSet(iconSet='3Arrows', cfvo=[first, second, third], showValue=None, percent=None,
                          reverse=None)
        rule = Rule(type='iconSet', iconSet=iconset)
        sheet1.conditional_formatting.add('M2:M39', cfRule=rule)

        ## Creating Tables
        table1 = Table(displayName='GWH', ref='C1:N39')  # GW History
        style1 = TableStyleInfo(name="TableStyleMedium11", showRowStripes=True)
        table1.tableStyleInfo = style1
        sheet1.add_table(table1)

        table2 = Table(displayName='GWT', ref='C41:BZ56')  # Team History
        style2 = TableStyleInfo(name="TableStyleLight15", showRowStripes=True)
        table2.tableStyleInfo = style2
        sheet1.add_table(table2)

        if num_of_t > 0:
            num_of_trow = num_of_t
        else:
            num_of_trow = 1
        table3 = Table(displayName='TH', ref='CD2:CH{}'.format(num_of_trow + 2))  # Transfer History
        style3 = TableStyleInfo(name="TableStyleMedium12", showRowStripes=True)
        table3.tableStyleInfo = style3
        sheet1.add_table(table3)

        if num_of_cups > 0:
            cup_table_row = 2
        else:
            cup_table_row = 3

        table4 = Table(displayName='CH', ref='BV2:BZ{}'.format(num_of_cups + cup_table_row))  # FPL Cup history
        style4 = TableStyleInfo(name="TableStyleMedium13", showRowStripes=True)
        table4.tableStyleInfo = style4
        sheet1.add_table(table4)

        table5 = Table(displayName='CLR', ref='BR2:BS{}'.format(num_of_leagues + 2))  # Classic League Rank
        style5 = TableStyleInfo(name="TableStyleMedium10", showRowStripes=True)
        table5.tableStyleInfo = style5
        sheet1.add_table(table5)

        if num_of_h2h > 0:
            h2h_table_row = 2
        else:
            h2h_table_row = 3

        table6 = Table(displayName='HTOH', ref='BN2:BO{}'.format(num_of_h2h + h2h_table_row))  # H2H Rank
        style6 = TableStyleInfo(name="TableStyleMedium11", showRowStripes=True)
        table6.tableStyleInfo = style6
        sheet1.add_table(table6)

        table7 = Table(displayName='ODT', ref='BI2:BJ13')  # Overall Dream Team
        style7 = TableStyleInfo(name="TableStyleMedium7", showRowStripes=True)
        table7.tableStyleInfo = style7
        sheet1.add_table(table7)

        table8 = Table(displayName='GWDT', ref='C59:BZ70')  # GW Dream Team
        style8 = TableStyleInfo(name="TableStyleLight17", showRowStripes=True)
        table8.tableStyleInfo = style8
        sheet1.add_table(table8)

        ## Creating Chart
        chart1 = LineChart()
        chart1.title = 'Gameweek Points / Average Points / Points Benched / Highest GW Score'
        data1 = Reference(sheet1, min_col=4, max_col=7, min_row=1, max_row=39)
        chart1.height = 20
        chart1.width = 50
        chart1.add_data(data1, titles_from_data=True)
        sheet1.add_chart(chart1, "Q2")

        ## Save workbook
        wb.save('FPL.Data.17-18.xlsx')

        ## Clear text box and show success dialog
        self.clear()
        item_path = str(path.realpath("FPL.Data.17-18.xlxs"))
        messagebox.showinfo(title="Success", message="Data for \'{}\' imported successfully.\n"
                                                     "File saved in {}".format(json_teamname, item_path))
Example #32
0
        ws.cell(row=1, column=3).value = "HTC_MODEM_RESET"
        ws.cell(row=1, column=4).value = "HTC_PWR_EXPERT"
        ws.cell(row=1, column=5).value = "LASTKMSG"

        # Insert Data
        row_num = 2
        for row_all in rows_all:
            print row_all.Time, row_all.HTC_LOG_UPLOAD, row_all.HTC_MODEM_RESET, row_all.HTC_PWR_EXPERT, row_all.LASTKMSG
            ws.cell(row=row_num, column=1).value = row_all.Time
            ws.cell(row=row_num, column=2).value = row_all.HTC_LOG_UPLOAD
            ws.cell(row=row_num, column=3).value = row_all.HTC_MODEM_RESET
            ws.cell(row=row_num, column=4).value = row_all.HTC_PWR_EXPERT
            ws.cell(row=row_num, column=5).value = row_all.LASTKMSG
            row_num += 1
            # Create line chart
            c1 = LineChart()
            c1.title = "Log Counts of Tags"
            c1.style = 2
            data = Reference(ws, min_col=2, min_row=1, max_col=5, max_row=8)
            c1.add_data(data, titles_from_data=True)
            ws.add_chart(c1, "A10")
        excel_logpath = 'Detail_'+localtime2+'.xlsx'
        wb.save(excel_logpath)
        fullpath=current_exec_path+"\\"+excel_logpath
        mail.send_mail("*****@*****.**","[email protected];[email protected]","test","test",fullpath)
    else:
        logging.info("Normal!")
    logging.info("--- Check status")

except Exception, e:
    print e
Example #33
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):

    wb = Workbook()
    ws = wb.active
    ws.title = "EquipmentCost"

    # Row height
    ws.row_dimensions[1].height = 102

    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Arial', size=15, bold=True)
    title_font = Font(name='Arial', size=15, bold=True)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    ws.add_image(img, 'A1')

    # Title
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'] = name

    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'] = period_type

    ws['B4'].alignment = b_r_alignment
    ws['B4'] = 'Reporting Start Datetime:'
    ws['C4'].border = b_border
    ws['C4'].alignment = b_c_alignment
    ws['C4'] = reporting_start_datetime_local

    ws['D4'].alignment = b_r_alignment
    ws['D4'] = 'Reporting End Datetime:'
    ws['E4'].border = b_border
    ws['E4'].alignment = b_c_alignment
    ws['E4'] = reporting_end_datetime_local

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename
    ####################################################################################################################
    # First: Reporting Period Costs
    # 6: title
    # 7: table title
    # 8~10 table_data
    # Total: 5 rows
    # if has not energy data: set low height for rows
    ####################################################################################################################
    reporting_period_data = report['reporting_period']

    has_energy_data_flag = True
    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_energy_data_flag = False

    if has_energy_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + ' ' + 'Reporting Period Costs'

        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[7].height = 60
        ws['B7'].fill = table_fill
        ws['B7'].border = f_border

        ws['B8'].font = title_font
        ws['B8'].alignment = c_c_alignment
        ws['B8'] = 'Cost'
        ws['B8'].border = f_border

        ws['B9'].font = title_font
        ws['B9'].alignment = c_c_alignment
        ws['B9'] = 'Increment Rate'
        ws['B9'].border = f_border

        col = ''

        for i in range(0, ca_len):
            col = chr(ord('C') + i)
            row = '7'
            cell = col + row
            ws[col + '7'].fill = table_fill
            ws[col + '7'].font = name_font
            ws[col + '7'].alignment = c_c_alignment
            ws[col + '7'] = reporting_period_data['names'][
                i] + " (" + reporting_period_data['units'][i] + ")"
            ws[col + '7'].border = f_border

            ws[col + '8'].font = name_font
            ws[col + '8'].alignment = c_c_alignment
            ws[col + '8'] = round(reporting_period_data['subtotals'][i], 2)
            ws[col + '8'].border = f_border

            ws[col + '9'].font = name_font
            ws[col + '9'].alignment = c_c_alignment
            ws[col + '9'] = str(round(reporting_period_data['increment_rates'][i] * 100, 2)) + "%" \
                if reporting_period_data['increment_rates'][i] is not None else "-"
            ws[col + '9'].border = f_border

        col = chr(ord(col) + 1)

        ws[col + '7'].fill = table_fill
        ws[col + '7'].font = name_font
        ws[col + '7'].alignment = c_c_alignment
        ws[col + '7'] = "Total (" + reporting_period_data['total_unit'] + ")"
        ws[col + '7'].border = f_border

        ws[col + '8'].font = name_font
        ws[col + '8'].alignment = c_c_alignment
        ws[col + '8'] = round(reporting_period_data['total'], 2)
        ws[col + '8'].border = f_border

        ws[col + '9'].font = name_font
        ws[col + '9'].alignment = c_c_alignment
        ws[col + '9'] = str(round(reporting_period_data['total_increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['total_increment_rate'] is not None else "-"
        ws[col + '9'].border = f_border

    else:
        for i in range(6, 8 + 1):
            ws.row_dimensions[i].height = 0.1
    ####################################################################################################################
    # Second: Electricity Cost by Time-Of-Use
    # 12: title
    # 13: table title
    # 14~17 table_data
    # Total: 6 rows
    ####################################################################################################################
    has_ele_peak_flag = True
    if "toppeaks" not in reporting_period_data.keys() or \
            reporting_period_data['toppeaks'] is None or \
            len(reporting_period_data['toppeaks']) == 0:
        has_ele_peak_flag = False

    if has_ele_peak_flag:
        ws['B12'].font = title_font
        ws['B12'] = name + ' ' + 'Electricity Cost by Time-Of-Use'

        ws.row_dimensions[13].height = 60
        ws['B13'].fill = table_fill
        ws['B13'].font = name_font
        ws['B13'].alignment = c_c_alignment
        ws['B13'].border = f_border

        ws['C13'].fill = table_fill
        ws['C13'].font = name_font
        ws['C13'].alignment = c_c_alignment
        ws['C13'].border = f_border
        ws['C13'] = 'Electricity Cost by Time-Of-Use'

        ws['B14'].font = title_font
        ws['B14'].alignment = c_c_alignment
        ws['B14'] = 'TopPeak'
        ws['B14'].border = f_border

        ws['C14'].font = title_font
        ws['C14'].alignment = c_c_alignment
        ws['C14'].border = f_border
        ws['C14'] = round(reporting_period_data['toppeaks'][0], 2)

        ws['B15'].font = title_font
        ws['B15'].alignment = c_c_alignment
        ws['B15'] = 'OnPeak'
        ws['B15'].border = f_border

        ws['C15'].font = title_font
        ws['C15'].alignment = c_c_alignment
        ws['C15'].border = f_border
        ws['C15'] = round(reporting_period_data['onpeaks'][0], 2)

        ws['B16'].font = title_font
        ws['B16'].alignment = c_c_alignment
        ws['B16'] = 'MidPeak'
        ws['B16'].border = f_border

        ws['C16'].font = title_font
        ws['C16'].alignment = c_c_alignment
        ws['C16'].border = f_border
        ws['C16'] = round(reporting_period_data['midpeaks'][0], 2)

        ws['B17'].font = title_font
        ws['B17'].alignment = c_c_alignment
        ws['B17'] = 'OffPeak'
        ws['B17'].border = f_border

        ws['C17'].font = title_font
        ws['C17'].alignment = c_c_alignment
        ws['C17'].border = f_border
        ws['C17'] = round(reporting_period_data['offpeaks'][0], 2)

        pie = PieChart()
        pie.title = name + ' ' + 'Electricity Cost by Time-Of-Use'
        labels = Reference(ws, min_col=2, min_row=14, max_row=17)
        pie_data = Reference(ws, min_col=3, min_row=13, max_row=17)
        pie.add_data(pie_data, titles_from_data=True)
        pie.set_categories(labels)
        pie.height = 7.25
        pie.width = 9
        s1 = pie.series[0]
        s1.dLbls = DataLabelList()
        s1.dLbls.showCatName = False  # 标签显示
        s1.dLbls.showVal = True  # 数量显示
        s1.dLbls.showPercent = True  # 百分比显示

        ws.add_chart(pie, "D13")

    else:
        for i in range(12, 18 + 1):
            ws.row_dimensions[i].height = 0.1
        # end_row 10
        # start_row 12
    ####################################################################################################################
    # Second: Costs Proportion by Energy Category
    ####################################################################################################################
    current_row_number = 19

    has_subtotals_data_flag = True

    if 'subtotals' not in reporting_period_data.keys() or \
            reporting_period_data['subtotals'] is None:
        has_subtotals_data_flag = False

    if has_subtotals_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' ' + 'Costs Proportion'

        current_row_number += 1
        table_start_row_number = current_row_number

        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = name_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border

        ws['C' + str(current_row_number)].fill = table_fill
        ws['C' + str(current_row_number)].font = name_font
        ws['C' + str(current_row_number)].alignment = c_c_alignment
        ws['C' + str(current_row_number)].border = f_border
        ws['C' + str(current_row_number)] = 'Costs Proportion'

        current_row_number += 1

        category = reporting_period_data['names']
        ca_len = len(category)

        for i in range(0, ca_len):
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)] = reporting_period_data['names'][i] + \
                ' (' + reporting_period_data['units'][i] + ')'
            ws['B' + str(current_row_number)].border = f_border

            ws['C' + str(current_row_number)].font = title_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)] = round(
                reporting_period_data['subtotals'][i], 3)
            ws['C' + str(current_row_number)].border = f_border

            current_row_number += 1

        table_end_row_number = current_row_number - 1

        pie = PieChart()
        pie.title = name + ' ' + 'Costs Proportion'
        labels = Reference(ws,
                           min_col=2,
                           min_row=table_start_row_number + 1,
                           max_row=table_end_row_number)
        pie_data = Reference(ws,
                             min_col=3,
                             min_row=table_start_row_number,
                             max_row=table_end_row_number)
        pie.add_data(pie_data, titles_from_data=True)
        pie.set_categories(labels)
        pie.height = 6.6
        pie.width = 9
        s1 = pie.series[0]
        s1.dLbls = DataLabelList()
        s1.dLbls.showCatName = False
        s1.dLbls.showVal = True
        s1.dLbls.showPercent = True

        ws.add_chart(pie, 'D' + str(table_start_row_number))

        if ca_len < 4:
            current_row_number = current_row_number - ca_len + 4

        current_row_number += 1

    ####################################################################################################################
    # Fourth: Detailed Data
    # current_row_number: title
    # current_row_number+1 ~ current_row_number+1+ca_len*6-1: line
    # current_row_number+1+ca_len*6: table title
    # current_row_number+1+ca_len*6~: table_data
    ####################################################################################################################
    reporting_period_data = report['reporting_period']
    times = reporting_period_data['timestamps']
    has_detail_data_flag = True
    ca_len = len(report['reporting_period']['names'])
    real_timestamps_len = timestamps_data_not_equal_0(
        report['parameters']['timestamps'])
    table_row = current_row_number + 2 + ca_len * 6 + real_timestamps_len * 7
    chart_start_row_number = current_row_number + 1
    if "timestamps" not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0:
        has_detail_data_flag = False

    if has_detail_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data'

        ws.row_dimensions[table_row].height = 60
        ws['B' + str(table_row)].fill = table_fill
        ws['B' + str(table_row)].font = title_font
        ws['B' + str(table_row)].border = f_border
        ws['B' + str(table_row)].alignment = c_c_alignment
        ws['B' + str(table_row)] = 'Datetime'
        time = times[0]
        has_data = False
        max_row = 0
        if len(time) > 0:
            has_data = True
            max_row = table_row + len(time)

        if has_data:
            for i in range(0, len(time)):
                col = 'B'
                row = str(table_row + 1 + i)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = time[i]
                ws[col + row].border = f_border

            for i in range(0, ca_len):
                # 38 title
                col = chr(ord('C') + i)

                ws[col + str(table_row)].fill = table_fill
                ws[col + str(table_row)].font = title_font
                ws[col + str(table_row)].alignment = c_c_alignment
                ws[col + str(table_row)] = reporting_period_data['names'][i] + \
                    " (" + reporting_period_data['units'][i] + ")"
                ws[col + str(table_row)].border = f_border

                # 39 data
                time = times[i]
                time_len = len(time)

                for j in range(0, time_len):
                    row = str(table_row + 1 + j)
                    # col = chr(ord('B') + i)
                    ws[col + row].font = title_font
                    ws[col + row].alignment = c_c_alignment
                    ws[col + row] = round(
                        reporting_period_data['values'][i][j], 2)
                    ws[col + row].border = f_border

            current_row_number = table_row + 1 + len(times[0])

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = 'Subtotal'

            for i in range(0, ca_len):
                col = chr(ord('C') + i)
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)].border = f_border
                ws[col + str(current_row_number)] = round(
                    reporting_period_data['subtotals'][i], 2)

                # line
                # 39~: line
                line = LineChart()
                line.title = 'Reporting Period Consumption - ' + ws.cell(
                    column=3 + i, row=table_row).value
                labels = Reference(ws,
                                   min_col=2,
                                   min_row=table_row + 1,
                                   max_row=max_row)
                line_data = Reference(ws,
                                      min_col=3 + i,
                                      min_row=table_row,
                                      max_row=max_row)  # openpyxl bug
                line.add_data(line_data, titles_from_data=True)
                line.set_categories(labels)
                line_data = line.series[0]
                line_data.marker.symbol = "circle"
                line_data.smooth = True
                line.x_axis.crosses = 'min'
                line.height = 8.25
                line.width = 24
                line.dLbls = DataLabelList()
                line.dLbls.dLblPos = 't'
                line.dLbls.showVal = True  # val show
                line.dLbls.showPercent = True  # percent show
                chart_col = 'B'
                chart_cell = chart_col + str(chart_start_row_number + 6 * i)
                ws.add_chart(line, chart_cell)

    current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6
    ####################################################################################################################
    has_parameters_names_and_timestamps_and_values_data = True
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):

        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ################################################################################################################
        # new worksheet
        ################################################################################################################

        parameters_data = report['parameters']
        parameters_names_len = len(parameters_data['names'])

        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
        parameters_ws = wb.create_sheet(file_name + 'Parameters')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(
                i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        parameters_ws.add_image(img, 'A1')

        # Title

        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'] = name

        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'] = period_type

        parameters_ws['B4'].alignment = b_r_alignment
        parameters_ws['B4'] = 'Reporting Start Datetime:'
        parameters_ws['C4'].border = b_border
        parameters_ws['C4'].alignment = b_c_alignment
        parameters_ws['C4'] = reporting_start_datetime_local

        parameters_ws['D4'].alignment = b_r_alignment
        parameters_ws['D4'] = 'Reporting End Datetime:'
        parameters_ws['E4'].border = b_border
        parameters_ws['E4'].alignment = b_c_alignment
        parameters_ws['E4'] = reporting_end_datetime_local

        parameters_ws_current_row_number = 6

        parameters_ws['B' +
                      str(parameters_ws_current_row_number)].font = title_font
        parameters_ws[
            'B' +
            str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[
            parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 2

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            col = format_cell.get_column_letter(table_current_col_number)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border

            col = format_cell.get_column_letter(table_current_col_number + 1)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = format_cell.get_column_letter(table_current_col_number)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = format_cell.get_column_letter(table_current_col_number +
                                                    1)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(
                    parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = table_current_col_number + 3

        ################################################################################################################
        # parameters chart and parameters table
        ################################################################################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(
            current_sheet_parameters_row_number)] = name + ' ' + 'Parameters'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = 'Parameters - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws,
                               min_col=labels_col,
                               min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) +
                                        parameters_table_start_row_number))
            line_data = Reference(
                parameters_ws,
                min_col=data_col,
                min_row=parameters_table_start_row_number,
                max_row=(len(parameters_data['timestamps'][i]) +
                         parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1
    ####################################################################################################################
    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #34
0
from openpyxl import load_workbook
wb = load_workbook("sample.xlsx")
ws = wb.active

from openpyxl.chart import BarChart, Reference, LineChart
# B2:C11 까지의 데이터를 차트로 생성
# bar_value = Reference(ws, min_row=2, max_row=11, min_col=2, max_col=3)
# bar_chart = BarChart() # 차트 종류 설정 (Bar, Line, Pie, ..)
# bar_chart.add_data(bar_value)
# ws.add_chart(bar_chart, "E1") # 차트 넣을 위치 정의

# B1:C11 까지의 데이터
line_value = Reference(ws, min_row=1, max_row=11, min_col=2, max_col=3)
line_chart = LineChart()
line_chart.add_data(line_value, titles_from_data=True) # 계열 > 영어, 수학 (제목에서 가져옴)
line_chart.title = "성적표" # 제목
line_chart.style = 10 # 미리 정의된 스타일 적용, 사용자가 개별 지정도 가능
line_chart.y_axis.title = "점수" # y 축의 제목
line_chart.x_axis.title = "번호" # x 축의 제목
ws.add_chart(line_chart, "E1")

wb.save("sample_chart.xlsx") 
Example #35
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102

    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5
    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    # data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=False,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=False,
                              shrink_to_fit=False,
                              indent=0)
    # c_r_alignment = Alignment(vertical='bottom',
    #                           horizontal='center',
    #                           text_rotation=0,
    #                           wrap_text=False,
    #                           shrink_to_fit=False,
    #                           indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    # img = Image("myems.png")
    img.width = img.width * 1.06
    img.height = img.height * 1.06
    ws.add_image(img, 'B1')

    # Title
    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local[:
                                              10] + "__" + reporting_end_datetime_local[:
                                                                                        10]
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename
    #################################################
    # First: 统计分析
    # 6: title
    # 7: table title
    # 8~2*ca_len table_data
    #################################################
    reporting_period_data = report['reporting_period']

    has_energy_data_flag = True

    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_energy_data_flag = False

        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    if has_energy_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + ' 统计分析'

        category = reporting_period_data['names']

        # table_title
        ws['B7'].fill = table_fill
        ws['B7'].font = title_font
        ws['B7'].alignment = c_c_alignment
        ws['B7'] = '报告期'
        ws['B7'].border = f_border

        ws['C7'].font = title_font
        ws['C7'].alignment = c_c_alignment
        ws['C7'] = '平均负荷'
        ws['C7'].border = f_border

        ws['D7'].font = title_font
        ws['D7'].alignment = c_c_alignment
        ws['D7'] = '最大负荷'
        ws['D7'].border = f_border

        ws['E7'].font = title_font
        ws['E7'].alignment = c_c_alignment
        ws['E7'] = '负荷系数'
        ws['E7'].border = f_border

        # table_data

        for i, value in enumerate(category):
            row = i * 2 + 8
            ws['B' + str(row)].font = name_font
            ws['B' + str(row)].alignment = c_c_alignment
            ws['B' + str(row)] = reporting_period_data['names'][
                i] + " (" + reporting_period_data['units'][i] + "/H )"
            ws['B' + str(row)].border = f_border

            ws['B' + str(row + 1)].font = name_font
            ws['B' + str(row + 1)].alignment = c_c_alignment
            ws['B' + str(row + 1)] = "环比"
            ws['B' + str(row + 1)].border = f_border

            ws['C' + str(row)].font = name_font
            ws['C' + str(row)].alignment = c_c_alignment
            ws['C' + str(row)] = round(reporting_period_data['averages'][i], 2) \
                if reporting_period_data['averages'][i] is not None else ''
            ws['C' + str(row)].border = f_border
            ws['C' + str(row)].number_format = '0.00'

            ws['C' + str(row + 1)].font = name_font
            ws['C' + str(row + 1)].alignment = c_c_alignment
            ws['C' + str(row + 1)] = str(round(reporting_period_data['averages_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['averages_increment_rate'][i] is not None else '0.00%'
            ws['C' + str(row + 1)].border = f_border

            ws['D' + str(row)].font = name_font
            ws['D' + str(row)].alignment = c_c_alignment
            ws['D' + str(row)] = round(reporting_period_data['maximums'][i], 2) \
                if reporting_period_data['maximums'][i] is not None else ''
            ws['D' + str(row)].border = f_border
            ws['D' + str(row)].number_format = '0.00'

            ws['D' + str(row + 1)].font = name_font
            ws['D' + str(row + 1)].alignment = c_c_alignment
            ws['D' + str(row + 1)] = str(round(reporting_period_data['maximums_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['maximums_increment_rate'][i] is not None else '0.00%'
            ws['D' + str(row + 1)].border = f_border

            ws['E' + str(row)].font = name_font
            ws['E' + str(row)].alignment = c_c_alignment
            ws['E' + str(row)] = round(reporting_period_data['factors'][i], 2) \
                if reporting_period_data['factors'][i] is not None else ''
            ws['E' + str(row)].border = f_border
            ws['E' + str(row)].number_format = '0.00'

            ws['E' + str(row + 1)].font = name_font
            ws['E' + str(row + 1)].alignment = c_c_alignment
            ws['E' + str(row + 1)] = str(round(reporting_period_data['factors_increment_rate'][i] * 100, 2)) + "%" \
                if reporting_period_data['factors_increment_rate'][i] is not None else '0.00%'
            ws['E' + str(row + 1)].border = f_border

    ########################################################
    # Third: 详细数据
    # row_sat~ row_sat + 6*cal_len: line
    # row_da: table title
    # row_da + 1~: table_data
    ########################################################
    has_timestamps_flag = True
    if "timestamps" not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0:
        has_timestamps_flag = False

    if has_timestamps_flag:
        timestamps = reporting_period_data['timestamps'][0]
        names = reporting_period_data['names']
        ca_len = len(names)
        time_len = len(timestamps)
        # row_lines == the number of rows of lines
        row_lines = 6 * ca_len
        # row_sat == the number of rows of statistical analysis table
        row_sat = 9 + 2 * ca_len
        # row_da == the number of rows of Detailed data
        row_da = row_sat + row_lines + 1

        ws['B' + str(row_da)].font = title_font
        ws['B' + str(row_da)] = name + ' 详细数据'
        # table_title
        ws['B' + str(row_da + 1)].fill = table_fill
        ws['B' + str(row_da + 1)].font = name_font
        ws['B' + str(row_da + 1)].alignment = c_c_alignment
        ws['B' + str(row_da + 1)] = "日期时间"
        ws['B' + str(row_da + 1)].border = f_border

        for i in range(0, ca_len):
            col_average = chr(ord('C') + 2 * i)
            col_maximum = chr(ord('D') + 2 * i)

            ws[col_average + str(row_da + 1)].font = name_font
            ws[col_average + str(row_da + 1)].alignment = c_c_alignment
            ws[col_average + str(row_da + 1)] = names[
                i] + " 平均负荷(" + reporting_period_data['units'][i] + "/H)"
            ws[col_average + str(row_da + 1)].border = f_border

            ws[col_maximum + str(row_da + 1)].font = name_font
            ws[col_maximum + str(row_da + 1)].alignment = c_c_alignment
            ws[col_maximum + str(row_da + 1)] = names[
                i] + " 最大负荷(" + reporting_period_data['units'][i] + "/H)"
            ws[col_maximum + str(row_da + 1)].border = f_border
        # table_date
        for i in range(0, time_len):
            rows = i + row_da + 2

            ws['B' + str(rows)].font = name_font
            ws['B' + str(rows)].alignment = c_c_alignment
            ws['B' + str(rows)] = timestamps[i]
            ws['B' + str(rows)].border = f_border

            for index in range(0, ca_len):
                col_average = chr(ord('C') + 2 * index)
                col_maximum = chr(ord('D') + 2 * index)

                ws[col_average + str(rows)].font = name_font
                ws[col_average + str(rows)].alignment = c_c_alignment
                ws[col_average + str(rows)] = reporting_period_data['sub_averages'][index][i] \
                    if reporting_period_data['sub_maximums'][index] is not None else ''
                ws[col_average + str(rows)].number_format = '0.00'
                ws[col_average + str(rows)].border = f_border

                ws[col_maximum + str(rows)].font = name_font
                ws[col_maximum + str(rows)].alignment = c_c_alignment
                ws[col_maximum + str(rows)] = reporting_period_data['sub_maximums'][index][i] \
                    if reporting_period_data['sub_maximums'][index] is not None else ''
                ws[col_maximum + str(rows)].number_format = '0.00'
                ws[col_maximum + str(rows)].border = f_border
        current_row_number = row_da + 1 + time_len

        # ws['B' + str(current_row_number)].font = title_font
        # ws['B' + str(current_row_number)].alignment = c_c_alignment
        # ws['B' + str(current_row_number)].border = f_border
        # ws['B' + str(current_row_number)] = '小计'
        # LineChart
        for i in range(0, ca_len):
            # col = chr(ord('C') + i)
            # ws[col + str(current_row_number)].font = title_font
            # ws[col + str(current_row_number)].alignment = c_c_alignment
            # ws[col + str(current_row_number)].border = f_border
            # ws[col + str(current_row_number)] = round(reporting_period_data['subtotals'][i], 2)

            lc = LineChart()
            lc.title = "报告期 最大负荷"
            lc.style = 10
            lc.x_axis.majorTickMark = 'in'
            lc.y_axis.majorTickMark = 'in'
            lc.smooth = True
            lc.x_axis.crosses = 'min'
            lc.height = 8.25
            lc.width = 24
            lc.dLbls = DataLabelList()
            lc.dLbls.dLblPos = 't'
            lc.dLbls.showVal = True
            times = Reference(ws,
                              min_col=2,
                              min_row=row_da + 2,
                              max_row=row_da + 2 + time_len)
            lc_data = Reference(ws,
                                min_col=2 + 2 * (i + 1),
                                min_row=row_da + 1,
                                max_row=row_da + 1 + time_len)
            lc.add_data(lc_data, titles_from_data=True)
            lc.set_categories(times)
            ser = lc.series[0]
            ser.marker.symbol = "diamond"
            ser.marker.size = 5
            chart_col = 'B'
            chart_cell = str(row_sat + 6 * i)
            ws.add_chart(lc, chart_col + chart_cell)

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #36
0
            "max_col": len(group.columns),
            "max_row": len(group.index) + 1,
        })

wb = load_workbook(output_file)

for test_info in test_infos:
    sheet_name = test_info["sheet_name"]
    ws = wb[sheet_name]
    values = Reference(
        ws,
        min_col=3,
        min_row=1,
        max_col=test_info["max_col"],
        max_row=test_info["max_row"],
    )
    categories = Reference(ws,
                           min_col=2,
                           min_row=2,
                           max_col=2,
                           max_row=test_info["max_row"])
    chart = LineChart()
    chart.legend = None
    chart.title = sheet_name

    chart.add_data(values, titles_from_data=True)
    chart.set_categories(categories)

    ws.add_chart(chart, "B4")
wb.save(output_file)
Example #37
0
def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000')
                      )
    b_border = Border(
        bottom=Side(border_style='medium', color='00000000'),
    )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "difference_values" not in report['reporting_period'].keys() or \
            len(report['reporting_period']['difference_values']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename
    #################################################

    has_difference_values_data_flag = True
    if 'difference_values' not in report['reporting_period'].keys() or len(
            report['reporting_period']['difference_values']) == 0:
        has_difference_values_data_flag = False

    current_row_number = 6

    if has_difference_values_data_flag:
        reporting_period_data = report['reporting_period']
        category = report['meter']['energy_category_name']

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 报告期'

        current_row_number += 1

        ws.row_dimensions[current_row_number].height = 60

        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].border = f_border
        if not isinstance(category, list):
            ws['C' + str(current_row_number)].fill = table_fill
            ws['C' + str(current_row_number)].font = name_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = report['meter']['energy_category_name'] + " (" + report['meter'][
                'unit_of_measure'] + ")"

            current_row_number += 1

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = '总表消耗'

            ws['C' + str(current_row_number)].font = name_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = round(reporting_period_data['master_meter_consumption_in_category'], 2)

            current_row_number += 1

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = '分表消耗'

            ws['C' + str(current_row_number)].font = name_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = round(reporting_period_data['submeters_consumption_in_category'], 2)

            current_row_number += 1

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = '差值'

            ws['C' + str(current_row_number)].font = name_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = round(reporting_period_data['difference_in_category'], 2)

            current_row_number += 1

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = '差值百分比'

            ws['C' + str(current_row_number)].font = name_font
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = str(
                round(reporting_period_data['percentage_difference'] * 100, 2)) + '%'

            current_row_number += 2

            time = reporting_period_data['timestamps']
            parameters_names_len = len(report['parameters']['names'])
            parameters_data = report['parameters']
            parameters_parameters_datas_len = 0
            for i in range(0, parameters_names_len):
                if len(parameters_data['timestamps'][i]) == 0:
                    continue
                parameters_parameters_datas_len += 1
            has_time_data_flag = False
            if time is not None and len(time) > 0:
                has_time_data_flag = True

            if has_time_data_flag:

                ws['B' + str(current_row_number)].font = title_font
                ws['B' + str(current_row_number)] = name + ' 详细数据'

                current_row_number += 1
                chart_start_number = current_row_number
                current_row_number = current_row_number + 1 + len(category) * 6 + parameters_parameters_datas_len * 6
                table_start_number = current_row_number

                ws.row_dimensions[current_row_number].height = 60

                ws['B' + str(current_row_number)].fill = table_fill
                ws['B' + str(current_row_number)].font = title_font
                ws['B' + str(current_row_number)].border = f_border
                ws['B' + str(current_row_number)].alignment = c_c_alignment
                ws['B' + str(current_row_number)] = '日期时间'

                ws['C' + str(current_row_number)].fill = table_fill
                ws['C' + str(current_row_number)].font = title_font
                ws['C' + str(current_row_number)].border = f_border
                ws['C' + str(current_row_number)].alignment = c_c_alignment
                ws['C' + str(current_row_number)] = report['meter']['energy_category_name'] + " (" + report['meter'][
                    'unit_of_measure'] + ")"

                current_row_number += 1

                for i in range(0, len(time)):
                    ws['B' + str(current_row_number)].font = title_font
                    ws['B' + str(current_row_number)].border = f_border
                    ws['B' + str(current_row_number)].alignment = c_c_alignment
                    ws['B' + str(current_row_number)] = time[i]

                    ws['C' + str(current_row_number)].font = title_font
                    ws['C' + str(current_row_number)].border = f_border
                    ws['C' + str(current_row_number)].alignment = c_c_alignment
                    ws['C' + str(current_row_number)] = round(reporting_period_data['difference_values'][i], 2)

                    current_row_number += 1

                table_end_number = current_row_number - 1

                line = LineChart()
                line.title = '报告期差值 - ' + report['meter']['energy_category_name'] + " (" + report['meter'][
                    'unit_of_measure'] + ")"
                labels = Reference(ws, min_col=2, min_row=table_start_number + 1, max_row=table_end_number)
                line_data = Reference(ws, min_col=3, min_row=table_start_number, max_row=table_end_number)
                line.add_data(line_data, titles_from_data=True)
                line.set_categories(labels)
                line_data = line.series[0]
                line_data.marker.symbol = "circle"
                line_data.smooth = True
                line.x_axis.crosses = 'min'
                line.height = 8.25
                line.width = 24
                line.dLbls = DataLabelList()
                line.dLbls.dLblPos = 't'
                line.dLbls.showVal = True  # 数量显示
                ws.add_chart(line, "B" + str(chart_start_number))

                ws['B' + str(current_row_number)].font = title_font
                ws['B' + str(current_row_number)].border = f_border
                ws['B' + str(current_row_number)].alignment = c_c_alignment
                ws['B' + str(current_row_number)] = '总计'

                ws['C' + str(current_row_number)].font = title_font
                ws['C' + str(current_row_number)].border = f_border
                ws['C' + str(current_row_number)].alignment = c_c_alignment
                ws['C' + str(current_row_number)] = round(reporting_period_data['master_meter_consumption_in_category']
                                                          , 2)

        else:
            pass

    ##########################################
    has_parameters_names_and_timestamps_and_values_data = True
    # 12 is the starting line number of the last line chart in the report period
    category = report['meter']['energy_category_name']
    ca_len = len(category)
    time_len = len(report['reporting_period']['timestamps'])
    current_sheet_parameters_row_number = 14 + ca_len * 6
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']

        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 'B'

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].fill = table_fill
            parameters_ws[table_current_col_number + str(parameters_ws_current_row_number - 1)].border = f_border

            col = decimal_to_column(column_to_decimal(table_current_col_number) + 1)

            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = table_current_col_number

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = decimal_to_column(column_to_decimal(col) + 1)

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = decimal_to_column(column_to_decimal(table_current_col_number) + 3)

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
import random
from openpyxl import Workbook
from openpyxl.chart import LineChart, Reference
from openpyxl import load_workbook

workbook = workbook = load_workbook('line_chart.xlsx')
sheet = workbook.active
"""
1.create the chart obj
2.to the chart obj add the data to be displyed
3.add the chart obj to the sheet
"""
#create the chart obj
chart = LineChart()

#create the refernce to be added to the chart
data = Reference(worksheet=sheet, min_row=2, max_row=4, min_col=1, max_col=13)

#add the data to the cart
chart.add_data(data, from_rows=True, titles_from_data=True)

#add the chart to the sheet
sheet.add_chart(chart, "C6")

workbook.save("line_chart.xlsx")
Example #39
0
def generate_excel(report, name, reporting_start_datetime_local, reporting_end_datetime_local, period_type):

    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # for i in range(2, 11 + 1):
    #     ws.row_dimensions[i].height = 30
    #
    # for i in range(12, 43 + 1):
    #     ws.row_dimensions[i].height = 30

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000')
                      )
    b_border = Border(
        bottom=Side(border_style='medium', color='00000000'),
    )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)

    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename
    #################################################
    # First: 能耗分析
    # 6: title
    # 7: table title
    # 8~9 table_data
    #################################################
    has_energy_data_flag = True

    if "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
        has_energy_data_flag = False

    if has_energy_data_flag:
        ws['B6'].font = title_font
        ws['B6'] = name + '能耗分析'

        reporting_period_data = report['reporting_period']
        # print(reporting_period_data)
        category = report['meter']['energy_category_name']
        ca_len = len(category)

        ws.row_dimensions[7].height = 60

        ws['B7'].fill = table_fill
        ws['B7'].border = f_border

        ws['B8'].font = title_font
        ws['B8'].alignment = c_c_alignment
        ws['B8'] = '能耗'
        ws['B8'].border = f_border

        ws['B9'].font = title_font
        ws['B9'].alignment = c_c_alignment
        ws['B9'] = '环比'
        ws['B9'].border = f_border

        col = ''

        for i in range(0, ca_len):
            col = chr(ord('C') + i)
            row = '7'
            cell = col + row
            ws[col + '7'].fill = table_fill
            ws[col + '7'].font = name_font
            ws[col + '7'].alignment = c_c_alignment
            ws[col + '7'] = report['meter']['energy_category_name'] + " (" + report['meter']['unit_of_measure'] + ")"
            ws[col + '7'].border = f_border

            ws[col + '8'].font = name_font
            ws[col + '8'].alignment = c_c_alignment
            ws[col + '8'] = round(reporting_period_data['total_in_category'], 2)
            ws[col + '8'].border = f_border

            ws[col + '9'].font = name_font
            ws[col + '9'].alignment = c_c_alignment
            ws[col + '9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
                if reporting_period_data['increment_rate'] is not None else "-"
            ws[col + '9'].border = f_border

        # TCE TCO2E
        end_col = col
        # TCE
        tce_col = chr(ord(end_col) + 1)
        ws[tce_col + '7'].fill = table_fill
        ws[tce_col + '7'].font = name_font
        ws[tce_col + '7'].alignment = c_c_alignment
        ws[tce_col + '7'] = "吨标准煤 (TCE)"
        ws[tce_col + '7'].border = f_border

        ws[tce_col + '8'].font = name_font
        ws[tce_col + '8'].alignment = c_c_alignment
        ws[tce_col + '8'] = round(reporting_period_data['total_in_kgce'] / 1000, 2)
        ws[tce_col + '8'].border = f_border

        ws[tce_col + '9'].font = name_font
        ws[tce_col + '9'].alignment = c_c_alignment
        ws[tce_col + '9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['increment_rate'] is not None else "-"
        ws[tce_col + '9'].border = f_border

        # TCO2E
        tco2e_col = chr(ord(end_col) + 2)
        ws[tco2e_col + '7'].fill = table_fill
        ws[tco2e_col + '7'].font = name_font
        ws[tco2e_col + '7'].alignment = c_c_alignment
        ws[tco2e_col + '7'] = "吨二氧化碳排放 (TCO2E)"
        ws[tco2e_col + '7'].border = f_border

        ws[tco2e_col + '8'].font = name_font
        ws[tco2e_col + '8'].alignment = c_c_alignment
        ws[tco2e_col + '8'] = round(reporting_period_data['total_in_kgco2e'] / 1000, 2)
        ws[tco2e_col + '8'].border = f_border

        ws[tco2e_col + '9'].font = name_font
        ws[tco2e_col + '9'].alignment = c_c_alignment
        ws[tco2e_col + '9'] = str(round(reporting_period_data['increment_rate'] * 100, 2)) + "%" \
            if reporting_period_data['increment_rate'] is not None else "-"
        ws[tco2e_col + '9'].border = f_border
    else:
        for i in range(6, 9 + 1):
            ws.row_dimensions[i].height = 0.1
    #################################################
    # Second: 能耗详情
    # 11: title
    # 12 ~ 16: chart
    # 18: table title
    # 19~43: table_data
    #################################################
    has_energy_detail_flag = True
    reporting_period_data = report['reporting_period']
    times = reporting_period_data['timestamps']

    if "values" not in report['reporting_period'].keys() or len(report['reporting_period']['values']) == 0:
        has_energy_detail_flag = False

    if has_energy_detail_flag:
        reporting_period_data = report['reporting_period']
        category = report['meter']['energy_category_name']
        ca_len = len(category)
        parameters_names_len = len(report['parameters']['names'])
        parameters_data = report['parameters']
        parameters_parameters_datas_len = 0
        for i in range(0, parameters_names_len):
            if len(parameters_data['timestamps'][i]) == 0:
                continue
            parameters_parameters_datas_len += 1
        start_detail_data_row_num = 13 + (parameters_parameters_datas_len + ca_len) * 6
        ws['B11'].font = title_font
        ws['B11'] = name + '详细数据'

        ws.row_dimensions[start_detail_data_row_num].height = 60

        ws['B' + str(start_detail_data_row_num)].fill = table_fill
        ws['B' + str(start_detail_data_row_num)].font = title_font
        ws['B' + str(start_detail_data_row_num)].border = f_border
        ws['B' + str(start_detail_data_row_num)].alignment = c_c_alignment
        ws['B' + str(start_detail_data_row_num)] = '日期时间'
        time = times
        has_data = False
        max_row = 0
        if len(time) > 0:
            has_data = True
            max_row = start_detail_data_row_num + len(time)

        if has_data:
            for i in range(0, len(time)):
                col = 'B'
                row = str(start_detail_data_row_num + 1 + i)
                # col = chr(ord('B') + i)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = time[i]
                ws[col + row].border = f_border

            for i in range(0, ca_len):
                # 12 title
                col = chr(ord('C') + i)

                ws[col + str(start_detail_data_row_num)].fill = table_fill
                ws[col + str(start_detail_data_row_num)].font = title_font
                ws[col + str(start_detail_data_row_num)].alignment = c_c_alignment
                ws[col + str(start_detail_data_row_num)] = report['meter']['energy_category_name'] + \
                    " (" + report['meter']['unit_of_measure'] + ")"
                ws[col + str(start_detail_data_row_num)].border = f_border

                # 13 data
                time = times
                time_len = len(time)

                for j in range(0, time_len):
                    row = str(start_detail_data_row_num + 1 + j)
                    # col = chr(ord('B') + i)
                    ws[col + row].font = title_font
                    ws[col + row].alignment = c_c_alignment
                    ws[col + row] = round(reporting_period_data['values'][j], 2)
                    ws[col + row].border = f_border
            # line
            # 13~: line
            line = LineChart()
            line.title = '报告期消耗 - ' + report['meter']['energy_category_name'] + \
                " (" + report['meter']['unit_of_measure'] + ")"
            labels = Reference(ws, min_col=2, min_row=start_detail_data_row_num + 1, max_row=max_row)
            bar_data = Reference(ws, min_col=3, min_row=start_detail_data_row_num, max_row=max_row)
            line.add_data(bar_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            # line_data.smooth = True
            line.height = 8.25  # cm 1.05*5 1.05cm = 30 pt
            line.width = 24
            # pie.title = "Pies sold by category"
            line.dLbls = DataLabelList()
            # line.dLbls.showCatName = True  # 标签显示
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = True  # 数量显示
            line.dLbls.showPercent = False  # 百分比显示
            # s1 = CharacterProperties(sz=1800)     # 图表中字体大小 *100
            ws.add_chart(line, "B12")

            col = 'B'
            row = str(start_detail_data_row_num + 1 + len(time))

            ws[col + row].font = title_font
            ws[col + row].alignment = c_c_alignment
            ws[col + row] = '总计'
            ws[col + row].border = f_border

            for i in range(0, ca_len):
                col = chr(ord(col) + 1)
                ws[col + row].font = title_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = round(reporting_period_data['total_in_category'], 2)
                ws[col + row].border = f_border

    else:
        for i in range(11, 43 + 1):
            ws.row_dimensions[i].height = 0.0

    ##########################################
    has_parameters_names_and_timestamps_and_values_data = True
    # 12 is the starting line number of the last line chart in the report period
    category = report['meter']['energy_category_name']
    time_len = len(reporting_period_data['timestamps'])
    ca_len = len(category)
    current_sheet_parameters_row_number = 12 + ca_len * 6
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ###############################
        # new worksheet
        ###############################

        parameters_data = report['parameters']

        parameters_names_len = len(parameters_data['names'])

        parameters_ws = wb.create_sheet('相关参数')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        img.width = img.width * 0.85
        img.height = img.height * 0.85
        # img = Image("myems.png")
        parameters_ws.add_image(img, 'B1')

        # Title
        parameters_ws.row_dimensions[3].height = 60

        parameters_ws['B3'].font = name_font
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'].font = name_font
        parameters_ws['C3'] = name

        parameters_ws['D3'].font = name_font
        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'].font = name_font
        parameters_ws['E3'] = period_type

        parameters_ws['F3'].font = name_font
        parameters_ws['F3'].alignment = b_r_alignment
        parameters_ws['F3'] = 'Date:'
        parameters_ws['G3'].border = b_border
        parameters_ws['G3'].alignment = b_c_alignment
        parameters_ws['G3'].font = name_font
        parameters_ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
        parameters_ws.merge_cells("G3:H3")

        parameters_ws_current_row_number = 6

        parameters_ws['B' + str(parameters_ws_current_row_number)].font = title_font
        parameters_ws['B' + str(parameters_ws_current_row_number)] = name + ' 相关参数'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 2

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            col = format_cell.get_column_letter(table_current_col_number)

            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border

            col = format_cell.get_column_letter(table_current_col_number + 1)

            parameters_ws[col + str(parameters_ws_current_row_number - 1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number - 1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number - 1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = format_cell.get_column_letter(table_current_col_number)

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = format_cell.get_column_letter(table_current_col_number + 1)

                parameters_ws[col + str(table_current_row_number)].border = f_border
                parameters_ws[col + str(table_current_row_number)].font = title_font
                parameters_ws[col + str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = table_current_col_number + 3

        ########################################################
        # parameters chart and parameters table
        ########################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(current_sheet_parameters_row_number)] = name + ' 相关参数'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = '相关参数 - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws, min_col=labels_col, min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
            line_data = Reference(parameters_ws, min_col=data_col, min_row=parameters_table_start_row_number,
                                  max_row=(len(parameters_data['timestamps'][i]) + parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #40
0
        else:
            torow = r
        if ws.rows[torow][c].value is not None:
            _ = ws2.cell(column=c+1, row=r-4, value=ws.rows[torow][c].value)
        else:
            _ = ws2.cell(column=c+1, row=r-4, value=0)


#画折线图
from openpyxl.chart import (
    LineChart,
    Reference,
    PieChart,
)

c1 = LineChart()
c1.title = "2015年%s"%ws.rows[5][0].value
#c1.style = 13
#c1.y_axis.title = 'Size'
#c1.x_axis.title = 'Test Number'

data = Reference(ws2, min_col=1, min_row=2, max_col=13, max_row=6)
#print data
c1.add_data(data, titles_from_data=True,from_rows=True)

ws2.add_chart(c1, "A20")

#画饼图,先新建一个表单

ws3 = wb2.create_sheet()
Example #41
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):
    wb = Workbook()
    ws = wb.active
    ws.title = "ShopFloorEnergyItem"

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Arial', size=15, bold=True)
    title_font = Font(name='Arial', size=15, bold=True)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    # Img
    img = Image("excelexporters/myems.png")
    ws.add_image(img, 'A1')

    # Title
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'] = name

    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'] = period_type

    ws['B4'].alignment = b_r_alignment
    ws['B4'] = 'Reporting Start Datetime:'
    ws['C4'].border = b_border
    ws['C4'].alignment = b_c_alignment
    ws['C4'] = reporting_start_datetime_local

    ws['D4'].alignment = b_r_alignment
    ws['D4'] = 'Reporting End Datetime:'
    ws['E4'].border = b_border
    ws['E4'].alignment = b_c_alignment
    ws['E4'] = reporting_end_datetime_local

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    ####################################################################################################################

    current_row_number = 6

    reporting_period_data = report['reporting_period']

    has_names_data_flag = True

    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_names_data_flag = False

    if has_names_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(
            current_row_number)] = name + ' ' + 'Reporting Period Consumption'

        current_row_number += 1

        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[current_row_number].height = 60
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].border = f_border

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = \
                reporting_period_data['names'][i] + " " + reporting_period_data['energy_category_names'][i] + \
                " (" + reporting_period_data['units'][i] + ")"

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '消耗'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(
                reporting_period_data['subtotals'][i], 2)

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = 'Per Unit Area'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(
                reporting_period_data['subtotals_per_unit_area'][i], 2)

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = 'Increment Rate'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = str(
                round(reporting_period_data['increment_rates'][i] * 100, 2)) + '%' \
                if reporting_period_data['increment_rates'][i] is not None else '-'

            col = chr(ord(col) + 1)

        current_row_number += 2

        category_dict = group_by_category(
            reporting_period_data['energy_category_names'])

        for category_dict_name, category_dict_values in category_dict.items():

            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)] = name + ' ' + category_dict_name + ' ' + \
                '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item'

            current_row_number += 1
            table_start_row_number = current_row_number

            ws['B' + str(current_row_number)].fill = table_fill
            ws['B' + str(current_row_number)].border = f_border

            ws['C' + str(current_row_number)].font = name_font
            ws['C' + str(current_row_number)].fill = table_fill
            ws['C' + str(current_row_number)].alignment = c_c_alignment
            ws['C' + str(current_row_number)].border = f_border
            ws['C' + str(current_row_number)] = '消耗'

            current_row_number += 1

            for i in category_dict_values:
                ws['B' + str(current_row_number)].font = title_font
                ws['B' + str(current_row_number)].alignment = c_c_alignment
                ws['B' + str(current_row_number)].border = f_border
                ws['B' + str(current_row_number)] = \
                    reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
                ws['C' + str(current_row_number)].font = name_font
                ws['C' + str(current_row_number)].alignment = c_c_alignment
                ws['C' + str(current_row_number)].border = f_border
                ws['C' + str(current_row_number)] = round(
                    reporting_period_data['subtotals'][i], 3)

                current_row_number += 1

            table_end_row_number = current_row_number - 1

            pie = PieChart()
            pie.title = name + ' ' + category_dict_name + ' ' + \
                '(' + reporting_period_data['units'][category_dict_values[0]] + ') by Energy Item'
            labels = Reference(ws,
                               min_col=2,
                               min_row=table_start_row_number + 1,
                               max_row=table_end_row_number)
            pie_data = Reference(ws,
                                 min_col=3,
                                 min_row=table_start_row_number,
                                 max_row=table_end_row_number)
            pie.add_data(pie_data, titles_from_data=True)
            pie.set_categories(labels)
            pie.height = 6.6
            pie.width = 9
            s1 = pie.series[0]
            s1.dLbls = DataLabelList()
            s1.dLbls.showCatName = False
            s1.dLbls.showVal = True
            s1.dLbls.showPercent = True
            ws.add_chart(pie, 'D' + str(table_start_row_number))

            if len(category_dict_values) < 4:
                current_row_number = current_row_number - len(
                    category_dict_values) + 4

            current_row_number += 1

    ####################################################################################################################

    has_values_data = True
    has_timestamps_data = True

    if 'values' not in reporting_period_data.keys() or \
            reporting_period_data['values'] is None or \
            len(reporting_period_data['values']) == 0:
        has_values_data = False

    if 'timestamps' not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0 or \
            len(reporting_period_data['timestamps'][0]) == 0:
        has_timestamps_data = False

    chart_start_row_number = current_row_number + 1

    if has_values_data and has_timestamps_data:
        ca_len = len(reporting_period_data['names'])
        time = reporting_period_data['timestamps'][0]
        parameters_names_len = len(report['parameters']['names'])
        parameters_parameters_datas_len = 0

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' ' + 'Detailed Data'

        for i in range(0, parameters_names_len):
            if len(report['parameters']['timestamps'][i]) == 0:
                continue
            parameters_parameters_datas_len += 1
        current_row_number = current_row_number + (
            ca_len + parameters_parameters_datas_len) * 6 + 2
        table_start_row_number = current_row_number

        ws.row_dimensions[current_row_number].height = 60
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = 'Datetime'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = title_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = \
                reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            col = chr(ord(col) + 1)

        current_row_number += 1

        for i in range(0, len(time)):
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = time[i]

            col = 'C'
            for j in range(0, ca_len):
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)].border = f_border
                ws[col + str(current_row_number)] = round(reporting_period_data['values'][j][i], 2) \
                    if reporting_period_data['values'][j][i] is not None else 0.00
                col = chr(ord(col) + 1)

            current_row_number += 1

        table_end_row_number = current_row_number - 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = 'Subtotal'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = title_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(
                reporting_period_data['subtotals'][i], 2)
            col = chr(ord(col) + 1)

        current_row_number += 2

        format_time_width_number = 1.0
        min_len_number = 1.0
        min_width_number = 11.0

        if period_type == 'hourly':
            format_time_width_number = 4.0
            min_len_number = 2
            min_width_number = 12.0
        elif period_type == 'daily':
            format_time_width_number = 2.5
            min_len_number = 4
            min_width_number = 14.0
        elif period_type == 'monthly':
            format_time_width_number = 2.1
            min_len_number = 4
            min_width_number = 12.4
        elif period_type == 'yearly':
            format_time_width_number = 1.5
            min_len_number = 5
            min_width_number = 11.5

        for i in range(0, ca_len):
            line = LineChart()
            line.title = 'Reporting Period Consumption - ' + \
                         reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            labels = Reference(ws,
                               min_col=2,
                               min_row=table_start_row_number + 1,
                               max_row=table_end_row_number)
            line_data = Reference(ws,
                                  min_col=3 + i,
                                  min_row=table_start_row_number,
                                  max_row=table_end_row_number)
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = format_time_width_number * len(time) if len(
                time) > min_len_number else min_width_number
            if line.width > 24:
                line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = True
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number + 6 * i)
            ws.add_chart(line, chart_cell)

    ####################################################################################################################
    has_parameters_names_and_timestamps_and_values_data = True

    ca_len = len(report['reporting_period']['names'])
    current_sheet_parameters_row_number = chart_start_row_number + ca_len * 6
    if 'parameters' not in report.keys() or \
            report['parameters'] is None or \
            'names' not in report['parameters'].keys() or \
            report['parameters']['names'] is None or \
            len(report['parameters']['names']) == 0 or \
            'timestamps' not in report['parameters'].keys() or \
            report['parameters']['timestamps'] is None or \
            len(report['parameters']['timestamps']) == 0 or \
            'values' not in report['parameters'].keys() or \
            report['parameters']['values'] is None or \
            len(report['parameters']['values']) == 0 or \
            timestamps_data_all_equal_0(report['parameters']['timestamps']):
        has_parameters_names_and_timestamps_and_values_data = False
    if has_parameters_names_and_timestamps_and_values_data:

        ################################################################################################################
        # new worksheet
        ################################################################################################################

        parameters_data = report['parameters']

        parameters_names_len = len(parameters_data['names'])

        file_name = (re.sub(r'[^A-Z]', '', ws.title)) + '_'
        parameters_ws = wb.create_sheet(file_name + 'Parameters')

        parameters_timestamps_data_max_len = \
            get_parameters_timestamps_lists_max_len(list(parameters_data['timestamps']))

        # Row height
        parameters_ws.row_dimensions[1].height = 102
        for i in range(2, 7 + 1):
            parameters_ws.row_dimensions[i].height = 42

        for i in range(8, parameters_timestamps_data_max_len + 10):
            parameters_ws.row_dimensions[i].height = 60

        # Col width
        parameters_ws.column_dimensions['A'].width = 1.5

        parameters_ws.column_dimensions['B'].width = 25.0

        for i in range(3, 12 + parameters_names_len * 3):
            parameters_ws.column_dimensions[format_cell.get_column_letter(
                i)].width = 15.0

        # Img
        img = Image("excelexporters/myems.png")
        parameters_ws.add_image(img, 'A1')

        # Title
        parameters_ws['B3'].alignment = b_r_alignment
        parameters_ws['B3'] = 'Name:'
        parameters_ws['C3'].border = b_border
        parameters_ws['C3'].alignment = b_c_alignment
        parameters_ws['C3'] = name

        parameters_ws['D3'].alignment = b_r_alignment
        parameters_ws['D3'] = 'Period:'
        parameters_ws['E3'].border = b_border
        parameters_ws['E3'].alignment = b_c_alignment
        parameters_ws['E3'] = period_type

        parameters_ws['B4'].alignment = b_r_alignment
        parameters_ws['B4'] = 'Reporting Start Datetime:'
        parameters_ws['C4'].border = b_border
        parameters_ws['C4'].alignment = b_c_alignment
        parameters_ws['C4'] = reporting_start_datetime_local

        parameters_ws['D4'].alignment = b_r_alignment
        parameters_ws['D4'] = 'Reporting End Datetime:'
        parameters_ws['E4'].border = b_border
        parameters_ws['E4'].alignment = b_c_alignment
        parameters_ws['E4'] = reporting_end_datetime_local

        parameters_ws_current_row_number = 6

        parameters_ws['B' +
                      str(parameters_ws_current_row_number)].font = title_font
        parameters_ws[
            'B' +
            str(parameters_ws_current_row_number)] = name + ' ' + 'Parameters'

        parameters_ws_current_row_number += 1

        parameters_table_start_row_number = parameters_ws_current_row_number

        parameters_ws.row_dimensions[
            parameters_ws_current_row_number].height = 80

        parameters_ws_current_row_number += 1

        table_current_col_number = 2

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            col = format_cell.get_column_letter(table_current_col_number)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border

            col = format_cell.get_column_letter(table_current_col_number + 1)

            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].fill = table_fill
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].border = f_border
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].font = name_font
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)].alignment = c_c_alignment
            parameters_ws[col + str(parameters_ws_current_row_number -
                                    1)] = parameters_data['names'][i]

            table_current_row_number = parameters_ws_current_row_number

            for j, value in enumerate(list(parameters_data['timestamps'][i])):
                col = format_cell.get_column_letter(table_current_col_number)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = value

                col = format_cell.get_column_letter(table_current_col_number +
                                                    1)

                parameters_ws[col +
                              str(table_current_row_number)].border = f_border
                parameters_ws[col +
                              str(table_current_row_number)].font = title_font
                parameters_ws[
                    col +
                    str(table_current_row_number)].alignment = c_c_alignment
                parameters_ws[col + str(table_current_row_number)] = round(
                    parameters_data['values'][i][j], 2)

                table_current_row_number += 1

            table_current_col_number = table_current_col_number + 3

        ################################################################################################################
        # parameters chart and parameters table
        ################################################################################################################

        ws['B' + str(current_sheet_parameters_row_number)].font = title_font
        ws['B' + str(
            current_sheet_parameters_row_number)] = name + ' ' + 'Parameters'

        current_sheet_parameters_row_number += 1

        chart_start_row_number = current_sheet_parameters_row_number

        col_index = 0

        for i in range(0, parameters_names_len):

            if len(parameters_data['timestamps'][i]) == 0:
                continue

            line = LineChart()
            data_col = 3 + col_index * 3
            labels_col = 2 + col_index * 3
            col_index += 1
            line.title = 'Parameters - ' + \
                         parameters_ws.cell(row=parameters_table_start_row_number, column=data_col).value
            labels = Reference(parameters_ws,
                               min_col=labels_col,
                               min_row=parameters_table_start_row_number + 1,
                               max_row=(len(parameters_data['timestamps'][i]) +
                                        parameters_table_start_row_number))
            line_data = Reference(
                parameters_ws,
                min_col=data_col,
                min_row=parameters_table_start_row_number,
                max_row=(len(parameters_data['timestamps'][i]) +
                         parameters_table_start_row_number))
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = False
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

        current_sheet_parameters_row_number = chart_start_row_number

        current_sheet_parameters_row_number += 1

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #42
0
wb = Workbook()
ws = wb.active
rows = [
    ('Sample', ),
    (1, ),
    (2, ),
    (3, ),
    (2, ),
    (3, ),
    (3, ),
    (1, ),
    (2, ),
]
for r in rows:
    ws.append(r)
c = LineChart()
data = Reference(ws, min_col=1, min_row=1, max_row=8)
c.add_data(data, titles_from_data=True)
c.title = 'Chart with patterns'

# set a pattern for the whole series
series = c.series[0]
fill = PatternFillProperties(prst='pct5')
fill.foreground = ColorChoice(prstClr='red')
fill.background = ColorChoice(prstClr='blue')
series.graphicalProperties.pattFill = fill

# set a pattern for a 6th data point (0-indexed)
pt = DataPoint(idx=5)
pt.graphicalProperties.pattFill = PatternFillProperties(prst='ltHorz')
series.dPt.append(pt)
Example #43
0
    [date(2015, 9, 1), 40, 30, 25],
    [date(2015, 9, 2), 40, 25, 30],
    [date(2015, 9, 3), 50, 30, 45],
    [date(2015, 9, 4), 30, 25, 40],
    [date(2015, 9, 5), 25, 35, 30],
    [date(2015, 9, 6), 20, 40, 35],
    ["Time", "jitter", "rtt", "loss"],
    ["09:25:35.584", 10, 50, 0],
    ["09:26:35.584", 20, 55, 10],
    ["09:27:35.584", 30, 60, 20],
]

for row in rows:
    ws.append(row)

c1 = LineChart()
c1.title = "Line Chart"
c1.style = 13
c1.y_axis.title = 'Size'
c1.x_axis.title = 'Test Number'

data = Reference(ws, min_col=2, min_row=1, max_col=4, max_row=7)
c1.add_data(data, titles_from_data=True)

# Style the lines
s1 = c1.series[0]
s1.marker.symbol = "triangle"
s1.marker.graphicalProperties.solidFill = "FF0000"  # Marker filling
s1.marker.graphicalProperties.line.solidFill = "FF0000"  # Marker outline

s1.graphicalProperties.line.noFill = True
            ws_list = cwb.get_sheet_names()
            for dws in ws_list:
                cws = cwb.get_sheet_by_name(dws)
                col_max = cws.max_column
                row_max = int(cws.max_row)
                mm_cs = cwb.create_chartsheet()
                mm_cs.title = "Chart_" + dws + "_MM"

                DT_col = int(col_max) - 13
                AC_col = int(col_max) - 12

                timings = Reference(cws, min_col=2, min_row=5, max_row=row_max)

                mm_r_ave = Reference(cws, min_col=DT_col, min_row=5, max_row=row_max)
                mm_c_ave = Reference(cws, min_col=AC_col, min_row=5, max_row=row_max)
                mm_chart = LineChart()
                mm_r_ave_ser = Series(mm_r_ave, title="Dial Testing Score")
                mm_c_ave_ser = Series(mm_c_ave, title="Mean Score")
                mm_chart.append(mm_r_ave_ser)
                mm_chart.append(mm_c_ave_ser)
                mm_chart.set_categories(timings)
                mm_cs.add_chart(mm_chart)

                gender_cs = cwb.create_chartsheet()
                gender_cs.title = "Chart_" + dws + "_SEX"
                male_r_col = int(col_max) - 11
                male_ave = int(col_max) - 10
                female_r_col = int(col_max) - 9
                female_ave = int(col_max) - 8
                gender_male_r_ave = Reference(cws, min_col=male_r_col, min_row=5, max_row=row_max)
                gender_female_r_ave = Reference(cws, min_col=female_r_col, min_row=5, max_row=row_max)
Example #45
0
        ws3.cell('A3').value = "Input Bandwidth"
        for c,n in zip(ws2.range("B2:M2")[0], simThroughput):
            c.value = n
            c.style.font.bold = True
    elif (bwLatency == 0):
        ws3.cell('A3').value = "Packet Size"
        for c,n in zip(ws2.range("B2:M2")[0], packetSizes):
            c.value = n
            c.style.font.bold = True
    ws3.cell('A3').style.font.bold = True
    for c, n in zip(ws3.range("B4:M4")[0], packetsDropped):
        c.value = n

    wb.save("emmaResults.xlsx")
    # Throughput and mem. efficiency charts
    throughputChart = LineChart()
    throughputChart.show_legend = False
    if(bwLatency == 1): throughputChart.x_axis.title = "No. of Flows"
    elif(bwLatency == 1): throughputChart.x_axis.title = "Input Throughput (in Gbps)"
    elif(bwLatency == 0): throughputChart.x_axis.title = "Packet Size (in Bytes)"
    throughputChart.y_axis.title = "Mem. Throughput (in Gbps)"
    throughputChart.add_serie(Serie(Reference(ws1, (2, 2), (2, 2 + counter)), labels=(Reference(ws1, (1, 1), (1, counter)))))
    ws1.add_chart(throughputChart)
    memEfficienyChart = LineChart()
    memEfficienyChart.y_axis.min = 0
    memEfficienyChart.y_axis.max = 100
    memEfficienyChart.add_serie(Serie(Reference(ws1, (3, 2), (3, 2 + counter)), labels=(Reference(ws1, (1, 1), (1, counter)))))
    memEfficienyChart.show_legend = False
    memEfficienyChart.y_axis.title = "Mem. Efficiency (in % of clock cycles used)"
    if(bwLatency == 2): memEfficienyChart.x_axis_title = "No. of Flows"
    elif(bwLatency == 1): memEfficienyChart.x_axis.title = "Input Throughput (in Gbps)"
Example #46
0
def draw_pic(wb, excel_filename, rain, temp, humi, wind, rain_use, temp_use,
             humi_use, wind_use, time_range):
    ws3 = wb.create_sheet("製圖")
    rows = [time_range]
    for row in list(zip(*rows)):
        ws3.append(row)
    dates = Reference(ws3, min_col=1, min_row=1, max_row=24)
    ##############################################
    rain.insert(0, '預報降雨')
    rain_use.insert(0, '觀測降雨')
    rows = [rain, rain_use]

    for row in list(zip(*rows)):
        ws3.append(row)

    chart_rain = LineChart()
    chart_rain.title = "降雨"
    chart_rain.style = 2
    chart_rain.y_axis.title = 'mm'
    chart_rain.x_axis.title = '預報時間'

    data = Reference(ws3, min_col=1, min_row=25, max_row=49, max_col=2)
    chart_rain.add_data(data, titles_from_data=True)
    chart_rain.set_categories(dates)
    ##############################################
    temp.insert(0, '預報溫度')
    temp_use.insert(0, '觀測溫度')
    rows = [temp, temp_use]

    for row in list(zip(*rows)):
        ws3.append(row)

    chart_temp = LineChart()
    chart_temp.title = "氣溫"
    chart_temp.style = 2
    chart_temp.y_axis.title = '℃'
    chart_temp.x_axis.title = '預報時間'

    data = Reference(ws3, min_col=1, min_row=50, max_row=74, max_col=2)
    chart_temp.add_data(data, titles_from_data=True)
    chart_temp.set_categories(dates)
    ##############################################
    humi.insert(0, '預報濕度')
    humi_use.insert(0, '觀測濕度')
    rows = [humi, humi_use]

    for row in list(zip(*rows)):
        ws3.append(row)

    chart_humi = LineChart()
    chart_humi.title = "濕度"
    chart_humi.style = 2
    chart_humi.y_axis.title = '%'
    chart_humi.x_axis.title = '預報時間'

    data = Reference(ws3, min_col=1, min_row=75, max_row=99, max_col=2)
    chart_humi.add_data(data, titles_from_data=True)
    chart_humi.set_categories(dates)
    ##############################################
    wind.insert(0, '預報風速')
    wind_use.insert(0, '觀測風速')
    rows = [wind, wind_use]

    for row in list(zip(*rows)):
        ws3.append(row)

    chart_wind = LineChart()
    chart_wind.title = "風速"
    chart_wind.style = 2
    chart_wind.y_axis.title = 'm/s'
    chart_wind.x_axis.title = '預報時間'

    data = Reference(ws3, min_col=1, min_row=100, max_row=124, max_col=2)
    chart_wind.add_data(data, titles_from_data=True)
    chart_wind.set_categories(dates)
    ##############################################
    ws3.add_chart(chart_rain, "C1")
    ws3.add_chart(chart_temp, "C14")
    ws3.add_chart(chart_humi, "C27")
    ws3.add_chart(chart_wind, "C40")
    wb.save(excel_filename)
Example #47
0
    ['Humans', 10, 40, 50, 20, 10, 50],
]

for row in rows:
    ws.append(row)

c1 = BarChart()
v1 = Reference(ws, min_col=1, min_row=1, max_col=7)
c1.add_data(v1, titles_from_data=True, from_rows=True)

c1.x_axis.title = 'Days'
c1.y_axis.title = 'Aliens'
c1.y_axis.majorGridlines = None
c1.title = 'Survey results'


# Create a second chart
c2 = LineChart()
v2 = Reference(ws, min_col=1, min_row=2, max_col=7)
c2.add_data(v2, titles_from_data=True, from_rows=True)
c2.y_axis.axId = 200
c2.y_axis.title = "Humans"

# Display y-axis of the second chart on the right by setting it to cross the x-axis at its maximum
c1.y_axis.crosses = "max"
c1 += c2

ws.add_chart(c1, "D4")

wb.save("secondary.xlsx")
    products.append(product)

workbook = Workbook()
sheet = workbook.active

# Append column names first
sheet.append([
    "Product ID", "Product Name", "Month 1", "Month 2", "Month 3", "Month 4",
    "Month 5"
])

# Append the data
for product in products:
    data = [product.id, product.name]
    for sale in product.sales:
        data.append(sale.quantity)
    sheet.append(data)

chart = LineChart()
data = Reference(worksheet=sheet, min_row=2, max_row=6, min_col=2, max_col=7)

chart.add_data(data, titles_from_data=True, from_rows=True)
sheet.add_chart(chart, "B8")

cats = Reference(worksheet=sheet, min_row=1, max_row=1, min_col=3, max_col=7)
chart.set_categories(cats)

chart.x_axis.title = "Months"
chart.y_axis.title = "Sales (per unit)"

workbook.save(filename="oop_sample.xlsx")
Example #49
0
def generate_excel(report, name, reporting_start_datetime_local,
                   reporting_end_datetime_local, period_type):
    wb = Workbook()
    ws = wb.active

    # Row height
    ws.row_dimensions[1].height = 102
    for i in range(2, 2000 + 1):
        ws.row_dimensions[i].height = 42

    # Col width
    ws.column_dimensions['A'].width = 1.5

    ws.column_dimensions['B'].width = 25.0

    for i in range(ord('C'), ord('L')):
        ws.column_dimensions[chr(i)].width = 15.0

    # Font
    name_font = Font(name='Constantia', size=15, bold=True)
    title_font = Font(name='宋体', size=15, bold=True)
    data_font = Font(name='Franklin Gothic Book', size=11)

    table_fill = PatternFill(fill_type='solid', fgColor='1F497D')
    f_border = Border(left=Side(border_style='medium', color='00000000'),
                      right=Side(border_style='medium', color='00000000'),
                      bottom=Side(border_style='medium', color='00000000'),
                      top=Side(border_style='medium', color='00000000'))
    b_border = Border(bottom=Side(border_style='medium', color='00000000'), )

    b_c_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_c_alignment = Alignment(vertical='center',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    b_r_alignment = Alignment(vertical='bottom',
                              horizontal='right',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    c_r_alignment = Alignment(vertical='bottom',
                              horizontal='center',
                              text_rotation=0,
                              wrap_text=True,
                              shrink_to_fit=False,
                              indent=0)
    # Img
    img = Image("excelexporters/myems.png")
    img.width = img.width * 0.85
    img.height = img.height * 0.85
    # img = Image("myems.png")
    ws.add_image(img, 'B1')

    # Title
    ws.row_dimensions[3].height = 60

    ws['B3'].font = name_font
    ws['B3'].alignment = b_r_alignment
    ws['B3'] = 'Name:'
    ws['C3'].border = b_border
    ws['C3'].alignment = b_c_alignment
    ws['C3'].font = name_font
    ws['C3'] = name

    ws['D3'].font = name_font
    ws['D3'].alignment = b_r_alignment
    ws['D3'] = 'Period:'
    ws['E3'].border = b_border
    ws['E3'].alignment = b_c_alignment
    ws['E3'].font = name_font
    ws['E3'] = period_type

    ws['F3'].font = name_font
    ws['F3'].alignment = b_r_alignment
    ws['F3'] = 'Date:'
    ws['G3'].border = b_border
    ws['G3'].alignment = b_c_alignment
    ws['G3'].font = name_font
    ws['G3'] = reporting_start_datetime_local + "__" + reporting_end_datetime_local
    ws.merge_cells("G3:H3")

    if "reporting_period" not in report.keys() or \
            "names" not in report['reporting_period'].keys() or len(report['reporting_period']['names']) == 0:
        filename = str(uuid.uuid4()) + '.xlsx'
        wb.save(filename)

        return filename

    ##################################

    current_row_number = 6

    reporting_period_data = report['reporting_period']

    has_names_data_flag = True

    if "names" not in reporting_period_data.keys() or \
            reporting_period_data['names'] is None or \
            len(reporting_period_data['names']) == 0:
        has_names_data_flag = False

    if has_names_data_flag:
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 报告期产出'

        current_row_number += 1

        category = reporting_period_data['names']
        ca_len = len(category)

        ws.row_dimensions[current_row_number].height = 60
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].border = f_border

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = \
                reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '产出'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(
                reporting_period_data['subtotals'][i], 2)

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '单位面积值'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(
                reporting_period_data['subtotals_per_unit_area'][i], 2)

            col = chr(ord(col) + 1)

        current_row_number += 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '环比'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = name_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = str(
                round(reporting_period_data['increment_rates'][i] * 100, 2)) + '%' \
                if reporting_period_data['increment_rates'][i] is not None else '-'

            col = chr(ord(col) + 1)

        current_row_number += 2

    #######################

    has_values_data = True
    has_timestamps_data = True

    if 'values' not in reporting_period_data.keys() or \
            reporting_period_data['values'] is None or \
            len(reporting_period_data['values']) == 0:
        has_values_data = False

    if 'timestamps' not in reporting_period_data.keys() or \
            reporting_period_data['timestamps'] is None or \
            len(reporting_period_data['timestamps']) == 0 or \
            len(reporting_period_data['timestamps'][0]) == 0:
        has_timestamps_data = False

    if has_values_data and has_timestamps_data:
        ca_len = len(reporting_period_data['names'])
        time = reporting_period_data['timestamps'][0]

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 详细数据'

        current_row_number += 1

        chart_start_row_number = current_row_number

        current_row_number += ca_len * 6
        table_start_row_number = current_row_number

        ws.row_dimensions[current_row_number].height = 60
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '日期时间'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].fill = table_fill
            ws[col + str(current_row_number)].font = title_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = \
                reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            col = chr(ord(col) + 1)

        current_row_number += 1

        for i in range(0, len(time)):
            ws['B' + str(current_row_number)].font = title_font
            ws['B' + str(current_row_number)].alignment = c_c_alignment
            ws['B' + str(current_row_number)].border = f_border
            ws['B' + str(current_row_number)] = time[i]

            col = 'C'
            for j in range(0, ca_len):
                ws[col + str(current_row_number)].font = title_font
                ws[col + str(current_row_number)].alignment = c_c_alignment
                ws[col + str(current_row_number)].border = f_border
                ws[col + str(current_row_number)] = round(reporting_period_data['values'][j][i], 2) \
                    if reporting_period_data['values'][j][i] is not None else 0.00
                col = chr(ord(col) + 1)

            current_row_number += 1

        table_end_row_number = current_row_number - 1

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)].alignment = c_c_alignment
        ws['B' + str(current_row_number)].border = f_border
        ws['B' + str(current_row_number)] = '小计'

        col = 'C'

        for i in range(0, ca_len):
            ws[col + str(current_row_number)].font = title_font
            ws[col + str(current_row_number)].alignment = c_c_alignment
            ws[col + str(current_row_number)].border = f_border
            ws[col + str(current_row_number)] = round(
                reporting_period_data['subtotals'][i], 2)
            col = chr(ord(col) + 1)

        current_row_number += 2

        format_time_width_number = 1.0
        min_len_number = 1.0
        min_width_number = 11.0  # format_time_width_number * min_len_number + 4 and min_width_number > 11.0

        if period_type == 'hourly':
            format_time_width_number = 4.0
            min_len_number = 2
            min_width_number = 12.0
        elif period_type == 'daily':
            format_time_width_number = 2.5
            min_len_number = 4
            min_width_number = 14.0
        elif period_type == 'monthly':
            format_time_width_number = 2.1
            min_len_number = 4
            min_width_number = 12.4
        elif period_type == 'yearly':
            format_time_width_number = 1.5
            min_len_number = 5
            min_width_number = 11.5

        for i in range(0, ca_len):
            line = LineChart()
            line.title = '报告期产出 - ' + \
                         reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"
            labels = Reference(ws,
                               min_col=2,
                               min_row=table_start_row_number + 1,
                               max_row=table_end_row_number)
            line_data = Reference(ws,
                                  min_col=3 + i,
                                  min_row=table_start_row_number,
                                  max_row=table_end_row_number)
            line.add_data(line_data, titles_from_data=True)
            line.set_categories(labels)
            line_data = line.series[0]
            line_data.marker.symbol = "circle"
            line_data.smooth = True
            line.x_axis.crosses = 'min'
            line.height = 8.25
            line.width = format_time_width_number * len(time) if len(
                time) > min_len_number else min_width_number
            if line.width > 24:
                line.width = 24
            line.dLbls = DataLabelList()
            line.dLbls.dLblPos = 't'
            line.dLbls.showVal = True
            line.dLbls.showPercent = False
            chart_col = 'B'
            chart_cell = chart_col + str(chart_start_row_number)
            chart_start_row_number += 6
            ws.add_chart(line, chart_cell)

    #####################################

    has_child_flag = True

    if "child_space" not in report.keys() or "energy_category_names" not in report['child_space'].keys() or \
            len(report['child_space']["energy_category_names"]) == 0 \
            or 'child_space_names_array' not in report['child_space'].keys() \
            or report['child_space']['child_space_names_array'] is None \
            or len(report['child_space']['child_space_names_array']) == 0 \
            or len(report['child_space']['child_space_names_array'][0]) == 0:
        has_child_flag = False

    if has_child_flag:
        child = report['child_space']

        ws['B' + str(current_row_number)].font = title_font
        ws['B' + str(current_row_number)] = name + ' 子空间数据'

        current_row_number += 1
        table_start_row_number = current_row_number

        ws.row_dimensions[current_row_number].height = 60
        ws['B' + str(current_row_number)].fill = table_fill
        ws['B' + str(current_row_number)].border = f_border
        ca_len = len(child['energy_category_names'])

        for i in range(0, ca_len):
            row = chr(ord('C') + i)
            ws[row + str(current_row_number)].fill = table_fill
            ws[row + str(current_row_number)].font = name_font
            ws[row + str(current_row_number)].alignment = c_c_alignment
            ws[row + str(current_row_number)].border = f_border
            ws[row + str(current_row_number)] = \
                reporting_period_data['names'][i] + " (" + reporting_period_data['units'][i] + ")"

        space_len = len(child['child_space_names_array'][0])

        for i in range(0, space_len):
            current_row_number += 1
            row = str(current_row_number)

            ws['B' + row].font = name_font
            ws['B' + row].alignment = c_c_alignment
            ws['B' + row] = child['child_space_names_array'][0][i]
            ws['B' + row].border = f_border

            for j in range(0, ca_len):
                col = chr(ord('C') + j)
                ws[col + row].font = name_font
                ws[col + row].alignment = c_c_alignment
                ws[col + row] = round(child['subtotals_array'][j][i], 2)
                ws[col + row].border = f_border

        table_end_row_number = current_row_number
        current_row_number += 1
        pie_start_row_number = current_row_number

        # Pie
        for i in range(0, ca_len):
            pie = PieChart()
            labels = Reference(ws,
                               min_col=2,
                               min_row=table_start_row_number + 1,
                               max_row=table_end_row_number)
            pie_data = Reference(ws,
                                 min_col=3 + i,
                                 min_row=table_start_row_number,
                                 max_row=table_end_row_number)
            pie.add_data(pie_data, titles_from_data=True)
            pie.set_categories(labels)
            pie.height = 6.6
            pie.width = 8
            pie.title = ws.cell(column=3 + i, row=table_start_row_number).value
            s1 = pie.series[0]
            s1.dLbls = DataLabelList()
            s1.dLbls.showCatName = False
            s1.dLbls.showVal = True
            s1.dLbls.showPercent = True
            chart_cell = ''
            if i % 2 == 0:
                chart_cell = 'B' + str(pie_start_row_number)
            else:
                chart_cell = 'E' + str(pie_start_row_number)
                pie_start_row_number += 5
            ws.add_chart(pie, chart_cell)

        current_row_number = pie_start_row_number
        if ca_len % 2 == 1:
            current_row_number += 5

        current_row_number += 1

    filename = str(uuid.uuid4()) + '.xlsx'
    wb.save(filename)

    return filename
Example #50
0
  def noteused(self):
    self.ws = ws

    self.ws.SetColWid(2,10)
    self.ws.SetColWid(3,60)
    self.ws.SetColWid(4,20)
    self.ws.SetColWid(5,20)
    self.ws.SetColWid(6,10)

    self.ws.DrawRegion(2,2,66,6,'thick','Blue 1')

    self.ws.ws.merge_cells('C3:E3')

    fmt1  = {'hAlign':'C','vAlign':'C','font':{'emph':'B','size':14}}
    fmt2  = {'hAlign':'L','vAlign':'C','border':{'A':'thin'},'fill':'Blue 2','font':{'emph':'B','size':11}}
    fmt2a = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Blue 2','font':{'emph':'B','size':11}}
    fmt2b = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Blue 2','numFmt':'0.0','font':{'emph':'B'}}
    fmt3  = {'hAlign':'L','vAlign':'C','border':{'A':'thin'},'fill':'Blue 3'}
    fmt3a = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Blue 3'}
    fmt3b = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Blue 3','numFmt':'0.0','font':{'emph':'B'}}
    fmt4  = {'hAlign':'L','vAlign':'C','border':{'A':'thin'},'fill':'Green 1'}
    fmt4b = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Green 1','numFmt':'0.0','font':{'emph':'B'}}
    fmt5  = {'hAlign':'L','vAlign':'C','border':{'A':'thin'},'fill':'Orange 1'}
    fmt5b = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Orange 1','numFmt':'0.0','font':{'emph':'B'}}
    fmt6  = {'hAlign':'L','vAlign':'C','border':{'A':'thin'},'fill':'Red 1'}
    fmt6b = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Red 1','numFmt':'0.0','font':{'emph':'B'}}
    fmt7  = {'hAlign':'L','vAlign':'C','border':{'A':'thin'},'fill':'Yellow 1'}
    fmt7b = {'hAlign':'C','vAlign':'C','border':{'A':'thin'},'fill':'Yellow 1','numFmt':'0.0','font':{'emph':'B'}}

    self.ws.SetCell( 3, 3,'Monthly Summary Statement: Year To Date (YTD)',fmt1)

    self.ws.SetCell( 6, 3,'Hours',fmt2)
    self.ws.SetCell( 6, 4,'Hours',fmt2a)
    self.ws.SetCell( 6, 5,'As a % of Contracted',fmt2a)

    self.ws.SetCell( 7, 3,'Contracted number of hours',fmt3)
    self.ws.SetCell( 7, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_OT.TBL_DATA.CONTRACTED)',fmt3b)

    self.ws.SetCell( 7, 5,None,fmt3b)

    self.ws.SetCell( 8, 3,'Total Hours booked',fmt3)
    self.ws.SetCell( 8, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_CF.TBL_DATA.TOTAL_TIME)',fmt3b)

    self.ws.SetCell( 8, 5,None,fmt3b)

    self.ws.SetCell( 9, 3,'Additional hours worked over contracted',fmt3)
    self.ws.SetCell( 9, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_OT.TBL_DATA.ADDITIONAL)',fmt3b)

    self.ws.SetCell( 9, 5,None,fmt3b)

    self.ws.SetCell(10, 3,'Number of Heads',fmt3)
    self.ws.ws.merge_cells('D10:E10')

    self.ws.SetCell(10, 4,16,fmt3b)
    self.ws.SetCell(10, 5,None,fmt3b)

    self.ws.ws.merge_cells('D12:E12')
    self.ws.ws.merge_cells('D13:E13')
    self.ws.ws.merge_cells('D14:E14')
    self.ws.ws.merge_cells('D15:E15')
    self.ws.ws.merge_cells('D16:E16')
    self.ws.SetCell(12, 3,'Activity (Summary) AVERAGE ACCROSS YEAR',fmt2)
    self.ws.SetCell(12, 4,'Percentage %',fmt2a)

    self.ws.SetCell(13, 3,'Utilisation (Customer Funded works)',fmt4)
    self.ws.SetCell(13, 4,'=AVERAGE(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_CF.ROW_COMP_TBL.UTILISATION_AS_A_PCT)',fmt4b)

    self.ws.SetCell(13, 5,None,fmt4b)

    self.ws.SetCell(14, 3,'Utilisation (Pre Sales work)',fmt5)
    self.ws.SetCell(14, 4,'=AVERAGE(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_PS.ROW_COMP_TBL.UTILISATION_AS_A_PCT)',fmt5b)

    self.ws.SetCell(14, 5,None,fmt5b)
    self.ws.SetCell(15, 3,'Utilisation (Downtime,Exc Leave and Sickness)',fmt6)
    self.ws.SetCell(15, 4,'=AVERAGE(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_DT.ROW_COMP_TBL.UTILISATION_AS_A_PCT)',fmt6b)

    self.ws.SetCell(15, 5,None,fmt6b)

    self.ws.SetCell(16, 3,'Utilisation (Leave and Sickness)',fmt7)
    self.ws.SetCell(16, 4,'=AVERAGE(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_LS.ROW_COMP_TBL.UTILISATION_AS_A_PCT)',fmt7b)

    self.ws.SetCell(16, 5,None,fmt7b)

    self.ws.SetCell(19, 3,'Activity (Detailed)',fmt2)
    self.ws.SetCell(19, 4,'Hours',fmt2a)
    self.ws.SetCell(19, 5,'As a % of Total',fmt2a)

    self.ws.SetCell(20, 3,'Support agreement (Software)',fmt4)
    self.ws.SetCell(20, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.SUPPORT_AGREEMENT_SOFTWARE___10)',fmt4b)
    self.ws.SetCell(20, 5,'=D20/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(21, 3,'Hardware agreement (Hardware)',fmt4)
    self.ws.SetCell(21, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.SUPPORT_AGREEMENT_HARDWARE___11)',fmt4b)
    self.ws.SetCell(21, 5,'=D21/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(22, 3,'Post Sales support (SW-Customer Funded)',fmt4)
    self.ws.SetCell(22, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.POST_SALES_SUPPORT_SW_CUSTOMER_FUNDED___14)',fmt4b)
    self.ws.SetCell(22, 5,'=D22/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(23, 3,'Post Sales support (HW-Customer Funded',fmt4)
    self.ws.SetCell(23, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.POST_SALES_SUPPORT_HW_CUSTOMER_FUNDED___15)',fmt4b)
    self.ws.SetCell(23, 5,'=D23/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(24, 3,'NRE (Customer funded)',fmt4)
    self.ws.SetCell(24, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.POST_SALES_SUPPORT_HW_CUSTOMER_FUNDED___15)',fmt4b)
    self.ws.SetCell(24, 5,'=D24/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(25, 3,'Training - Providing - Non Customer Specific',fmt4)
    self.ws.SetCell(25, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.TRAINING___PROVIDING___NON_CUSTOMER_SPECIFIC___17)',fmt4b)
    self.ws.SetCell(25, 5,'=D25/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(26, 3,'Training - Providing - Customer Specific',fmt4)
    self.ws.SetCell(26, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.TRAINING___PROVIDING___CUSTOMER_SPECIFIC___18)',fmt4b)
    self.ws.SetCell(26, 5,'=D26/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(27, 3,'Post Sales Support (Warranty Period)',fmt4)
    self.ws.SetCell(27, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.POST_SALES_SUPPORT_WARRANTY_PERIOD___23)',fmt4b)
    self.ws.SetCell(27, 5,'=D27/SUM(D20:D27)*100',fmt4b)

    self.ws.SetCell(28, 3,'Pre Sales Support',fmt5)
    self.ws.SetCell(28, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.PRE_SALES_SUPPORT___12)',fmt5b)
    self.ws.SetCell(28, 5,'=D28/SUM(D28:D33)*100',fmt5b)

    self.ws.SetCell(29, 3,'Post Sales Support (Non contract)',fmt5)
    self.ws.SetCell(29, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.POST_SALES_SUPPORT_NON_CONTRACT___13)',fmt5b)
    self.ws.SetCell(29, 5,'=D29/SUM(D28:D33)*100',fmt5b)

    self.ws.SetCell(30, 3,'Training - Receiving - Non Customer Specific',fmt5)
    self.ws.SetCell(30, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.TRAINING___RECEIVING___NON_CUSTOMER_SPECIFIC___19)',fmt5b)
    self.ws.SetCell(30, 5,'=D30/SUM(D28:D33)*100',fmt5b)

    self.ws.SetCell(31, 3,'Training - Receiving - Customer Specific',fmt5)
    self.ws.SetCell(31, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.TRAINING___RECEIVING___CUSTOMER_SPECIFIC___20)',fmt5b)
    self.ws.SetCell(31, 5,'=D31/SUM(D28:D33)*100',fmt5b)

    self.ws.SetCell(32, 3,'Internal Business Meeting',fmt5)
    self.ws.SetCell(32, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.INTERNAL_BUSINESS_MEETING___21)',fmt5b)
    self.ws.SetCell(32, 5,'=D32/SUM(D28:D33)*100',fmt5b)

    self.ws.SetCell(33, 3,'Professional Services',fmt5)
    self.ws.SetCell(33, 4,'=SUM(MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.ACTIVITY.TBL_DATA.PROFESSIONAL_SERVICES___22)',fmt5b)
    self.ws.SetCell(33, 5,'=D33/SUM(D28:D33)*100',fmt5b)

    self.ws.SetCell(34, 3,'Downtime - Excluding Leave & Sickness',fmt6)
    self.ws.SetCell(34, 4,'=SUM(GS232:HE232)',fmt6b)
    self.ws.SetCell(34, 5,'=D34/SUM(D34:D34)*100',fmt6b)

    self.ws.SetCell(35, 3,'Leave and Sickness',fmt7)
    self.ws.SetCell(35, 4,'=SUM(GS237:HE237)',fmt7b)
    self.ws.SetCell(35, 5,'=D35/SUM(D35:D35)*100',fmt7b)

    self.ws.SetCell(37, 3,'Customer split',fmt2)
    self.ws.SetCell(37, 4,'Hours',fmt2a)
    self.ws.SetCell(37, 5,'As a % of Total',fmt2a)
    self.ws.SetCell(38, 3,'Ericsson',fmt3)
    self.ws.SetCell(38, 4,'=SUM(GS247:HE247)',fmt3b)
    self.ws.SetCell(38, 5,'=D38/SUM(D38:D44)*100',fmt3b)
    self.ws.SetCell(39, 3,'Nokia',fmt3)
    self.ws.SetCell(39, 4,'=SUM(GS248:HE248)',fmt3b)
    self.ws.SetCell(39, 5,'=D39/SUM(D38:D44)*100',fmt3b)
    self.ws.SetCell(40, 3,'Alcatel-Lucent',fmt3)
    self.ws.SetCell(40, 4,'=SUM(GS249:HE249)',fmt3b)
    self.ws.SetCell(40, 5,'=D40/SUM(D38:D44)*100',fmt3b)
    self.ws.SetCell(41, 3,'Sum of all other customers',fmt3)
    self.ws.SetCell(41, 4,'=SUM(GS250:HE250)',fmt3b)
    self.ws.SetCell(41, 5,'=D41/SUM(D38:D44)*100',fmt3b)
    self.ws.SetCell(42, 3,'Cobham',fmt3)
    self.ws.SetCell(42, 4,'=SUM(GS251:HE251)',fmt3b)
    self.ws.SetCell(42, 5,'=D42/SUM(D38:D44)*100',fmt3b)
    self.ws.SetCell(43, 3,'Technical Training - All Types',fmt3)
    self.ws.SetCell(43, 4,'=SUM(GS252:HE251)',fmt3b)
    self.ws.SetCell(43, 5,'=D43/SUM(D38:D44)*100',fmt3b)
    self.ws.SetCell(44, 3,'Customer \'Other\'',fmt3)
    self.ws.SetCell(44, 4,'=SUM(GS253:HE251)',fmt3b)
    self.ws.SetCell(44, 5,'=D44/SUM(D38:D44)*100',fmt3b)

    self.ws.SetCell(46, 3,'Labour and Travel',fmt2)
    self.ws.SetCell(46, 4,'Hours',fmt2a)
    self.ws.SetCell(46, 5,'As a % of Total',fmt2a)
    self.ws.SetCell(47, 3,'Number of Labour Hours',fmt3)
    self.ws.SetCell(47, 4,'=SUM(GS217:HE217)',fmt3b)
    self.ws.SetCell(47, 5,'=D47/SUM(D47:D49)*100',fmt3b)
    self.ws.SetCell(48, 3,'Number of Labour Hours',fmt3)
    self.ws.SetCell(48, 4,'=SUM(GS218:HE218)',fmt3b)
    self.ws.SetCell(48, 5,'=D48/SUM(D47:D49)*100',fmt3b)
    self.ws.SetCell(49, 3,'Number of Labour Hours',fmt3)
    self.ws.SetCell(49, 4,'=SUM(GS219:HE219)',fmt3b)
    self.ws.SetCell(49, 5,'=D49/SUM(D47:D49)*100',fmt3b)

    self.ws.DrawBorder( 6, 3, 10, 5,'medium')
    self.ws.DrawBorder( 6, 3,  6, 5,'medium')
    self.ws.DrawBorder(12, 3, 16, 5,'medium')
    self.ws.DrawBorder(12, 3, 12, 5,'medium')
    self.ws.DrawBorder(19, 3, 35, 5,'medium')
    self.ws.DrawBorder(19, 3, 19, 5,'medium')
    self.ws.DrawBorder(37, 3, 44, 5,'medium')
    self.ws.DrawBorder(37, 3, 37, 5,'medium')
    self.ws.DrawBorder(46, 3, 49, 5,'medium')
    self.ws.DrawBorder(46, 3, 46, 5,'medium')

    range = None
    for item in self.ws.wb._named_ranges:
      if (item.name == 'MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_CF.ROW_COMP_TBL.UTILISATION_AS_A__'):
        dRange = item
        break 
    for item in self.ws.wb._named_ranges:
      if (item.name == 'MATRIX_EMEA_YTD.MATRIX.EMEA.YTD.UTL_CF.COL_DATA_HDR.ALL'):
        lRange = item
        break 

    chart = LineChart()
    chart.title = 'This is my chart'