2015-01-27 2 views
0

Я использую xlrd и csv python для синтаксического анализа xls в csv. Когда пользователь загружает файл xls или xlsx, я могу разбирать и генерировать csv. Хотя он генерирует фактический файл, вместо этого я хочу обновить или создать новый объект InMemoryUploadFile, который я могу использовать для создания записи с помощью объекта FileField. Есть ли способ сделать это? Я попытался найти примеры, хотя большинство примеров для файлов изображений для InMemoryUploadFile.Преобразование xls в csv и создание/обновление InMemoryUploadedFile Django

Вот пример кода, я пробовал -

import csv 
    import xlrd 
    import StringIO 
    from django.core.files.uploadedfile import InMemoryUploadedFile   
    ....... 
    ....... 

    #xls_file is excel file 
    file_name = '%s.csv'%(xls_file.name) 
    workbook = xlrd.open_workbook(file_contents=xls_file.read()) 
    all_worksheets = workbook.sheet_names() 

    # for now starting with reading the first sheet 
    worksheet_name = all_worksheets[0] 
    worksheet = workbook.sheet_by_name(worksheet_name) 

    csv_output = StringIO.StringIO() 
    csv_data = [] 
    for rownum in xrange(worksheet.nrows): 
     csv_data.append(
      [unicode(
       entry).encode("utf-8") for entry in worksheet.row_values(
       rownum)]) 
    writer = csv.writer(csv_output) 
    for row in csv_data: 
     writer.writerow(csv_data) 

    csv_file = InMemoryUploadedFile(writer, None, file_name, 'text/csv', 
           None, 'utf-8') 
    return csv_file 

ответ

0

Вы можете попробовать использовать ContentFile вместо этого? Original tutorial

from django.core.files.base import ContentFile 
def save_file(csv_output): 
    mymodel = MyModel.objects.get(id=1) 
    file_content = ContentFile(csv_output.getvalue()) 
    mymodel.myfilefield.save(request.FILES['yourupload'].name, file_content) 
Смежные вопросы