Excel экспорт и тестирование файла Excel API - PullRequest
0 голосов
/ 02 февраля 2019

Я тестирую drf api, который принимает файл Excel в качестве входных данных.поэтому я хочу создать книгу Excel с именем Sheet1, потому что мой API написан в этом формате, и после создания книги я сохраняю в своем приложении, но я не могу указать путь к нему, чтобы мой API мог взять файл Excel

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

my putput:

 xls
<HttpResponse status_code=200, "application/vnd.ms-excel"> responsefffffffffff
<_io.TextIOWrapper name='drftesting1.xls' mode='r' encoding='UTF-8'> fileee
E
======================================================================
ERROR: upload_staff_test (accounts.tests.JWTTests)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/narayana/bin/lets_eduvate/accounts/tests.py", line 376, in upload_staff_test
    resp_post = client.post('/accounts/teacherexcel/', data=bulk, HTTP_AUTHORIZATION=self.auth, format='json')
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/test.py", line 300, in post
    path, data=data, format=format, content_type=content_type, **extra)
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/test.py", line 212, in post
    data, content_type = self._encode_data(data, format, content_type)
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/test.py", line 184, in _encode_data
    ret = renderer.render(data)
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/renderers.py", line 105, in render
    allow_nan=not self.strict, separators=separators
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/utils/json.py", line 28, in dumps
    return json.dumps(*args, **kwargs)
  File "/usr/lib/python3.6/json/__init__.py", line 238, in dumps
    **kw).encode(obj)
  File "/usr/lib/python3.6/json/encoder.py", line 199, in encode
    chunks = self.iterencode(o, _one_shot=True)
  File "/usr/lib/python3.6/json/encoder.py", line 257, in iterencode
    return _iterencode(o, 0)
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/utils/encoders.py", line 67, in default
    return tuple(item for item in obj)
  File "/home/narayana/.local/lib/python3.6/site-packages/rest_framework/utils/encoders.py", line 67, in <genexpr>
    return tuple(item for item in obj)
  File "/usr/lib/python3.6/codecs.py", line 321, in decode
    (result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 14: invalid start byte

 def post_excel(self):
    data = [['Designation','Role','Department','Staff 
    Name','Mobile','Email','Address','Erp Code'],
      ['Call center agent','teacher', 'Marketing', 'abctest',  
   '1231231234', 'test@gmail.com', 'ewerq,sdfa', '5677ERP'],
      ['Digital executive','planner', 'maths', 'abctest2', 
   '1231231234', 'test2@gmail.com', 'dfsfsdf,wefwef', '90765ERP']]

    response = HttpResponse(content_type='application/vnd.ms-excel')
    response['Content-Disposition'] = 'attachment; 
   filename=stafftest.xlsx'
    xlsx_data = self.WriteToExcel(data)
    response.write(xlsx_data)
    return response


def WriteToExcel(self, data):
    output = io.StringIO()
    workbook = xlsxwriter.Workbook(output)
    header = workbook.add_format({
    'bg_color': '#F7F7F7',
    'color': 'black',
    'align': 'center',
    'valign': 'top',
    'border': 1
    })
    workbook = xlsxwriter.Workbook("drftesting1.xls")

    worksheet_s = workbook.add_worksheet("Sheet1")
    row_num = -1

    for row in data:
        row_num = row_num + 1
        for col_num in range(len(row)):
            worksheet_s.write(row_num, col_num, row[col_num], 
    header)

    workbook.close()
    xlsx_data = output.getvalue()
    print(xlsx_data,'xls')
    return xlsx_data



def upload_staff_test(self):
    academic_obj = self.acadsession_test()
    branch_obj = self.branch_test()
    grade_obj = self.grade_test()

    myfile1 = self.post_excel()
    print(myfile1,'responsefffffffffff')
    file_path = "drftesting1.xls"
    f = open(file_path, "r", )
    print(f,'fileee')


    bulk = {"branchId_": branch_obj['id'] ,"datafile": f}
    client = APIClient()
    resp_post = client.post('/accounts/teacherexcel/', data=bulk, 
     HTTP_AUTHORIZATION=self.auth, format='json')
    print(resp_post.data,'post')

api:

def Uploadteacher(request):
   if request.method == 'POST':
    print(request.POST,'pooss')
    myfile = request.FILES['datafile']
    print(myfile)
    branch_detail = request.POST.get('branchId')

    wb = openpyxl.load_workbook(myfile)
    # excel_type = request.POST.get("resultType")
    worksheet = wb["Sheet1"]
    excel_data = list()

    for row in worksheet.iter_rows():
        row_data = list()

2-й метод

   def generate_file_xls(self):
    try:
        myfile = open('test.xlsx', 'wb')
        wr = csv.writer(myfile)
        wr.writerow(('Designation','Role','Department','Staff 
     Name','Mobile','Email','Address','Erp Code'))
        wr.writerow(('Call center agent','teacher', 'Marketing', 
    'abctest', '1231231234', 'test@gmail.com', 'ewerq,sdfa', 
    '5677ERP'))
        wr.writerow(('Digital executive','planner', 'maths', 
 'abctest2', '1231231234', 'test2@gmail.com', 'dfsfsdf,wefwef', 
 '90765ERP'))
    finally:
        myfile.close()

    return myfile

Когда я использовал 2-й метод, лист Excel был создан и использовался для правильного ввода, но я хочу, чтобы он был в рабочей книге, тогда только мойкод будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...