Skip to content

Commit

Permalink
Merge remote-tracking branch 'tmog/xls_export'
Browse files Browse the repository at this point in the history
  • Loading branch information
mauritsvanrees committed Nov 18, 2016
2 parents c71a53b + d8a03a2 commit 70d0bd8
Show file tree
Hide file tree
Showing 2 changed files with 79 additions and 11 deletions.
4 changes: 4 additions & 0 deletions CHANGES.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,10 @@ Change History

- Use formActionOverride action in embedded view. [fRiSi]

- Add option to download data from saveDataAdapter in excel format
Excel download depends on the availability of the 'xlwt' python package.
[tmog]


1.8.1 (2016-05-01)
------------------
Expand Down
86 changes: 75 additions & 11 deletions Products/PloneFormGen/content/saveDataAdapter.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,14 @@
__author__ = 'Steve McMahon <steve@dcn.org>'
__docformat__ = 'plaintext'

try:
import xlwt
has_xls = True
except ImportError:
has_xls = False

from urlparse import urlparse

from AccessControl import ClassSecurityInfo

from BTrees.IOBTree import IOBTree
Expand Down Expand Up @@ -434,6 +442,49 @@ def download_csv(self, REQUEST=None, RESPONSE=None):

return '%s%s' % (res, self.getSavedFormInputForEdit())

security.declareProtected(DOWNLOAD_SAVED_PERMISSION, 'download_xls')
def download_xls(self, REQUEST=None, RESPONSE=None):
# """Download the saved data
# """
filename = self.id
if filename.find('.') < 0:
filename = '%s.xls' % filename
header_value = contentDispositionHeader('attachment', self.getCharset(), filename=filename)
RESPONSE.setHeader("Content-Disposition", header_value)
RESPONSE.setHeader("Content-Type", 'application/vnd.ms-excel')

xldoc = xlwt.Workbook(encoding=self.getCharset())
sheet = xldoc.add_sheet(self.Title())

row_num = 0

if getattr(self, 'UseColumnNames', False):
col_names = self.getColumnNames(excludeServerSide=False)
for idx, label in enumerate(col_names):
sheet.write(0, idx, label.encode(self.getCharset()))
row_num += 1

for row in self.getSavedFormInput():
for col_num, col in enumerate(row):
if type(col) is unicode:
col = col.encode(self.getCharset())

if urlparse(col).scheme in ('http', 'https'):
col = xlwt.Formula('HYPERLINK("%(url)s")' % dict(url=col))
else:
for format in (int, float):
try:
col = format(col)
break
except ValueError:
pass

sheet.write(row_num, col_num, col)
row_num += 1

string_buffer = StringIO()
xldoc.save(string_buffer)
return string_buffer.getvalue()

security.declareProtected(DOWNLOAD_SAVED_PERMISSION, 'download')
def download(self, REQUEST=None, RESPONSE=None):
Expand All @@ -443,6 +494,9 @@ def download(self, REQUEST=None, RESPONSE=None):
format = getattr(self, 'DownloadFormat', 'tsv')
if format == 'tsv':
return self.download_tsv(REQUEST, RESPONSE)
if format == 'xls':
assert has_xls, 'xls download not available'
return self.download_xls(REQUEST, RESPONSE)
else:
assert format == 'csv', 'Unknown download format'
return self.download_csv(REQUEST, RESPONSE)
Expand Down Expand Up @@ -490,6 +544,8 @@ def formatMIME(self):
format = getattr(self, 'DownloadFormat', 'tsv')
if format == 'tsv':
return 'text/tab-separated-values'
if format == 'xls':
return 'application/vnd.ms-excel'
else:
assert format == 'csv', 'Unknown download format'
return 'text/comma-separated-values'
Expand Down Expand Up @@ -530,19 +586,27 @@ def vocabExtraDataDL(self):

def vocabFormatDL(self):
# """ returns vocabulary for format """

return DisplayList((
('tsv',
self.translate(msgid='vocabulary_tsv_text',
domain='ploneformgen',
default='Tab-Separated Values')
),
('csv',
self.translate(msgid='vocabulary_csv_text',
formats = [
('tsv',
self.translate(msgid='vocabulary_tsv_text',
domain='ploneformgen',
default='Tab-Separated Values')
),
('csv',
self.translate(msgid='vocabulary_csv_text',
domain='ploneformgen',
default='Comma-Separated Values')
),
]
if has_xls:
formats.append(
('xls',
self.translate(msgid='vocabulary_xls_doc',
domain='ploneformgen',
default='Comma-Separated Values')
default='Excel document')
),
))
)
return DisplayList(formats)



Expand Down

0 comments on commit 70d0bd8

Please sign in to comment.