2017-01-31 1 views
1

Maintenant, je n'ai pas de problèmes au sujet de la conversion de ce csv ou en le téléchargeant j'ai un problème d'économie à django modèle à filefield L'exemple de code minmized:Convertir CSV pour Excel à l'aide xlsxwriter et enregistrez-le django Modèle

def download_convert_reports_s3_temp(): 
    def get_report_url(): 
     bucket_name = 'temp_bucket' 
     conn = boto.connect_s3(AWS_ACCESS_KEY_ID, 
           AWS_SECRET_ACCESS_KEY) 
     bucket = conn.get_bucket(bucket_name) 
     key = bucket.get_key('TEMP_2017-01-10.csv') 
     return key.generate_url(expires_in=600) 

    def get_doc(): 
     return Doc.objects.get(owner=User.objects.first()) 

    def get_file(file): 
     file_temp = NamedTemporaryFile(delete=True) 
     file_temp.write(file.content) 
     file_temp.flush() 
     return File(file_temp) 

    def convert_csv_to_xlsx(): 
     request = requests.get(get_report_url()) 
     csvfile = get_file(request) 

     from django.conf import settings 
     excelFile = xlsxwriter.Workbook('report.xlsx', { 
              'strings_to_numbers': True, 
              'default_date_format': 'yy/mm/dd', 
              'tmpdir': settings.MEDIA_ROOT + 
                 '/documents/%s'.format(file.name.rsplit('.')[0] + '.xlsx') 
             } 

     excelFile = get_doc().file 
     worksheet = excelFile.add_worksheet() 
     worksheet.write('A1', 'data') 
     worksheet.write('B1', 'data') 
     worksheet.write('C1', 'data') 
     worksheet.write('D1', 'data') 
     worksheet.write('E1', 'data') 
     # Start from the first cell. Rows and columns are zero indexed. 
     row = 1 
     col = 0 
     with open(csvfile, 'rb') as f: 
      content = csv.reader(f) 
      # Iterate over the data and write it out row by row. 
      for row_data in content: 
       for data in row_data: 
        worksheet.write(row, col, data) 
        col += 1 
       row += 1 
       col = 0 

     f.close() 
     excelFile.close() 

    return convert_csv_to_xlsx() 

maintenant, le problème que je ne sais vraiment pas enregistrer ce fichier excel pour le doc.file, et j'ai essayé django fieldfile save

---> 19 read = property(lambda self: self.file. AttributeError: 'Workbook' object has no attribute 'read' Toute suggestion Merci

+0

Copie possible de [Définir le FileField de Django dans un fichier existant] (http://stackoverflow.com/questions/8332443/set-djangos-filefield-to-an-existing-file) – Bitonator

Répondre

1
def convert_csv_to_xlsx(): 
    csvfile = get_file() 
    from django.conf import settings 
    excelFile = xlsxwriter.Workbook(filename=settings.MEDIA_ROOT + '/documents%s' % (
     csvfile.name.rsplit('.')[0] + '.xlsx')) 
    bold = excelFile.add_format({'bold': 1, 'align': 'left', 'bg_color': 'red', 'color': 'white'}) 
    worksheet = excelFile.add_worksheet() 
    worksheet.set_column(0, 4, width=15) 
    worksheet.write('A1', 'Sender MSISDN', bold) 
    worksheet.write('B1', 'Reciever MSISDN', bold) 
    worksheet.write('C1', 'Amount', bold) 
    worksheet.write('D1', 'Transaction ID', bold) 
    worksheet.write('E1', 'Datetime', bold) 
    # Start from the first cell. Rows and columns are zero indexed. 
    row = 1 
    col = 0 

    # Iterate over the data and write it out row by row. 


    for row_data in csv.reader(csvfile): 
     for idx, data in enumerate(row_data): 
      if idx == 0: 
       worksheet.write(row, col, data) 
      elif idx == 1: 
       worksheet.write(row, col, data) 
      elif idx == 2: 
       worksheet.write(row, col, data) 
      elif idx == 3: 
       worksheet.write(row, col, data) 
      elif idx == 4: 
       worksheet.write(row, col, data) 
      col += 1 
     row += 1 
     col = 0 
    csvfile.close() 
    doc = get_doc() 
    now = datetime.now() 

    excelFile.close() 
    doc.file.save(
     name='RECHARGE_%d-%s-%s.xlsx' % (now.year, 
             validate_date(now.month), 
             validate_date(now.day) 
             ), 
     content=File(open(settings.MEDIA_ROOT + '/documents%s' % (
      csvfile.name.rsplit('.')[0] + '.xlsx',))) 
    ) 
    os.remove(settings.MEDIA_ROOT + '/documents%s' % (
     csvfile.name.rsplit('.')[0] + '.xlsx'),)