Я тестирую 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 был создан и использовался для правильного ввода, но я хочу, чтобы он был в рабочей книге, тогда только мойкод будет работать