Заголовки столбцов исчезают при создании таблицы - PullRequest
1 голос
/ 29 марта 2020

У меня есть следующий скрипт, который берет файл xls и создает xlsx с таблицей (отформатированной как фактическая таблица). Заголовки столбцов отображаются в итоговой таблице как Столбец1 Столбец2 и c, а не как фактические заголовки, найденные в кадре данных.

Есть ли способ исправить это? Я также обнаружил, что создаю временный файл xlsx, копирую его, чтобы включить таблицу, и удаляю временную версию. Можно ли упростить это больше?

Код:

import os
import shutil
import pandas as pd
import xlsxwriter
import xlrd
from datetime import datetime 

date = datetime.today().strftime('%Y-%m-%d')

demand = r"C:\Users\xxxx\Desktop\source.xls"
dfd = pd.read_excel(demand, sheet_name = 'sheet').fillna(0)
dfd = dfd.iloc[6:]
dfd.columns = dfd.iloc[0] #replace headers
dfd = dfd[1:] #remove headers from first row

destd = r"C:\Users\xxxx\Desktop\temporary.xlsx"
destd2 = r"C:\Users\xxxx\Desktop\File (" + str(date) + ").xlsx"
dfd.to_excel(destd)

workbook = xlsxwriter.Workbook(destd)
worksheet = workbook.add_worksheet("Demand")
worksheet.add_table('A1:DL10000', {'data': dfd.values.tolist()})
workbook.close()
destination = shutil.copy2(destd, destd2)

os.remove(destd)

Импорт заголовков столбцов:

dictonary = r"C:\Users\xxxx\Dictionary - Column Headers.xlsx"

dfd = pd.read_excel(dictonary, sheet_name = 'Demand')
dict1 = dfd.to_dict()

1 Ответ

1 голос
/ 29 марта 2020

Из документации xlsxwriter здесь :

The columns parameter can be used to set properties for columns within the table.
The sub-properties that can be set are header, header_format etc.
The column data must be specified as a list of dicts.

Это означает, что вы можете добавить еще один ключ 'columnms' в словарь метода add_table для переименования заголовков.

Вот пример таблицы с переименованными заголовками:

import pandas as pd

df = pd.DataFrame({'Name': ['John','George','Paul'],
                    'Age': [23,34,42]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook  = writer.book
worksheet = writer.sheets['Sheet1']

# This will create a basic table with the headers named as 'Column 1' etc
#worksheet.add_table('A1:B4', {'data': df.values.tolist()})

# Add the 'columns' argument to name the headers
worksheet.add_table('A1:B4', {'data': df.values.tolist(),
                    'columns': [{'header': 'Name'},
                                {'header': 'Age'}]})

writer.save()

Вывод:

enter image description here

РЕДАКТИРОВАТЬ

Если ваш фрейм данных импортирован из файла, и вы не хотите вручную вводить все имена заголовков, вы можете сделать 'columns': [{'header': df.columns[0]}, {'header': df.columns[1]}] et c или даже лучше объявить переменной и присвойте ей понимание списка:

header_names = [{'header': df.columns[x]} for x in range(df.shape[1])]

Тогда вам просто нужно сделать:

worksheet.add_table('A1:B4', {'data': df.values.tolist(),
                    'columns': header_names})
...