Пайтон Графикос Excel в файле уже существующем OpenPyXL

У меня есть следующая проблема, когда я хочу сохранять реализованный график, беря заблаговременно данные о моем Excel, результат выходит у меня в мишени...

wb = openpyxl.load_workbook(j)
sheet = wb.get_sheet_by_name('{}'.format(itemm))
data = Reference(sheet, min_col=2, min_row=2, max_col=4, max_row=tt+1)
print data

c2 = LineChart()
c2.height = 6.80
c2.width = 19
c2.title = "Subastadas"
c2.style = 12
c2.y_axis.title = "Cantidad"
c2.y_axis.crossAx = 500
c2.x_axis = DateAxis(crossAx=100)
c2.x_axis.title = "Date"

c2.add_data(data=data, titles_from_data=True)
sheet.add_chart(c2, "H1")
wb.save(j)
0
задан 23.03.2019, 10:41
1 ответ

Рассуждения

Я Предполагаю, что старались использовать пример, поставленный в openpyxl на Линес Чартс , чтобы делать grГЎfico соответствующий.

По этому поводу, поскольку я не нашел bibliografГ - в в espaГ±ol, что подробно описал cГіmo делать lineChart полными в openpyxl , и материал, который leГ-do в inglГ©s, estГЎ разделено на части и рассеивает, мне казаться подходящим включать один cГіdigo завершает на частном лице, хотя sГ©, что вопрос такие как estГЎ, не должен быть отвеченным, я считаю, что это может быть видно tambiГ©n как вклад в сообщество.

Библиотек

Для того, чтобы оно функционировало cГіdigo, для себя должны импортировать следующие библиотеки, в этом случае одна не происходит openpyxl : date, что он emplearГЎ, чтобы производить даты, что irГЎn потом в ось X

# se importa para los datos del eje X
from datetime import date

import openpyxl
from openpyxl import Workbook


# basicamente estas importaciones son para
# las lineas principales y secundarias del grafico
# tambien permite mostrarse los datos en la linea
# del gráfico. Fuente de esta idea:
# # https://stackoverflow.com/questions/48755936/python-openpyxl-remove-a-scatter-chart-gridlines
from openpyxl.chart.shapes import GraphicalProperties
from openpyxl.drawing.line import LineProperties
from openpyxl.chart.axis import ChartLines
from openpyxl.chart.label import DataLabelList

# los métodos a emplearse con chart
from openpyxl.chart import (
    LineChart,
    Reference,
    label
)

# Formato para los ejes con fechas
# si quiere verse cuales son los formatos en
# Excel recomiendo ver el siguiente enlace
# https://support.office.com/es-es/article/texto-funci%C3%B3n-texto-20d5ac4d-7b94-49fd-bb38-93d29371225c
from openpyxl.chart.axis import DateAxis

год GeneraciГіn Данных и Листа CГЎlculo

Como не поставил себе ни данных, ни файла, эта часть опциональная и sГіlo он включается, чтобы воспроизводить результаты.

#  ----------------------------------------
#  Funcion de Ayuda
#  Para copiar tablas N x M
#  si quieres alguna posición especifica
#  agregar listas vacias
#  no optimo quizas pero reutilzas codigo
#  ----------------------------------------
#  USO:
#  Si se quiere copiar las columnas C, D y F:
#  table tendria que tener la siguiente forma:
#  [[], [], [Datos C],[Datos D], [], [Datos D]]
#  ----------------------------------------
def copyValuesTablas(table, sheet):  
    for nCol, lista in enumerate(table):
        for nRow, valor in enumerate(lista):
            sheet.cell(column=nCol+1, row=nRow+1, value=valor)
            #print(nCol + 1, nRow + 1, valor)  #control

# -----------------------------------------
# Datos Iniciales
# -----------------------------------------

# valores en las columnas
# y=x^2
A=[date(2018,3, i) for i in range(1,14)]
B=[x**2 for x in range(0,13)]

# nombre de cabeceras
A.insert(0, "Fecha")
B.insert(0,"Valor")

# tabla
tabla = [A, B]
# -----------------------------------------


#  ----------------------------------------
#  Configuracion del Entorno de Trabajo
#  ----------------------------------------
wbDestiny = 'graficoLinea.xlsx'
# creamos un archivo que al final se salvará
myBook = Workbook()

#  Se renombra Sheet por 'linePlot'
myBook.active.title = 'linePlot'
ws = myBook['linePlot']

