Как записать данные на разные листы с помощью xlsxwriter?

У меня есть атрибут даты в таблице xlsx. Это отчет за недельный период. Я хочу разделить его по дате. В результирующем файле xlsx должно быть 7 листов, и на каждом листе должна быть размещена информация, актуальная для каждого листа.

Я использую этот класс для записи:

class DictWriter:
    def __init__(self, workbook, worksheet, fieldnames):
        self.workbook = workbook
        self.worksheet = worksheet
        self.fieldnames = fieldnames
        self.nrow = 1

    def writerow(self, d):
        for k in d:
            ncol = self.fieldnames.index(k)
            self.worksheet.write(self.nrow, ncol, d[k])
        self.nrow += 1

    def writeheader(self):
        for ncol, fieldname in enumerate(self.fieldnames):
            self.worksheet.write(0, ncol, fieldname)

и в начале итерации (я перебираю раздел результатов HTTP JSON в файле). Создание рабочего листа выполняется только один раз перед циклом:

def file_generator():
    link = "http://example.com"
    client = requests.get(link)
    response = client.json()['response']
    if response['httpStatus'] == 200:
        workbook = xlsxwriter.Workbook('WeeklyReport.xlsx', {'strings_to_numbers': True})
        worksheet = workbook.add_worksheet()
        data_table = response['data']['data']
        fieldnames = ["Date", "Advertiser", "Offer", "Revenue"]
        writer = DictWriter(workbook, worksheet, fieldnames)
        writer.writeheader()
        for d in data_table:
               row_dict = {"Date": d['Stat']['date'], "Advertiser": d['Advertiser']['company'], "Offer": d['Offer']['name'], "Revenue": d['Stat']['revenue']}
                writer.writerow(row_dict)

Как мне изменить существующую логику, чтобы записать все записи по дате в листах?

В моем случае я сделал так:

def key_value_gen(k):
    result = date.today() - timedelta(k)
    result = result.strftime('%Y-%m-%d')
    yield result
    yield 1

class DictWriter:
    def __init__(self, workbook, worksheet, fieldnames):
        self.workbook = workbook
        self.worksheet = worksheet
        self.fieldnames = fieldnames
        self.nrows = dict(map(key_value_gen, range(0, 8)))

    def writerow(self, d, condition=0):
        for k in d:
            ncol = self.fieldnames.index(k)
            self.worksheet.write(self.nrows[self.worksheet.name], ncol, d[k])
        print self.worksheet.name
        self.nrows[self.worksheet.name] += 1

    def changeworksheet(self, worksheet):
        self.worksheet = worksheet

    def writeheader(self):
        for ncol, fieldname in enumerate(self.fieldnames):
            self.worksheet.write(0, ncol, fieldname)

но он не работает должным образом (создает 7 листов, но пишет только в первый), когда я бросаю:

    for day in range(1,8):
        daydelta = date.today() - timedelta(day)
        daydelta = daydelta.strftime('%Y-%m-%d')
        sheet = workbook.add_worksheet(daydelta)
        sheets[sheet.name] =  worksheet

а потом:

writer.changeworksheet(sheets[d['Stat']['date'].encode('utf-8')])

в теле цикла. Как изменить его, чтобы он работал?


person Павел Иванов    schedule 17.05.2016    source источник


Ответы (1)


У меня был аналогичный тип, когда мне нужно было несколько рабочих листов для разных данных - мне было проще сначала убедиться, что поступающие данные были упорядочены по тому, по чему я определял рабочие листы - в вашем случае по дате. Затем нужно сделать рабочие листы и указать, как узнать, когда использовать другой. Я на работе, поэтому просто снял то, что использовал или думал, что использовать в вашем случае. Надеюсь, это поможет некоторым.

worksheetNE = workbook.add_worksheet('Northeast Region')
worksheetNW = workbook.add_worksheet('Northwest Region')
worksheetSE = workbook.add_worksheet('Southeast Region')
if region.upper()=='NORTHEAST REGION':
    worksheet=worksheetNE
elif region.upper()=='NORTHWEST REGION':
    worksheet=worksheetNW
elif region.upper()=='SOUTHEAST REGION':
    worksheet=worksheetSE
person Slihthinden    schedule 19.05.2016