Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

django1.8- how to append information manually when uploading Excel and inserting into database

Tags:

python

django

enter image description here

The excel is like the left picture with 3 columns.

When inserting into database, I need to add 2 columns more manually like right picture showed and insert altogether 5 columns in database finally. These 2 additional columns information is fetched from other databases.

And another function is if there is already existing file, the newly uploaded file will override the existing one.[snippets in views.py below]

I have already tried two 3 party tools but not works, so maybe it is still better just to use the one embedded in django.

Version: Python 2.7. Excel 2013. Django1.8.

Any help is highly appreciated. Hope could provide the detail snippet for how to append these 2 columns :

uploader = request.session['uploader']
Date=request.session['date']

forms.py

from django.core.files.storage import FileSystemStorage
from financialdata.storage import OverwriteStorage

class XXXXDataForm(forms.Form):
    XXXXfile=forms.FileField(label='Select a file')

views.py

from django.core.files.storage import FileSystemStorage

def import_data(request):
    if request.method == "POST":
        form = XXXXForm(request.POST,request.FILES)
        if form.is_valid():
            newdoc= XXXX(docfile=request.FILES['docfile'])
            newdoc.save()
            return HttpResponseRedirect(reverse('homepage'))
        else:
            return HttpResponseBadRequest()
    else:
        form = XXXXForm()
    return render_to_response(
        'dataentry.html',
        {
            'form': form,
            'title': 'Import excel data into database example',
            'header': 'Please upload XXXX.xlsx:',
            'message': 'File Saved!'
        },
        context_instance=RequestContext(request))

<!--How can I embed the following part to previous part?-->

class OverwriteStorage(FileSystemStorage):
    def _save(self, name, content):
        if self.exists(name):
            self.delete(name)
        return super(OverwriteStorage, self)._save(name, content)

    def get_available_name(self, name):
        return name
like image 224
Héléna Avatar asked Dec 10 '15 08:12

Héléna


1 Answers

May be like that:

I don't run my code, it's an example

if request.method == "POST":
        form = XXXXForm(request.POST,request.FILES)
        if form.is_valid():
            docfile=request.FILES['docfile']

        if isinstance(docfile, (InMemoryUploadedFile, TemporaryUploadedFile)):
            book = xlrd.open_workbook(file_contents=docfile.read(), formatting_info=True, on_demand=True)
        else:
            book = xlrd.open_workbook(filename=docfile, formatting_info=True, on_demand=True)

        sheet = book.sheet_by_index(0)
        new_csv_file = csv.writer(open('new_filename', 'w'))
        # read file
        for line in range(1, sheet.nrows):
            new_row = [request.session.get('uploader'), request.session.get('date')]
            new_row.extend(sheet.row_values(line))                
            new_csv_file.writerow(new_row)

...

like image 194
mrvol Avatar answered Nov 13 '22 04:11

mrvol