Python 使用Django下载xlsx格式的SQL数据
我必须编写一个函数,在输入时有一个表名和查询的条件/过滤器,在输出时返回一个链接,客户端(浏览器)应自动下载该链接 如何使用python/django实现此任务 例如,我写了一小段代码,但我不确定它是否正常工作,并且没有实现查询条件解析(我不知道如何实现它): 直接_db.py:Python 使用Django下载xlsx格式的SQL数据,python,django,excel,pandas,Python,Django,Excel,Pandas,我必须编写一个函数,在输入时有一个表名和查询的条件/过滤器,在输出时返回一个链接,客户端(浏览器)应自动下载该链接 如何使用python/django实现此任务 例如,我写了一小段代码,但我不确定它是否正常工作,并且没有实现查询条件解析(我不知道如何实现它): 直接_db.py: from django.db import connection class DirectSQL: def __init__(self,in_sql): self.sql=in_sql
from django.db import connection
class DirectSQL:
def __init__(self,in_sql):
self.sql=in_sql
self.cursor = connection.cursor()
self.cursor.execute(in_sql)
def getDescription(self):
columns = [desc[0] for desc in self.cursor.description]
return columns
def getResult(self):
row = self.cursor.fetchall()
return row
def getResultAsDict(self):
desc = self.cursor.description
return [dict(zip([col[0].lower() for col in desc], row)) for row in self.cursor.fetchall()]
excel.py:
from ecc.direct_db import DirectSQL
import pandas as ps
class Excel:
def __init__(self, table_name):
self.table_name = table_name
def convert(in_args):
q = DirectSQL("select * from self.table_name" ) # where... order by... like...
columns = [desc[0] for desc in q.getDescription()]
data = q.getResults()
df = ps.DataFrame(list(data), columns)
writer = ps.ExcelWriter('converted.xlsx')
df.to_excel(writer, sheet_name='converted')
writer.save()
我以前做过类似的工作,我使用了
xlsxwriter
,您可以查看它,了解如何创建xlsx以及如何将数据设置到其中。那么您应该需要一些视图:
from django.views.generic import View
from django.http import HttpResponse
class CreateReport(View):
def get_data(self):
# Query your data here, probably using self.request to get query string
...
return data
def generate_report(self):
# Here you will create xlsx doc and populate with data according to docs linked before
...
return workbook
def get(self, request, *args, **kwargs):
document = self.generate_report()
_file = open(document.filename, 'r')
response(HttpResponse(_file, content_type='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'))
response['Content-Disposition'] = 'attachment; filename=%s' % document.filename.split('/')[-1] # Here will return a full path, that's why probably you will need a split to get only the filename
add_never_cache_headers(response=response) # To avoid download the same file with out of date data.
return response
然后您需要一个url
from myapp.views import CreateReport
url(r'^create_report/(?P<some_param_if_needed>[-\w]+)',
CreateReport.as_view(),
name='create_report'),
我还需要从sql->xlsx转换它,但我不知道如何使用where和like筛选器将其通用化为不同的查询。只需查询数据并对其进行交互。使用什么?QuerySet?我只需要一个简单的例子,在几个查询中包含like、where和orderby?因为我正在为136个表执行“转换和下载”按钮,这些表将显示在ExtJS中,并且每个表都有自己的排序和过滤。为什么不使用Django ORM呢?
<a href="{% url 'create_report' report_name %}">Download Report</a>
get_data(self):
# Let's supose you have a `MyElements` model
elements = MyElements.objects.all()
# And let's supose you want to filter data with some GET parameter
filter = self.request.GET.get('filter_name', None)
if filter is not None:
elements = elements.filter(filter_field=filter)
return elements