'Add a data series to a chart.
Args:
options:  A dictionary of chart series options.
Returns:
Nothing.'

def add_series(self, options):

    if ('values' not in options):
        warn("Must    specify    'values'    in    add_series()")
        return
    if (self.requires_category and ('categories' not in options)):
        warn("Must    specify    'categories'    in    add_series()    for    this    chart    type")
        return
    if (len(self.series) == 255):
        warn('The    maximum    number    of    series    that    can    be    added    to    an    Excel    Chart    is    255')
        return
    values = self._list_to_formula(options.get('values'))
    categories = self._list_to_formula(options.get('categories'))
    (name, name_formula) = self._process_names(options.get('name'), options.get('name_formula'))
    cat_id = self._get_data_id(categories, options.get('categories_data'))
    val_id = self._get_data_id(values, options.get('values_data'))
    name_id = self._get_data_id(name_formula, options.get('name_data'))
    line = Shape._get_line_properties(options.get('line'))
    if options.get('border'):
        line = Shape._get_line_properties(options['border'])
    fill = Shape._get_fill_properties(options.get('fill'))
    pattern = Shape._get_pattern_properties(options.get('pattern'))
    gradient = Shape._get_gradient_properties(options.get('gradient'))
    if pattern:
        self.fill = None
    if gradient:
        pattern = None
        fill = None
    marker = self._get_marker_properties(options.get('marker'))
    trendline = self._get_trendline_properties(options.get('trendline'))
    smooth = options.get('smooth')
    y_error_bars = self._get_error_bars_props(options.get('y_error_bars'))
    x_error_bars = self._get_error_bars_props(options.get('x_error_bars'))
    error_bars = {'x_error_bars': x_error_bars, 'y_error_bars': y_error_bars}
    points = self._get_points_properties(options.get('points'))
    labels = self._get_labels_properties(options.get('data_labels'))
    invert_if_neg = options.get('invert_if_negative', False)
    x2_axis = options.get('x2_axis')
    y2_axis = options.get('y2_axis')
    if (x2_axis or y2_axis):
        self.is_secondary = True
    if (options.get('gap') is not None):
        if y2_axis:
            self.series_gap_2 = options['gap']
        else:
            self.series_gap_1 = options['gap']
    if options.get('overlap'):
        if y2_axis:
            self.series_overlap_2 = options['overlap']
        else:
            self.series_overlap_1 = options['overlap']
    series = {'values': values, 'categories': categories, 'name': name, 'name_formula': name_formula, 'name_id': name_id, 'val_data_id': val_id, 'cat_data_id': cat_id, 'line': line, 'fill': fill, 'pattern': pattern, 'gradient': gradient, 'marker': marker, 'trendline': trendline, 'labels': labels, 'invert_if_neg': invert_if_neg, 'x2_axis': x2_axis, 'y2_axis': y2_axis, 'points': points, 'error_bars': error_bars, 'smooth': smooth}
    self.series.append(series)
