Как сделать ссылку на скачивание внутри excel автосохранением

Я пытался сделать файл excel, используя openpyxl v3.1.2 в Django, Python v3.9, файл excel содержит ссылки, отображаемые как 'Click Here', это ссылки на файлы, несмотря на то, что ссылки открываются правильно, но они не сохраняются в машину...

То есть они открываются в браузере или в соответствующей программе, но не сохраняются (не загружаются) на мою машину.

Как сделать так, чтобы они загружались прямо на мою машину, как при скачивании файла из интернета.

вот мой код:

#views.py 
def export_applicants_xls(request, pk, applicant_id=None):
    job = get_object_or_404(Job, pk=pk)
    if applicant_id:
        candidate_list = Applicant.objects.filter(job=pk, pk=applicant_id)
    else:
        candidate_list = Applicant.objects.filter(job=pk)

    if not candidate_list:
        messages.error(request, _('No applicants for this job'), 'danger')
        return redirect('employer-job-detail', pk=pk)

    response = HttpResponse(content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    if applicant_id:
        response['Content-Disposition'] = f'attachment; filename=applicant_{applicant_id}_details.xlsx'
    else:
        response['Content-Disposition'] = f'attachment; filename=all_applicants_#{job.slug}.xlsx'

    wb = Workbook()
    ws = wb.active
    ws.title = 'Applicants'

    # Set header row in bold
    header_font = Font(bold=True)
    columns = [ 'CV File', 'ID card', 'Tawjihi file', 'University File', 'Experience File', 'Master file', 'Profession', 'Injury Insurance', 'Membership File', 'Temporary Membership']
 

  
    for col_num, column in enumerate(columns, 1):
        cell = ws.cell(row=1, column=col_num, value=column)
        cell.font = header_font
        ws.column_dimensions[get_column_letter(col_num)].width = 15  # Adjust column width

    # Populate data rows
    for row_num, applicant in enumerate(candidate_list, 2):
        row_data = [
            applicant.get_file_url('cv_file', request),
            applicant.get_file_url('id_card', request),
            applicant.get_file_url('tawjihi_file', request),
            applicant.get_file_url('uni_file', request),
            applicant.get_file_url('experience_file', request),
            applicant.get_file_url('master_file', request),
            applicant.get_file_url('profession_file', request),
            applicant.get_file_url('injury_insurance', request),
            applicant.get_file_url('membership_file', request),
            applicant.get_file_url('temporary_membership', request),
        ]

       
        for col_num, value in enumerate(row_data, 1):
            cell = ws.cell(row=row_num, column=col_num, value=value)
            if col_num in [34, 35, 36, 37, 38, 39, 40, 41, 42, 43]:
                if value:  # Check if the URL is not None
                    link_1(cell, value, display='Click Here')

    # Save workbook to response
    output = BytesIO()
    wb.save(output)
    response.write(output.getvalue())
    return response


def link_1(cell, link, display=None):
    cell.hyperlink = link
    cell.font = Font(u='single', color=colors.BLUE)
    if display is not None:
        cell.value = display

#models.py
   def get_file_url(self, field_name, request: HttpRequest):
        file_field = getattr(self, field_name)
        if file_field:
            return request.build_absolute_uri(f"{settings.MEDIA_URL}{str(file_field)}")
        return None

Вы можете использовать FileResponse от Django.

    # Save workbook to response
    output = BytesIO()
    wb.save(output)
    output.seek(0)  # Rewind the buffer to the beginning after writing

    # Create a FileResponse with the BytesIO object as the file, and set the appropriate content type
    response = FileResponse(output, as_attachment=True, filename='your_workbook_name.xlsx', content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')

    # Return the response
    return response
Вернуться на верх