Source code for plugin_xls_exporter

# Copyright (c) 2013, System Engineering Software Society
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#     * Redistributions of source code must retain the above copyright
#       notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above copyright
#       notice, this list of conditions and the following disclaimer in the
#       documentation and/or other materials provided with the distribution.
#     * Neither the name of the System Engineering Software Society nor the
#       names of its contributors may be used to endorse or promote products
#       derived from this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.
# IN NO EVENT SHALL SYSTEM ENGINEERING SOFTWARE SOCIETY BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import numpy as np
import datetime
import pandas as pd

from sympathy.api import qt as qt_compat
QtGui = qt_compat.import_module('QtGui')
from sylib.export import table as exporttable


def table2xls(table, fq_outfilename, header):
    table.to_excel(fq_outfilename, index=False, header=header)


class DataExportXLSWidget(QtGui.QWidget):
    def __init__(self, parameter_root, fq_infilename):
        super(DataExportXLSWidget, self).__init__()
        self._parameter_root = parameter_root
        self._init_gui()

    def _init_gui(self):
        vlayout = QtGui.QVBoxLayout()
        vlayout.addWidget(self._parameter_root['header'].gui())
        self.setLayout(vlayout)


[docs]class DataExportXLS(exporttable.TableDataExporterBase): """Exporter for XLS files.""" EXPORTER_NAME = 'XLS' FILENAME_EXTENSION = 'xls' def __init__(self, custom_parameter_root): super(DataExportXLS, self).__init__(custom_parameter_root) if 'header' not in custom_parameter_root: custom_parameter_root.set_boolean( 'header', value=True, label='Export header', description='Export column names') def parameter_view(self, node_context_input): return DataExportXLSWidget( self._custom_parameter_root, node_context_input) def export_data(self, in_sytable, fq_outfilename, progress=None): """Export Table to XLS.""" header = self._custom_parameter_root['header'].value df = in_sytable.to_dataframe() for col_name in df: column = df[col_name] if column.dtype.kind == 'm': # Timedeltas can't be written to excel in general, but if the # delta is less than a day, it can be represented as a time. df[col_name] = pd.Series(np.zeros_like( column, 'datetime64[us]')) + column elif column.dtype.kind == 'M': # All dates before 1900-03-01 are ambiguous because # of a bug in Excel which incorrectly treats the year 1900 as a # leap year. So perhaps we shouldn't write any such dates to # xls files? If we do write them, perhaps we should give a # warning about the fact that those dates can be problematic? df.loc[column < datetime.datetime(1900, 3, 1), col_name] = np.nan table2xls(df, fq_outfilename, header)