用于电子表格 (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
配置样式
样式可以添加到您的工作表标题、列标题行和正文行,从视图属性header
、column_header
、body
。OpenPyXL 包中的任何参数都可用于字体、对齐方式、填充和边框边(边框始终是单元格的所有边)。
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')}
将替换True
为Yes
和。False
No
格式化日期
要格式化与 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-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | ab45ceba71899e93f2028011c5b6c3a07751045239e370ce2e53533546c30bd9 |
|
MD5 | 8222bac3d807fd2a7988c15757196a65 |
|
布莱克2-256 | 24e5062ff31278dd2f9d7cba9776ad2c1716c23355a4489452dcc63f90cf4393 |