Как поместить каждые пять строк в один лист с xlwt и xlrd? - PullRequest
0 голосов
/ 15 мая 2018

Теперь я могу сохранить только все 13 строк данных на Лист1. Но на самом деле я хочу поместить каждые 5 строк в лист, например: enter image description here

Теперь мой код такой:

import xlwt
import xlrd
from xlutils.copy import copy
myyear = '2018'
myweek = '10'
mycd='1001'
fileName = myyear + myweek + '.xls'
workbook = xlwt.Workbook(encoding='UTF-8')
worksheet = workbook.add_sheet('sheet1')
worksheet.write(0, 0, label='year')
worksheet.write(0, 1, label='week')
worksheet.write(0, 2, label='CD')
worksheet.write(0, 3, label='keyword')
worksheet.write(0, 4, label='importance')
savePath = r'D:/' + fileName
workbook.save(savePath)
rexcel = xlrd.open_workbook(savePath)
rows = rexcel.sheets()[0].nrows
excel = copy(rexcel)
worksheet = excel.get_sheet(0)
current_row = rows
for cmp_noun, value in [[1,1],[2,2],[3,3],[4,4],[5,5],[6,6],[7,7],[8,8],[9,9],[10,10],[11,11],[12,12],[13,13]]:
    if current_row<=6:
        worksheet.write(current_row, 0, label=myyear)
        worksheet.write(current_row, 1, label=myweek)
        worksheet.write(current_row, 2, label=mycd)
        worksheet.write(current_row, 3, label=cmp_noun)
        worksheet.write(current_row, 4, label=value)
        current_row += 1
excel.save(savePath)

Как изменить код, чтобы он стал эффектом, который я хочу?

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

Структурируйте ваш код в логических сегментах, чтобы вы могли протестировать каждый из них по отдельности

фиктивные данные

Ваши фиктивные данные могут поступать откуда угодно, здесь я сделал это простым генератором

def generate_data():
    year = '2018'
    week = '10'
    cd='1001'
    for i in range(1, 14):
        cmp_noun = value = i
        yield (year, week, cd, cmp_noun, value)

группировка

from itertools import zip_longest
def grouper(iterable, n, fillvalue=None):
    """
    Collect data into fixed-length chunks or blocks
    https://docs.python.org/3.5/library/itertools.html#itertools-recipes
    """
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return zip_longest(*args, fillvalue=fillvalue)

list(grouper(generate_data(), 5))

группирует данные:

[(('2018', '10', '1001', 1, 1),
  ('2018', '10', '1001', 2, 2),
  ('2018', '10', '1001', 3, 3),
  ('2018', '10', '1001', 4, 4),
  ('2018', '10', '1001', 5, 5)),
 (('2018', '10', '1001', 6, 6),
  ('2018', '10', '1001', 7, 7),
  ('2018', '10', '1001', 8, 8),
  ('2018', '10', '1001', 9, 9),
  ('2018', '10', '1001', 10, 10)),
 (('2018', '10', '1001', 11, 11),
  ('2018', '10', '1001', 12, 12),
  ('2018', '10', '1001', 13, 13),
  None,
  None)]

Сделать рабочую книгу

def generate_workbook(header, data, n=5):
    groups = grouper(data, n)
    workbook = xlwt.Workbook(encoding='UTF-8')
    for i, group in enumerate(groups, 1):
        worksheet = workbook.add_sheet(f'sheet{i}')
        group = filter(None, group)
        populate_sheet(worksheet=worksheet, header=header, data=group)
    return workbook

Группирует данные, инициирует WorkBook. Затем он создает новый лист для каждой группы и заполняет его. filter(None, group) - отбрасывать оставшиеся строки, когда данные не кратны n.

заполнить рабочий лист

def populate_sheet(worksheet, header, data):
    for i, column in enumerate(header):
        worksheet.write(0, i, column)
    for row_no, row in enumerate(data, 1):
        for i, item in enumerate(row):
            worksheet.write(row_no, i, label=item)

Записывает заголовок в первую строку, а затем заполняет следующие строки. Используя enumerate, мы избавляемся от множества жестко закодированных чисел и делаем все это более универсальным

сохранение рабочей книги

if __name__ == '__main__':
    name = 'test.xls'
    data = generate_data()
    header = ['year', 'week', 'CD', 'keyword', 'importance']
    wb = generate_workbook(header=header, data=data, n = 5)
    wb.save(name)
0 голосов
/ 15 мая 2018

Для начала:

wb = Workbook()

for k in range(100):

    #create a new sheet 
    if not (k % 5):
        ws = wb.create_sheet('sheet {:d}'.format(k))

    # the rest is a bit of index magic using, indexing starts at 1 !
    ws.cell(row=1, column=1).value = 2
...