Как сделать функцию загрузки excel в python
The code below is a function to download a table as an Excel file. Table is being merged using DataTable jquery. The problem with the code below is that only two rows are compared and merged. I want to merge the whole data. Please help.
The reason that 'register_date_str' is printed twice in values_list is because in the case of values_list, student[0] cannot be used twice. In this case, the value is not output when downloading Excel. What's the best way to use Excel without printing the same value to valuse_list twice?
worksheet.write(row, col, str(student[2]) + '-' + str(student[3])) -> Only the 'name' value is printed, not combining two values in one cell. Why?
def download_excel: output = io.BytesIO() workbook = xlsxwriter.Workbook(output) worksheet = workbook.add_worksheet() d_format = '%Y-%m-%d' border_center = workbook.add_format({'align': 'center', 'border': 1, 'bold': 1}) bold = workbook.add_format({'bold': True, 'border': 1, 'align': 'center', 'valign': 'vcenter', 'text_wrap': True}) student_header = [["weekday name", 5], ["register_date", 10], ["name - sex", 30], ["phone_number", 15], ["class_name", 15], ["teacher", 15]] row = 0 col = 0 for a_header, width in student_header: worksheet.write(row, col, a_header, border_center) if width is not None: worksheet.set_column(col, col, width) col += 1 students = Student.objects.filter(is_deleted=False).order_by('register_date') \ .annotate(register_date_str=Cast('register_date', CharField())) \ .values_list('register_date_str', 'register_date_str', 'name', 'sex', 'phone_number', 'class_name', 'teacher') row += 1 col = 0 for student in students: worksheet.write(row, col, student[0]) col += 1 worksheet.write(row, col, student[1]) col += 1 worksheet.write(row, col, str(student[2]) + '-' + str(student[3])) col += 1 worksheet.write(row, col, student[4]) col += 1 worksheet.write(row, col, student[5]) col += 1 worksheet.write(row, col, student[6]) row += 1 col = 0 abc_dict = {0: 'A', 1: 'B', 2: 'C', 3: 'D', 4: 'E', 5: 'F'} for i in range(len(students)): if i == 0: worksheet.write_row('A2', students[0], bold) else: for j in range(len(students[0]) - 2): if students[i][j] == students[i - 1][j]: worksheet.merge_range(abc_dict[j] + str(i + 1) + ':' + abc_dict[j] + str(i + 2), students[i - 1][j], bold) else: worksheet.write_row('A' + str(i + 2), students[i], bold) workbook.close() output.seek(0) filename = 'student_list.xlsx' try: filename.encode('ascii') file_expr = 'filename="{}"'.format(filename) except UnicodeEncodeError: file_expr = "filename*=utf-8''{}".format(quote(filename)) response = HttpResponse(output, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') response['Content-Disposition'] = 'attachment; ' + file_expr return response