Как написать несколько ячеек в разных местах в Excel из Python - PullRequest
0 голосов
/ 03 декабря 2018

Я хотел написать несколько листов определенным шрифтом в Python, например:

from openpyxl.styles import colors
from openpyxl.styles import Font, Color
from openpyxl import Workbook

import openpyxl as op
from openpyxl.styles import PatternFill, Border, Side, Alignment, Protection, Font

def style_range_multiple_entries(file, cells_description, font): 

book = op.load_workbook(file) 

for k, description in enumerate(cells_description): 
 for t, list_item in enumerate(description[k]): 
 ws = book.worksheets[description[1]] 
 cell = ws.cell(description[2]) 
 cell.value = description[0] 
 cell.font = font 

book.save("styled.xlsx")

names = [[['apple', 'banana', 'strawberry'], [0,0,0],['B2','B20',''B25]], (...) ]

font1 = Font(name='Calibri', size=16, bold=True)

style_range_multiple_entries('styled.xlsx',names, font1)

Однако что-то не так с циклом ..

Я хотел написать на одном листенесколько ячеек в нескольких местах, но один и тот же шрифт.Что-то вроде:

Sheet 1:
Cell'B2' = apple
Cell 'B20' = banana
Cell 'B25' = strawberry

Знаете ли вы, что не так с моим кодом?

Заранее спасибо!

PS:

Я создал код, который работает для меня так:

def style_range(file, cells_description, font):

    book = op.load_workbook(file)

    for k, description in enumerate(cells_description):
        ws = book.worksheets[description[2]]
        cell = ws.cell(description[1])
        cell.value = description[0]
        cell.font = font
    book.save("styled.xlsx")  

Однако мне нужно указатьдля списка что-то вроде этого:

list = [['apple','B2',0], ['banana','B20',0], ['strawberry','B25',0], (...) ]

, и я хотел сделать это для списка, как я определил выше "имена".

1 Ответ

0 голосов
/ 03 декабря 2018

* Вопрос **: Я хотел сделать это для списка, как я определил выше «имена»

Вы должны построить Матрицу из вашего names.

Примечание : Вместо того, чтобы строить Matrix впоследствии, попробуйте собрать его сразу!

  • Данные == list из list из list

    names = [[['apple', 'banana', 'strawberry', 'raspberry'], 
              [0, 0, 0, 0], 
              ['B2', 'B20', 'B25', 'B30']
            ]]
    
  • Получить размерность Matrix

    x_range = len(names[0])
    y_range = len(names[0][0])
    
  • Построить матрицу из names

    names2 = []
    for y in range(y_range):
        names2.append([])
        for x in range(x_range):
            names2[y].append(names[0][x][y])
    

    Альтернатива: Все в одну строку

    names2 = [[names[0][x][y] for x in range(x_range)] for y in range(y_range)]
    

Вывод :

print("names2:{}".format(names2))
names2:[['apple', 0, 'B2'], ['banana', 0, 'B20'], ['strawberry', 0, 'B25'], ['raspberry', 0, 'B30']]

Чтение ваших list из list из list и сборкаодин набор элементов:

Примечание : Нет никаких причин использовать ws = book.worksheets[... снова и снова в цикле.
Получить его один раз и передайте его по своим параметрам, например style_one_cell(ws, names2, font)

    for y in range(y_range):
        names2 = []
        for x in range(x_range):
            names2.append(names[0][x][y])

        print("style_one_cell({}, font)".format(names2))

Выход :

style_one_cell(['apple', 0, 'B2'], font)
style_one_cell(['banana', 0, 'B20'], font)
style_one_cell(['strawberry', 0, 'B25'], font)
style_one_cell(['raspberry', 0, 'B30'], font)

Проверено на Python: 3,5,3

...