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
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
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)
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
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
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)
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 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")
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")
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())
#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
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
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
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")
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")
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
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
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!")
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)
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")
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
['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")
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)
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
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
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
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))
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
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
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")
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
"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)
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")
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
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()
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
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)
[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)
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)"
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)
['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")
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
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'