Python openpyxl 插入折線圖

import os
import openpyxl

from datetime import date
from openpyxl import Workbook

from openpyxl.chart import (
    Series,
    LineChart,
    Reference,
)
def add_line_chart(title, wss, min_col, min_row, max_col, max_row):
    c1 = LineChart()
    c1.title = title  # 圖的標題
    c1.style = 12  # 線條的style
    c1.y_axis.title = 'percent'  # y座標的標題
    if 'IDC' not in title:
        c1.x_axis.number_format = 'd-mmm'  # 規定日期格式  這是月,年格式
        c1.x_axis.majorTimeUnit = "Months"  # 規定日期間隔 注意days;Months大寫
    c1.x_axis.title = "Date"  # x座標的標題
    data = Reference(wss, min_col=min_col, min_row=min_row, max_col=max_col, max_row=max_row)  # 圖像的數據 起始行、起始列、終止行、終止列
    c1.add_data(data, titles_from_data=True, from_rows=True)
    dates = Reference(wss, min_col=2, min_row=1, max_col=max_col)
    c1.set_categories(dates)
    wss.add_chart(c1, "A6")  # 將圖表添加到 sheet中


def save_data_to_excel(file_name, target_sheet_name):
    select_cursor = connect.cursor()
    select_sql = "select phone_company, record_date, record_percent from phone_statistics where record_company = '%s'" % target_sheet_name
    if target_sheet_name == "IDC":
        select_sql = "select phone_company, record_q, record_percent from phone_statistics where record_company = '%s'" % target_sheet_name
    select_cursor.execute(select_sql, ())

    data_dic = {}
    all_date = {}
    all_phone_company = {}
    for item in select_cursor:
        if target_sheet_name == "IDC":
            data_dic[item[0] + '_' + item[1]] = item[2]
        else:
            if type(item[1]) == str:
                data_dic[item[0] + '_' + item[1]] = item[2]
            else:
                data_dic[item[0] + '_' + item[1].strftime("%Y-%m-%d")] = item[2]
        all_date[item[1]] = 1
        all_phone_company[item[0]] = 1

    if os.path.exists(file_name):
        wb = openpyxl.load_workbook(file_name)
    else:
        wb = Workbook()

    try:
        wb.remove_sheet(wb['Sheet'])
    except Exception as e:
        pass
    try:
        wb.remove_sheet(wb[target_sheet_name])
    except Exception as e:
        pass

    try:
        sheet = wb[target_sheet_name]
    except Exception as e:
        sheet = wb.create_sheet()

    start_date_index = 'B'
    for each_date in all_date.keys():

        if target_sheet_name == "IDC":
            sheet['%s1' % start_date_index] = each_date
        else:
            if type(each_date) == str:
                sheet['%s1' % start_date_index] = each_date
            else:
                sheet['%s1' % start_date_index] = each_date.strftime("%Y-%m-%d")
        start_date_index = chr(ord(start_date_index) + 1)

    start_name_index = 2
    for each_name in all_phone_company.keys():
        sheet['A%d' % start_name_index] = each_name
        start_name_index += 1

    start_date_index = 'B'
    start_name_index = 2
    for each_date in all_date.keys():
        for each_name in all_phone_company.keys():

            if target_sheet_name == "IDC":
                key = each_name + '_' + each_date
                if key in data_dic:
                    sheet['%s%d' % (start_date_index, start_name_index)] = data_dic[key]
            else:
                if type(each_date) == str:
                    key = each_name + '_' + each_date
                else:
                    key = each_name + '_' + each_date.strftime("%Y-%m-%d")
                if key in data_dic:
                    sheet['%s%d' % (start_date_index, start_name_index)] = data_dic[key]
            start_name_index += 1
        start_date_index = chr(ord(start_date_index) + 1)
        start_name_index = 2

    sheet.title = target_sheet_name
    sheet.column_dimensions['A'].width = 20
    start_date_index = 'B'
    for each_date in all_date.keys():
        sheet.column_dimensions[start_date_index].width = 13
        start_date_index = chr(ord(start_date_index) + 1)

    add_line_chart(target_sheet_name.upper() + "'s Phone Statistics", sheet, 1, 2, len(all_date.keys()) + 1,
                   min(15, len(all_phone_company.keys()) + 1))

    wb.save(file_name)
    pass

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章