gpt4 book ai didi

django-import-export 如何格式化导出的excel 单元格?

转载 作者:行者123 更新时间:2023-12-01 13:01:26 25 4
gpt4 key购买 nike

有什么方法可以格式化导出的 excel 文件吗?当我导出文件时,该列太小,无法容纳单词。我对此很陌生,因此非常感谢您的帮助。

Exported excel file looks something like this, the title cell is too small to fit the words.

如果 django-import-export 无法做到这一点,那么是否有任何其他方法可以将数据库信息导出为 excel 并能够格式化文件?

居然有人问过类似的问题,但是没有答案:

Is there a way to manage the column/cell widths when exporting to Excel with django-import-export?

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

在 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。看看来源: https://github.com/django-import-export/django-import-export/blob/2.0.2/import_export/admin.py#L461您可以覆盖此方法,并将 export_data = file_format.export_data(data) 更改为 export_data = file_format.export_data(data, resource_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

关于django-import-export 如何格式化导出的excel 单元格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53093812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com