django导入导出如何格式化导出的excel';s细胞?

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')

有什么方法可以格式化导出的excel文件吗?导出文件时,列太小,无法容纳文字。我是新来的,所以任何帮助都将不胜感激

如果django导入导出无法执行此操作,那么是否有其他方法将数据库信息导出为excel并能够格式化文件

实际上有人问了一个类似的问题,但没有答案:

我在admin.py中的一些代码

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导出代码
注册您自己的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
有一个新的,但它似乎没有太多的牵引力。