Source code for stoqlib.exporters.xlsexporter

# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4

##
## Copyright (C) 2012-2013 Async Open Source <http://www.async.com.br>
## All rights reserved
##
## This program is free software; you can redistribute it and/or modify
## it under the terms of the GNU Lesser General Public License as published by
## the Free Software Foundation; either version 2 of the License, or
## (at your option) any later version.
##
## This program is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU Lesser General Public License for more details.
##
## You should have received a copy of the GNU Lesser General Public License
## along with this program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
"""XLS exporter"""

import datetime
import tempfile

from kiwi.currency import currency
import xlwt

from stoqlib.exporters.xlsutils import (get_date_format,
                                        get_number_format,
                                        write_app_hyperlink,
                                        write_app_logo)
from stoqlib.lib.translation import stoqlib_gettext

_ = stoqlib_gettext


[docs]class XLSExporter(object): def __init__(self, name=None): self._current_column = 1 self._n_columns = -1 self._column_styles = None self._headers = None self._wb = xlwt.Workbook(encoding='utf8') if not name: name = _('Stoq sheet') self._ws = self._wb.add_sheet(name) self._setup() # # Private # def _setup(self): self._header_font = xlwt.Font() self._header_font.bold = True self._header_style = xlwt.XFStyle() self._header_style.font = self._header_font self._style_date = xlwt.XFStyle() self._style_date.num_format_str = get_date_format() self._style_general = xlwt.XFStyle() self._style_general.num_format_str = 'general' self._style_number = xlwt.XFStyle() self._style_number.num_format_str = get_number_format() def _add_row(self, columns, style=None): if len(columns) - 1 > self._n_columns: raise ValueError(columns, self._n_columns) for i, column in enumerate(columns): self._write_one(i, column, style=style) self._current_column += 1 def _write_one(self, i, data, style=None): if style is None: style = self._column_styles[i] if data is None: data = '' else: if isinstance(data, datetime.date): data = data.strftime('%Y-%m-%d') elif isinstance(data, str): data = unicode(data, 'utf-8') self._ws.write(self._current_column, i, data, style) # # Public API #
[docs] def set_column_headers(self, headers): self._headers = headers
[docs] def set_column_types(self, column_types): css = [] for i, column_type in enumerate(column_types): if column_type in (datetime.datetime, datetime.date): style = self._style_date elif column_type in [int, long, float, currency]: style = self._style_number else: style = self._style_general css.append(style) self._column_styles = css self._n_columns = len(column_types)
[docs] def add_cells(self, cells): write_app_logo(self._ws) write_app_hyperlink(self._ws, 0) if self._headers: self._add_row(self._headers, style=self._header_style) for y, line in enumerate(cells): self._add_row(line)
[docs] def save(self, prefix=''): if prefix: prefix = 'Stoq-%s-' % (prefix, ) else: prefix = 'Stoq-' temporary = tempfile.NamedTemporaryFile( prefix=prefix, suffix='.xls', delete=False) self._wb.save(temporary.name) return temporary
[docs] def add_from_object_list(self, objectlist, data=None): columns = objectlist.get_visible_columns() self.set_column_types([ c.data_type for c in columns]) self.set_column_headers([ getattr(c, 'long_title', None) or c.title for c in columns]) self.add_cells(objectlist.get_cell_contents(data))