将数据导出到空单元格行 Openpyxl
Export data to empty cell row Openpyxl
我正在尝试通过使用 openpyxl 将数据导出到 ms excel 来自动对多个列表进行编号分组。输出是一个列表列表,每个元素有两组数字,第一组是匹配的数字(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)
实际输出:
期望的输出:
我的代码需要更改什么?预先感谢您的帮助。你们太棒了! :)
您正在覆盖单元格 - 您从未调整写入的 列 - 因此它会被以后的写入覆盖...
您可以通过使用 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)
输出:
参见:
- enumerate
- How does collections.defaultdict work?
我正在尝试通过使用 openpyxl 将数据导出到 ms excel 来自动对多个列表进行编号分组。输出是一个列表列表,每个元素有两组数字,第一组是匹配的数字(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)
实际输出:
期望的输出:
我的代码需要更改什么?预先感谢您的帮助。你们太棒了! :)
您正在覆盖单元格 - 您从未调整写入的 列 - 因此它会被以后的写入覆盖...
您可以通过使用 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)
输出:
参见:
- enumerate
- How does collections.defaultdict work?