Экспорт данных в пустую ячейку строки Openpyxl - PullRequest
1 голос
/ 04 ноября 2019

Я пытаюсь автоматизировать нумерацию нескольких списков, экспортируя данные в MS Excel, используя openpyxl. Выходные данные представляют собой список списков с двумя наборами чисел на элемент, причем первый набор представляет собой совпадающее число (от 0 до 99), а второй представляет собой порядковый номер, в котором они сопоставляются.

def variable_str_to_list_pairs_overlapping (str):
    return [''.join(pair) for pair in zip(str[:-1], str[1:])]

list1 = variable_str_to_list_pairs_overlapping (list1)
list2 = variable_str_to_list_pairs_overlapping (list2)

lst_result = []
for i in range(len(list2)):
     if list1[i] == list2[i]:
     data = [list1[i], i]
     data[0] = int(list1[i])
     lst_result.append(data)
print(lst_result)

Вывод:

    [[7, 265], [8, 281], [2, 303], [8, 332], [7, 450], [1, 544], [0, 
    737], [9, 805], [2, 970], [4, 1103], [4, 1145], [8, 1303], [1, 
    1575], [4, 1592], [2, 1593], [3, 1948], [4, 2200], [5, 2419], [3, 
    2464], [9, 2477], [1, 2529], [6, 2785], [2, 2842], [8, 2843], [7, 
    2930], [3, 2991], [8, 3096], [3, 3248], [2, 3437], [7, 3438], [8, 
    3511], [0, 3522], [0, 3523], [5, 3590], [6, 3621], [1, 3622], [2, 
    3671], [6, 3835], [7, 3876]]

Я хочу экспортировать данные в Excel таким образом, чтобы первый элемент был назначен в качестве индекса строки, а второй - в качестве значения. внутри ячейки

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
dest_filename = 'openpyxltest.xlsx'
for x in lst_result:
    ws.cell(row = x[0] + 1, column = +2).value = x[1]
wb.save(filename = dest_filename)

Фактический вывод: Actual Output

Требуемый вывод: Desired Output

Что мне нужно изменить в моем коде? Заранее благодарю за помощь. вы, ребята, потрясающие! :)

1 Ответ

0 голосов
/ 10 ноября 2019

Вы перезаписываете ячейки - вы никогда не изменяете столбец , в который вы записываете, - поэтому он перезаписывается более поздними записями ...

Вы можете решить эту проблему, используя defaultdict (list) , чтобы собрать все значения одного ключа в список, отсортировать его и затем создать xlsx из словаря следующим образом:

lst_result = [[7, 265], [8, 281], [2, 303], [8, 332], [7, 450], [1, 544], [0, 
    737], [9, 805], [2, 970], [4, 1103], [4, 1145], [8, 1303], [1, 
    1575], [4, 1592], [2, 1593], [3, 1948], [4, 2200], [5, 2419], [3, 
    2464], [9, 2477], [1, 2529], [6, 2785], [2, 2842], [8, 2843], [7, 
    2930], [3, 2991], [8, 3096], [3, 3248], [2, 3437], [7, 3438], [8, 
    3511], [0, 3522], [0, 3523], [5, 3590], [6, 3621], [1, 3622], [2, 
    3671], [6, 3835], [7, 3876]]

from collections import defaultdict

# group all datapoints by 1st value
grpd_data = defaultdict(list)
for k,v in lst_result:
    grpd_data[k].append(v)

# sort all grouped values (not needed here, as inputs are sorted)
# for l in grpd_data:
#    grpd_data[l].sort()

grpd_data выглядит так:

# defaultdict(<type 'list'>, {0: [737, 3522, 3523], 1: [544, 1575, 2529, 3622], 
#     2: [303, 970, 1593, 2842, 3437, 3671], 3: [1948, 2464, 2991, 3248], 
#     4: [1103, 1145, 1592, 2200], 5: [2419, 3590], 6: [2785, 3621, 3835], 
#     7: [265, 450, 2930, 3438, 3876], 8: [281, 332, 1303, 2843, 3096, 3511], 
#     9: [805, 2477]})

Затем создайте рабочую книгу:

from openpyxl import Workbook
wb = Workbook()
ws = wb.active
dest_filename = 'openpyxltest.xlsx'

for x,data in grpd_data.items():
    ws.cell(row = x + 1, column = 1).value = x
    for col,d in enumerate(data,2): 
        ws.cell(row = x + 1, column = col).value = d

wb.save(filename = dest_filename)

Вывод:

resulting xlsx


См .:

...