Source code for txt2xls.writer

# coding=utf-8
"""
"""
__author__ = 'Alisue <lambdalisue@hashnote.net>'
import numpy as np
from xlwt import Formula
from xlwt import Workbook
from xlwt.Utils import rowcol_pair_to_cellrange
from maidenhair.utils.peakset import find_peakset
from txt2xls.writer.utils import ensure_iterable
from txt2xls.writer.utils import prefer_alphabet
from txt2xls.writer.utils import get_sheet_name
from txt2xls.function import parse_function


[docs]class Writer(object): def __init__(self, conf): self.default_filename = conf['default_filename'] def config_peakset(conf): self.peakset_method = conf['method'] self.peakset_basecolumn = conf['basecolumn'] self.peakset_where_function = parse_function(conf['where_function']) config_peakset(conf['peakset'])
[docs] def write(self, collection, filename=None, fail_silently=False): # create new book book = Workbook() # write dataset for name, dataset in collection.items(): self._write_dataset(dataset, book) # write peakset if there are more than single dataset if len(dataset) > 1: sheet = book.add_sheet('peakset') offsets = [0, 1] for name, dataset in collection.items(): # write classify name # Note: +1 for heading line sheet.write(offsets[0]+1, 0, get_sheet_name(name)) # write peakset self._write_peakset(dataset, offsets, sheet, self.peakset_basecolumn, self.peakset_method, self.peakset_where_function) # update offsets offsets[0] += len(dataset) + 1 # save
book.save(filename or self.default_filename) def _write_axis_header(self, a, axis, offsets, sheet): """ Write axis header Args: a (int): An index of the axis axis (iterable): An axis offsets (list): A list of row and column offsets sheet (instance): An instance of xlwt sheet Returns: header: A list of header strings """ # find the maximum number of columns ncol = max([len(columns) for columns in axis]) # create alphabetic headers header = ["%s %d" % (prefer_alphabet(a), i+1) for i in range(ncol)] # are Avg and Std columns required? avg_required = ncol > 1 std_required = ncol > 2 # add Avg and/or Std columns if these are required if avg_required: header.append('Avg') if std_required: header.append('Std') # write header for c, cell in enumerate(header): sheet.write(offsets[0], offsets[1]+c, cell) return header def _write_axes(self, axes, offsets, sheet): """ Write axes Args: axes (list): A list of axes offsets (list): A list of row and column offsets sheet (instance): An instance of xlwt sheet """ for a, axis in enumerate(axes): # ensure axis is iterable axis = ensure_iterable(axis) # write header header = self._write_axis_header(a, axis, offsets, sheet) # write data for r, columns in enumerate(axis): for c, cell in enumerate(columns): sheet.write(offsets[0]+1+r, offsets[1]+c, cell) # create cell range crange = rowcol_pair_to_cellrange( offsets[0]+1+r, offsets[1], offsets[0]+1+r, offsets[1] + len(columns) - 1) # Add average if it is required if 'Avg' in header: ind = header.index('Avg') sheet.write(offsets[0]+1+r, offsets[1]+ind, Formula('average(%s)' % crange)) # Add stdev if it is required if 'Std' in header: ind = header.index('Std') sheet.write(offsets[0]+1+r, offsets[1]+ind, Formula('stdev(%s)' % crange)) # update column offset offsets[1] += len(header) + 1 def _write_dataset(self, dataset, book): """ Write dataset Args: dataset (list): A list of data book (instance): An instance of xlwt book """ for i, data in enumerate(dataset): # create sheet name from dataset name sheet_name = get_sheet_name(data[0]) # create sheet sheet = book.add_sheet(sheet_name) # write axes self._write_axes(data[1:], [0, 0], sheet) def _write_peakset(self, dataset, offsets, sheet, peakset_basecolumn, peakset_method, peakset_where_function): """ Write peakset of the dataset Args: dataset (list): A list of data offsets (list): A list of row and column offsets sheet (instance): An instance of xlwt sheet instance Returns: sheet: An instance of xlwt sheet """ # write filenames for r, data in enumerate(dataset): name = get_sheet_name(data[0]) # Note: +1 for heading line sheet.write(offsets[0]+r+1, offsets[1], name) # write peakset # Note: dataset which passed to the maidenhair find_peakset # should not contain filename column so remove it. dataset = [data[1:] for data in dataset] peakset = find_peakset(dataset, basecolumn=peakset_basecolumn, method=peakset_method, where=peakset_where_function)
self._write_axes(peakset, [offsets[0], offsets[1]+1], sheet)