django导入导出如何格式化导出的excel';s细胞?
有什么方法可以格式化导出的excel文件吗?导出文件时,列太小,无法容纳文字。我是新来的,所以任何帮助都将不胜感激 如果django导入导出无法执行此操作,那么是否有其他方法将数据库信息导出为excel并能够格式化文件 实际上有人问了一个类似的问题,但没有答案: 我在admin.py中的一些代码django导入导出如何格式化导出的excel';s细胞?,django,excel,django-import-export,Django,Excel,Django Import Export,有什么方法可以格式化导出的excel文件吗?导出文件时,列太小,无法容纳文字。我是新来的,所以任何帮助都将不胜感激 如果django导入导出无法执行此操作,那么是否有其他方法将数据库信息导出为excel并能够格式化文件 实际上有人问了一个类似的问题,但没有答案: 我在admin.py中的一些代码 class LogResource(resources.ModelResource): date = Field(attribute='date', column_name='Date')
class LogResource(resources.ModelResource):
date = Field(attribute='date', column_name='Date')
dtime = Field(attribute='dtime', column_name='Departure Time')
pilot = Field(attribute='pilot', column_name='Pilot')
cpilot = Field(attribute='cpilot', column_name='Co-Pilot')
purpose = Field(attribute='purpose', column_name='Purpose of Flight')
others = Field(attribute='others', column_name='Others')
class Meta:
model=Log
exclude=('id',)
class LogAdmin(ExportActionModelAdmin, admin.ModelAdmin):
resource_class = LogResource
list_display = ('date', 'dtime', 'purpose', 'pilot', 'cpilot')
list_filter = ('date', 'purpose', 'pilot')
In views.py
def logentry_form_submission(request):
date = request.POST["date"]
dtime = request.POST["dtime"]
pilot = request.POST["pilot"]
cpilot = request.POST["cpilot"]
purpose = request.POST["purpose"]
others = request.POST["others"]
log_info = Log(date=date, dtime=dtime, pilot=pilot, cpilot=cpilot,
purpose=purpose, others=others)
log_info.save()
return render(request, 'myhtml/logentry_form_submission.html')
我的代码有点乱,因为我在网上学习所有东西,所以请随意改进我的代码。没有正式的方法。我可以通过以下方式解决此问题:
- 注册自己的tablib格式
- 定义每个资源的格式
- 将格式化程序回调从资源类传递到tablib导出代码
from tablib.formats import registry
from tablib.formats._xlsx import XLSXFormat
class FormattedXLSX(XLSXFormat):
@classmethod
def export_set(cls, dataset, freeze_panes=True, formatter=None):
"""Returns XLSX representation of Dataset."""
wb = Workbook()
ws = wb.worksheets[0]
ws.title = dataset.title if dataset.title else "Tablib Dataset"
cls.dset_sheet(dataset, ws, freeze_panes=freeze_panes)
### Just added this lines to original code
if formatter:
formatter(ws)
###
stream = BytesIO()
wb.save(stream)
return stream.getvalue()
registry.register("xlsx", FormattedXLSX())
调整资源类中的列宽:
class OrderResource(resources.ModelResource):
@staticmethod
def formatter(ws):
ws.column_dimensions["B"].width = 15
ws.column_dimensions["C"].width = 35
ws.column_dimensions["D"].width = 12
ws.column_dimensions["F"].width = 18
class Meta:
model = OrderFull
现在我们需要以某种方式将其传递给tablib。看看源代码:
您可以重写此方法,并将export\u data=file\u格式。export\u data(data)
更改为export\u data=file\u格式。export\u data(data,resource\u class.formatter)
(未对其进行测试)
因为我使用它的方式不同(没有管理集成),所以我可以提供一些不同的实现,但灵感来自原始的ExportMixin代码
class ImportExportView(APIView):
# ...
def get(self, request, **kwargs):
dataset = self.resource().export(self.queryset.all())
# Inject formatter function from resource
xslx = XLSX().export_data(dataset=dataset, formatter=self.resource.formatter)
response = HttpResponse(
content=xslx,
content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
)
response["Content-Disposition"] = f'attachment; filename="{self.filename}"'
return response
有一个新的,但它似乎没有太多的牵引力。