автоподбор ширины столбца с помощью xlswriter || Django - PullRequest
1 голос
/ 21 февраля 2020

Я генерирую Excel в моем Django views.py , но так как имена столбцов немного длинные, у меня возникают трудности с установкой ширины автоматической подгонки столбцов вручную каждый раз Я / пользователь загружает Excel.

Ниже приведен мой рабочий код для генерации Excel с использованием xlswriter.

def excel(request):
    ans = request.POST.getlist('ans[]')
    ans_final=[]
    rows = request.POST.get('rows')
    for each_ele in ans:
        each_ele = each_ele.split('.')
        each_ele[0] = each_ele[0][:-2]
        each_ele[1] = each_ele[1][:-2]
    fin = each_ele[0]+' - '+each_ele[1]
    ans_final.append(fin)
    workbook = xlsxwriter.Workbook('/home/Desktop/status.xlsx')
    worksheet = workbook.add_worksheet('Test_Data')
    bold = workbook.add_format({'bold': True})
    for i in range(len(ans_final)):
        worksheet.write(0, i,ans_final[i],bold)

    row_index=1
    row_count = int(rows)
    while(row_count):
        col_index=0
        for each_ele in ans:
            worksheet.write(row_index, col_index, eval(each_ele))
            col_index += 1
        row_index += 1
        row_count -= 1


   workbook.close() 
   return JsonResponse({'ok':'ok'})

Пожалуйста, предложите обходной путь для установки Ширина автоподбора столбца в приведенном выше коде.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2020

К сожалению, нет способа указать «AutoFit» для столбца в формате файла Excel. Эта функция доступна только во время выполнения из Excel. В вашем приложении можно смоделировать «AutoFit», отслеживая максимальную ширину данных в столбце при их записи, а затем корректируя ширину столбца в конце. Из FAQ в документации.

Вы можете обновить свой код и отслеживать длину данных столбца при записи данных внутри столбца. Это будет внутри вашего пока l oop.

def excel(request):
    ans = request.POST.getlist('ans[]')
    ans_final=[]
    rows = request.POST.get('rows')
    for each_ele in ans:
        each_ele = each_ele.split('.')
        each_ele[0] = each_ele[0][:-2]
        each_ele[1] = each_ele[1][:-2]
    fin = each_ele[0]+' - '+each_ele[1]
    ans_final.append(fin)
    workbook = xlsxwriter.Workbook('/home/Desktop/status.xlsx')
    worksheet = workbook.add_worksheet('Test_Data')
    bold = workbook.add_format({'bold': True})
    for i in range(len(ans_final)):
        worksheet.write(0, i,ans_final[i],bold)

    row_index=1
    row_count = int(rows)
    cell_width = {}
    while(row_count):
        col_index=0
        for each_ele in ans:
            cell = worksheet.cell(row_index, col_index)
            cell.value = eval(each_ele)
            if cell.column_letter in cell_width:
                cell_width[cell.column_letter].append(len(eval(each_ele)))
            else:
                cell_width[cell.column_letter] = [len(cell_value[0])]
            col_index += 1
        row_index += 1
        row_count -= 1

    for key in cell_width.keys():
        width  = max(cell_width[key])
        worksheet.column_dimensions[key].width = width + 5

   workbook.close() 
   return JsonResponse({'ok':'ok'})

Здесь я сохраняю длину каждого значения в списке, затем получаю максимальное число и затем устанавливаю его как ширину столбца. Я добавляю дополнительные 5, чтобы добавить дополнительное пространство после содержимого. Я надеюсь, что это поможет вам. :)

0 голосов
/ 24 февраля 2020

Вы можете попробовать использовать функцию worksheet.set_column(<start_col>, <end_col>, <width>)?

В качестве альтернативы, если вы хотите, чтобы она автоматически автоматически подгонялась автоматически, я думаю, вам понадобится библиотека win32com?

Вам нужно будет выполнить что-то вроде этого после того, как вы добавите и сохраните свои данные в электронную таблицу:

import win32com.client as win32_client
excel_application = win32_client.gencache.EnsureDispatch('Excel.Application')
workbook = excel_application.Workbooks.Open(`<path_to_file>`)
worksheet = workbook.Worksheets("Test_Data")
worksheet.Columns.AutoFit()
workbook.Save()
excel_application.Application.Quit()
...