# creación de los datos
copyValuesTablas(tabla, ws)
ws.column_dimensions['A'].width = 20 # Se asjuata el ancho de columna
#  ----------------------------------------

Ploteo Данных

Entre части, чтобы отпрыгивать в том, чтобы быть, уедь:

  • , Включать или дезактивировать легенды
  • , Красить первичные и второстепенные Клетчатые сетки (Ось X и Ось y)
  • Формат Даты в Оси X
  • Размеров GrГЎfico
  • Mostrar данные в ней lГ-nea

AquГ - cГіdigo

#  ----------------------------------------
#  Creación de Grafico
#  ----------------------------------------
linePlot = LineChart()

# Titulos
linePlot.title = "Subastadas"
linePlot.y_axis.title = "Cantidad"
linePlot.x_axis.title = "Fecha"

# Estilos Formato Texto
linePlot.style = 12
linePlot.x_axis.number_format = 'd-mmm'
linePlot.x_axis.majorTimeUnit = "days"

# Dimensiones grafico
linePlot.height = 10
linePlot.width = 20


#  ----------------------------------------
# Limites
# no lo inclui porque los titulos
# del eje x e y no lo requerian
# pero las dejos por si quieres
# experimentar con ellas
#  ----------------------------------------
#linePlot.y_axis.crossAx = 500
#linePlot.x_axis = DateAxis(crossAx=100)


# Desactivar leyenda
linePlot.legend = None


#  ----------------------------------------
# los datos son seleccionados desde la
# parte superior izquierda hasta la
# parte inferior derecha
# En este caso 'B2:B14' o (B,2):(B,14)
#  ----------------------------------------
# se seleciona los datos de la columna B
#  ----------------------------------------
data = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=14)
linePlot.add_data(data, titles_from_data=True)

# Estilo Linea
lineSerie = linePlot.series[0]
lineSerie.smooth = True
lineSerie.graphicalProperties.line.solidFill = "00AAAA"

# Cubrir las lineas secundarias del grafico con color blanco
linePlot.y_axis.majorGridlines.spPr = GraphicalProperties(noFill = 'True')
linePlot.y_axis.majorGridlines.spPr.ln = LineProperties(solidFill = 'ffffff')
linePlot.x_axis.majorGridlines = ChartLines()
linePlot.x_axis.majorGridlines.spPr = GraphicalProperties(noFill = 'True')
linePlot.x_axis.majorGridlines.spPr.ln = LineProperties(solidFill = 'ffffff')

# Mostrar los datos en la linea ploteada 
linePlot.dLbls = DataLabelList()
linePlot.dLbls.showVal = 1

#  ----------------------------------------
# se seleciona los datos de la columna A
# correspondiemte a las fechas
#  ----------------------------------------
# En este caso 'A2:A14' o (A,2):(A,14)
fechas = Reference(ws, min_col=1, min_row=2, max_col=1, max_row=14)
linePlot.set_categories(fechas)


# Se establece la posición
ws.add_chart(linePlot, "D2")

# Se guarda
myBook.save(wbDestiny)

Оказавшиеся

introducir la descripción de la imagen aquí

Adicionalmente объект, созданный для этого ответа linePlot Ваша серия (lineSerie = linePlot.series[0] estГЎ в ней lГ-nea 134 под # Estilo Linea) обладает другими mГ©todos как maker, которые он позволяет определять стили для точек данных, как triГЎngulos, а именно беря пример, поставленный в начало этого ответа, podrГ, - чтобы иметь:

lineSerie.marker.symbol = "triangle"
lineSerie.marker.graphicalProperties.solidFill = "FF0000" # Marker filling
lineSerie.marker.graphicalProperties.line.solidFill = "FF0000" # Marker outline

В конце концов возможный определять тип lГ-nea и Вашей толщины, но в этом Гєltimo случай - в travГ©s средства ЭМУ mГЎs деталь в: Points, inches and Эму: Measuring units in Оффисе Опен XML , в этом смысле podrГ, - чтобы добавлять их следующий tambiГ©n:

lineSerie.graphicalProperties.line.solidFill = "00AAAA"
lineSerie.graphicalProperties.line.dashStyle = "sysDot"
lineSerie.graphicalProperties.line.width = 100050 # ancho en EMUs
1
ответ дан 03.12.2019, 02:20

Теги

Похожие вопросы