Skip to main content

用于电子表格 (xlsx) 文件的 Django REST Framework 渲染器。

项目描述

Django REST 框架渲染器:XLSX

drf-renderer-xlsx为 Django REST 框架提供 XLSX 渲染器。它使用 OpenPyXL 创建电子表格并返回数据。

要求

它可能适用于早期版本,但已经过以下测试:

  • 蟒蛇> = 3.6
  • Django >= 2.2
  • Django REST 框架 >= 3.6
  • OpenPyXL >= 2.4

安装

pip install drf-renderer-xlsx

然后将以下内容添加到您的REST_FRAMEWORK设置中:

    REST_FRAMEWORK = {
        ...

        'DEFAULT_RENDERER_CLASSES': (
            'rest_framework.renderers.JSONRenderer',
            'rest_framework.renderers.BrowsableAPIRenderer',
            'drf_renderer_xlsx.renderers.XLSXRenderer',
        ),
    }

为了避免没有文件名的文件流式传输(浏览器通常默认为文件名“下载”,没有扩展名),我们需要使用 mixin 来覆盖Content-Disposition标题。如果没有filename提供,它将默认为export.xlsx. 例如:

from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer

from .models import MyExampleModel
from .serializers import MyExampleSerializer

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
    queryset = MyExampleModel.objects.all()
    serializer_class = MyExampleSerializer
    renderer_classes = (XLSXRenderer,)
    filename = 'my_export.xlsx'

如果您更喜欢以编程方式提供文件名而不是属性,则XLSXFileMixin还提供了get_filename()一种可以覆盖的方法。filename

配置样式

样式可以添加到您的工作表标题、列标题行和正文行,从视图属性headercolumn_headerbodyOpenPyXL 包中的任何参数都可用于字体、对齐方式、填充和边框边(边框始终是单元格的所有边)。

class MyExampleViewSet(XLSXFileMixin, ReadOnlyModelViewSet):
    queryset = MyExampleModel.objects.all()
    serializer_class = MyExampleSerializer
    renderer_classes = (XLSXRenderer,)

    column_header = {
        'titles': [
            "Column_1_name",
            "Column_2_name",
            "Column_3_name",
        ],
        'column_width': [17, 30, 17],
        'height': 25,
        'style': {
            'fill': {
                'fill_type': 'solid',
                'start_color': 'FFCCFFCC',
            },
            'alignment': {
                'horizontal': 'center',
                'vertical': 'center',
                'wrapText': True,
                'shrink_to_fit': True,
            },
            'border_side': {
                'border_style': 'thin',
                'color': 'FF000000',
            },
            'font': {
                'name': 'Arial',
                'size': 14,
                'bold': True,
                'color': 'FF000000',
            },
        },
    }
    body = {
        'style': {
            'fill': {
                'fill_type': 'solid',
                'start_color': 'FFCCFFCC',
            },
            'alignment': {
                'horizontal': 'center',
                'vertical': 'center',
                'wrapText': True,
                'shrink_to_fit': True,
            },
            'border_side': {
                'border_style': 'thin',
                'color': 'FF000000',
            },
            'font': {
                'name': 'Arial',
                'size': 14,
                'bold': False,
                'color': 'FF000000',
            }
        },
        'height': 40,
    }

您还可以在方法、、、.中动态生成get_body样式get_header属性get_column_header

def get_header(self):
    starttime, endtime = parse_times(request=self.request)
    datetime_format = "%H:%M:%S %d.%m.%Y"
    return {
        'tab_title': 'MyReport',
        'header_title': 'Report from {} to {}'.format(
            starttime.strftime(datetime_format),
            endtime.strftime(datetime_format),
        ),
        'height': 45,
        'img': 'app/images/MyLogo.png',
        'style': {
            'fill': {
                'fill_type': 'solid',
                'start_color': 'FFFFFFFF',
            },
            'alignment': {
                'horizontal': 'center',
                'vertical': 'center',
                'wrapText': True,
                'shrink_to_fit': True,
            },
            'border_side': {
                'border_style': 'thin',
                'color': 'FF000000',
            },
            'font': {
                'name': 'Arial',
                'size': 16,
                'bold': True,
                'color': 'FF000000',
            }
        }
    }

您还可以color向序列化程序添加字段并填充正文行。

class ExampleSerializer(serializers.Serializer):
    color = serializers.SerializerMethodField()

    def get_color(self, instance):
        color_map = {'w': 'FFFFFFCC', 'a': 'FFFFCCCC'}
        return color_map.get(instance.alarm_level, 'FFFFFFFF')

控制 XLSX 标头和值

使用序列化器字段标签作为标题名称

默认情况下,标头将使用与 API 返回的相同的“名称”。这可以通过xlsx_use_labels = True在您的 API 视图中进行设置来更改。

导出将使用在序列化程序中定义的标签,而不是使用字段名称。定义为的序列化器字段title = serializers.CharField(label=_("Some title"))将返回Some title而不是title,也支持翻译。如果没有设置标签,它将回退到 using title

忽略字段

默认情况下,会导出所有字段,但您可能希望从导出中排除某些字段。为此,您可以设置一个包含要排除的字段的数组:xlsx_ignore_headers = [<excluded fields>].

这也适用于嵌套字段,用点分隔(即icon.url)。

命名布尔值

True并且False因为布尔字段的值并不总是最好的表示,也不支持翻译。这可以用 来控制xlsx_boolean_labels

xlsx_boolean_labels = {True: _('Yes'), False: _('No')}将替换TrueYes和。FalseNo

格式化日期

要格式化与 DRF 返回的日期不同的日期(例如 2013-01-29T12:34:56.000000Z)xlsx_date_format_mappings,需要一个“dict”,其中字段名称作为其键,日期(时间)格式作为其值:

xlsx_date_format_mappings = {
    'created_at': '%d.%m.%Y %H:%M',
    'updated_at': '%d.%m.%Y %H:%M'
}

自定义映射

假设您有一个返回 adict而不是 simple的字段str,您可能不想返回整个对象,而只想返回它的一个值。假设status返回{ value: 1, display: 'Active' }。要返回列display中的值status,我们可以这样做:

xlsx_custom_mappings = {
    'status': 'display'
}

一个可能更常见的情况是您想要更改值的格式。xlsx_custom_mappings也将函数作为值。假设我们有一个 field description,并且出于某种奇怪的原因想要反转文本,我们可以这样做:

def reverse_text(val):
    return val[::-1]

xlsx_custom_mappings = {
    'description': reverse_text
}

发行说明

发行说明可在 GitHub 上找到

维护者

该软件包由沃顿研究数据服务部的工作人员维护。我们很高兴沃顿商学院让我们有一定的时间为开源项目做出贡献。我们添加项目所需的功能,并尽可能跟上问题和拉取请求。由于时间限制(我们的全职工作!),没有拉取请求的功能请求可能无法实现,但我们始终对新想法持开放态度,并感谢贡献和我们的包用户。

贡献者(谢谢!)

下载文件

下载适用于您平台的文件。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源分布

drf-renderer-xlsx-ko-1.0.tar.gz (13.2 kB 查看哈希

已上传 source

内置分布

drf_renderer_xlsx_ko-1.0-py3-none-any.whl (9.9 kB 查看哈希

已上传 py3