Skip to content

Commit 52d9ed5

Browse files
authored
Merge pull request #59 from wharton/sheet_view_options
support for sheet view options
2 parents 04c5d80 + cb67e76 commit 52d9ed5

File tree

3 files changed

+55
-20
lines changed

3 files changed

+55
-20
lines changed

README.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,31 @@ class ExampleSerializer(serializers.Serializer):
191191
return color_map.get(instance.alarm_level, 'FFFFFFFF')
192192
```
193193

194+
## Configuring Sheet View Options
195+
196+
View options follow [openpyxl sheet view options](https://openpyxl.readthedocs.io/en/stable/_modules/openpyxl/worksheet/views.html#SheetView)
197+
198+
They can be set in the view as a property `sheet_view_options`:
199+
200+
```python
201+
class MyExampleViewSet(serializers.Serializer):
202+
sheet_view_options = {
203+
'rightToLeft': True,
204+
'showGridLines': False
205+
}
206+
```
207+
208+
or using method `get_sheet_view_options`:
209+
210+
```python
211+
class MyExampleViewSet(serializers.Serializer):
212+
213+
def get_sheet_view_options(self):
214+
return {
215+
'rightToLeft': True,
216+
'showGridLines': False
217+
}
218+
```
194219
## Controlling XLSX headers and values
195220

196221
### Use Serializer Field labels as header names

drf_excel/renderers.py

Lines changed: 12 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
from openpyxl.drawing.image import Image
77
from openpyxl.styles import PatternFill
88
from openpyxl.utils import get_column_letter
9+
from openpyxl.worksheet.views import SheetView
910
from openpyxl.writer.excel import save_virtual_workbook
1011
from rest_framework.fields import (
1112
BooleanField,
@@ -29,25 +30,7 @@
2930
XLSXListField,
3031
XLSXNumberField,
3132
)
32-
from drf_excel.utilities import XLSXStyle, set_cell_style
33-
34-
35-
def get_attribute(get_from, prop_name, default=None):
36-
"""
37-
Get attribute from object with name <prop_name>, or take it from function get_<prop_name>
38-
:param get_from: instance of object
39-
:param prop_name: name of attribute (str)
40-
:param default: what to return if attribute doesn't exist
41-
:return: value of attribute <prop_name> or default
42-
"""
43-
prop = getattr(get_from, prop_name, None)
44-
if not prop:
45-
prop_func = getattr(get_from, "get_{}".format(prop_name), None)
46-
if prop_func:
47-
prop = prop_func()
48-
if prop is None:
49-
prop = default
50-
return prop
33+
from drf_excel.utilities import XLSXStyle, get_attribute, set_cell_style
5134

5235

5336
class XLSXRenderer(BaseRenderer):
@@ -64,9 +47,9 @@ class XLSXRenderer(BaseRenderer):
6447
column_data_styles = None
6548
custom_mappings = None
6649
custom_cols = None
67-
sanitize_fields = True # prepend possibly malicious values with "'"
6850
list_sep = ", "
6951
body_style = None
52+
sheet_view_options = {}
7053

7154
def render(self, data, accepted_media_type=None, renderer_context=None):
7255
"""
@@ -222,6 +205,15 @@ def render(self, data, accepted_media_type=None, renderer_context=None):
222205
self._make_body(body, row, row_count)
223206
row_count += 1
224207

208+
# Set sheet view options
209+
# Example:
210+
# sheet_view_options = {
211+
# 'rightToLeft': True,
212+
# 'showGridLines': False
213+
# }
214+
self.sheet_view_options = get_attribute(drf_view, "sheet_view_options", dict())
215+
self.ws.views.sheetView[0] = SheetView(**self.sheet_view_options)
216+
225217
return save_virtual_workbook(wb)
226218

227219
def _check_validation_data(self, data):

drf_excel/utilities.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,24 @@ def __init__(self, style_dict=None):
5353
)
5454

5555

56+
def get_attribute(get_from, prop_name, default=None):
57+
"""
58+
Get attribute from object with name <prop_name>, or take it from function get_<prop_name>
59+
:param get_from: instance of object
60+
:param prop_name: name of attribute (str)
61+
:param default: what to return if attribute doesn't exist
62+
:return: value of attribute <prop_name> or default
63+
"""
64+
prop = getattr(get_from, prop_name, None)
65+
if not prop:
66+
prop_func = getattr(get_from, "get_{}".format(prop_name), None)
67+
if prop_func:
68+
prop = prop_func()
69+
if prop is None:
70+
prop = default
71+
return prop
72+
73+
5674
def get_setting(key, default=None):
5775
return getattr(django_settings, "DRF_EXCEL_" + key, default)
5876

0 commit comments

Comments
 (0)