2017-06-28 9 views
1

私はDjangoを初めて使用しており、私のアプリはExcelファイルをアップロードするためにユーザに必要です。サーバー側では、各セルでExcelファイルを読み込み、いくつかの値を追加してから値を変換し、再びExcelファイルに書き戻して添付ファイルをダウンロードします。小さなファイルに対してこのアクションを実行できますが、大きなファイルの場合はタイムアウトエラーが発生します。下記をご覧ください。Django大きなエクセルファイルをアップロードして読み書きする

enter code here 

def translatedoc(request): 
    data="" 
    convrowstr="" 
    if request.method=='POST': 
     response = StreamingHttpResponse (content_type='application/vnd.ms-excel') 

     try: 
      form=fileUpload(request.POST,request.FILES) 
      if form.is_valid(): 
       input_file=request.FILES.get('file') 
       sl=request.POST.get('fsl') 
       if sl=="Detect Language": 
        sl="auto" 
       else: 
        # get sl code from database 
        sl=languagecode.objects.filter(Language=sl).values_list('code') 
        sl=str(sl[0][0]) 
      # get tl code from database 
       tl=languagecode.objects.filter(Language=request.POST.get('ftl')).values_list('code') 
       wb = xlrd.open_workbook(file_contents=input_file.read()) 
       wb_sheet=wb.sheet_by_index(0) 
       for rownum in range(0, wb_sheet.nrows): 
        convstr="" 
        for colnum in range(0,wb_sheet.ncols): 
         try: 
          rw=wb_sheet.cell_value(rownum,colnum) 
          if type(rw)==float or type(rw)==int: 
           convstr=convstr +'<td>' + str(rw) 
          else: 
           convstr=convstr +'<td>' + rw 
         except Exception as e: 
          pass     
        if len(convstr) + len(convrowstr) >20000: 
         # translate if the length of doc exceed the limit 
         #call google api module 
         data=data + translate(convrowstr,sl,str(tl[0][0])) 
         convrowstr="" 
        if rownum==wb_sheet.nrows-1: 
         convrowstr= convrowstr + "<tr>" + convstr 
         # translate for first or last 
         #call google api module 
         data=data + translate(convrowstr,sl,str(tl[0][0])) 
         convrowstr=""      
        convrowstr= convrowstr + "<tr>" + convstr 
        log.error(rownum) 
      if len(data)>1: 
       sio=StringIO.StringIO() 
       try: 
        workbook = xlwt.Workbook() 
        sheet = workbook.add_sheet("output")     
        row=0 
        for rw in data.split("<tr>")[1:]: 
         col=0 
         for cl in rw.split("<td>")[1:]: 
          try: 
           sheet.write(row,col,cl.split("<b>")[1].split("</b>")[0]) 
          except Exception as e: 
           pass 
          col+=1 
         row+=1 
        workbook.save(sio) 
        sio.seek(0) 
        sv=sio.getvalue() 

        response['Content-Disposition'] = 'attachment; filename=Output.xls' 
        return response 
       except Exception as e: 
        log.error(e) 

     except Exception as e: 
      log.error(e) 
+0

コンテンツをサーバーにアップロードしてから処理するのではなく、コンテンツをストリーミングしています。私はあなたがそれをアップロードする方が良いと思っています。コピーをしてから新しいものをダウンロードしてください。 –

+0

返信ありがとうございますが、私はサーバーにファイルを保存したくありません。問題は、1分後にタイムアウトエラーが発生するため、タイムアウトを増やす方法があります。 – Chaudhary

+0

あなたはそれを整理してうれしいです=)一時的に保存することを意味していましたが、明確にするために、@Aman Kumarの提案が優れています。 –

答えて

1

大きなファイルをアップロードするためにスルーセロリを実行できます。セロリでファイルを読むことができます。

+0

ありがとうAmanそれは完璧に働いた.. – Chaudhary

関連する問題