Added chart patterns handling.

This commit is contained in:
John McNamara 2017-01-03 18:03:40 +00:00
parent c2ced78e48
commit 8ef418b034
21 changed files with 1109 additions and 17 deletions

2
.indent.pro vendored
View file

@ -57,6 +57,8 @@
-T lxw_chart_line_dash_type -T lxw_chart_line_dash_type
-T lxw_chart_marker -T lxw_chart_marker
-T lxw_chart_marker_type -T lxw_chart_marker_type
-T lxw_chart_pattern
-T lxw_chart_pattern_type
-T lxw_chart_series -T lxw_chart_series
-T lxw_chart_title -T lxw_chart_title
-T lxw_chart_type -T lxw_chart_type

View file

@ -391,6 +391,11 @@ set via the `line` format:
@image html chart_fill4.png @image html chart_fill4.png
@subsection chart_patterns Chart formatting: Pattern
TODO
@section ww_charts_limitations Chart Limitations @section ww_charts_limitations Chart Limitations
The following chart features aren't currently supported in libxlsxwriter but The following chart features aren't currently supported in libxlsxwriter but

View file

@ -82,7 +82,9 @@ STAILQ_HEAD(lxw_series_data_points, lxw_series_data_point);
#define LXW_CHART_NUM_FORMAT_LEN 128 #define LXW_CHART_NUM_FORMAT_LEN 128
/** Available chart types . */ /**
* @brief Available chart types.
*/
typedef enum lxw_chart_type { typedef enum lxw_chart_type {
/** None. */ /** None. */
@ -149,7 +151,9 @@ typedef enum lxw_chart_type {
LXW_CHART_RADAR_FILLED LXW_CHART_RADAR_FILLED
} lxw_chart_type; } lxw_chart_type;
/** Chart legend positions. */ /**
* @brief Chart legend positions.
*/
typedef enum lxw_chart_legend_position { typedef enum lxw_chart_legend_position {
/** No chart legend. */ /** No chart legend. */
@ -174,7 +178,8 @@ typedef enum lxw_chart_legend_position {
LXW_CHART_LEGEND_OVERLAY_LEFT LXW_CHART_LEGEND_OVERLAY_LEFT
} lxw_chart_legend_position; } lxw_chart_legend_position;
/** @brief Chart line dash types. /**
* @brief Chart line dash types.
* *
* The dash types are shown in the order that they appear in the Excel dialog. * The dash types are shown in the order that they appear in the Excel dialog.
* See @ref chart_lines. * See @ref chart_lines.
@ -213,7 +218,6 @@ typedef enum lxw_chart_line_dash_type {
/** /**
* @brief Chart marker types. * @brief Chart marker types.
*
*/ */
typedef enum lxw_chart_marker_type { typedef enum lxw_chart_marker_type {
@ -251,6 +255,159 @@ typedef enum lxw_chart_marker_type {
LXW_CHART_MARKER_PLUS LXW_CHART_MARKER_PLUS
} lxw_chart_marker_type; } lxw_chart_marker_type;
/**
* @brief Chart pattern types.
*/
typedef enum lxw_chart_pattern_type {
/** None pattern. */
LXW_CHART_PATTERN_NONE,
/** 5 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_5,
/** 10 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_10,
/** 20 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_20,
/** 25 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_25,
/** 30 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_30,
/** 40 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_40,
/** 50 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_50,
/** 60 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_60,
/** 70 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_70,
/** 75 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_75,
/** 80 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_80,
/** 90 Percent pattern. */
LXW_CHART_PATTERN_PERCENT_90,
/** Light downward diagonal pattern. */
LXW_CHART_PATTERN_LIGHT_DOWNWARD_DIAGONAL,
/** Light upward diagonal pattern. */
LXW_CHART_PATTERN_LIGHT_UPWARD_DIAGONAL,
/** Dark downward diagonal pattern. */
LXW_CHART_PATTERN_DARK_DOWNWARD_DIAGONAL,
/** Dark upward diagonal pattern. */
LXW_CHART_PATTERN_DARK_UPWARD_DIAGONAL,
/** Wide downward diagonal pattern. */
LXW_CHART_PATTERN_WIDE_DOWNWARD_DIAGONAL,
/** Wide upward diagonal pattern. */
LXW_CHART_PATTERN_WIDE_UPWARD_DIAGONAL,
/** Light vertical pattern. */
LXW_CHART_PATTERN_LIGHT_VERTICAL,
/** Light horizontal pattern. */
LXW_CHART_PATTERN_LIGHT_HORIZONTAL,
/** Narrow vertical pattern. */
LXW_CHART_PATTERN_NARROW_VERTICAL,
/** Narrow horizontal pattern. */
LXW_CHART_PATTERN_NARROW_HORIZONTAL,
/** Dark vertical pattern. */
LXW_CHART_PATTERN_DARK_VERTICAL,
/** Dark horizontal pattern. */
LXW_CHART_PATTERN_DARK_HORIZONTAL,
/** Dashed downward diagonal pattern. */
LXW_CHART_PATTERN_DASHED_DOWNWARD_DIAGONAL,
/** Dashed upward diagonal pattern. */
LXW_CHART_PATTERN_DASHED_UPWARD_DIAGONAL,
/** Dashed horizontal pattern. */
LXW_CHART_PATTERN_DASHED_HORIZONTAL,
/** Dashed vertical pattern. */
LXW_CHART_PATTERN_DASHED_VERTICAL,
/** Small confetti pattern. */
LXW_CHART_PATTERN_SMALL_CONFETTI,
/** Large confetti pattern. */
LXW_CHART_PATTERN_LARGE_CONFETTI,
/** Zigzag pattern. */
LXW_CHART_PATTERN_ZIGZAG,
/** Wave pattern. */
LXW_CHART_PATTERN_WAVE,
/** Diagonal brick pattern. */
LXW_CHART_PATTERN_DIAGONAL_BRICK,
/** Horizontal brick pattern. */
LXW_CHART_PATTERN_HORIZONTAL_BRICK,
/** Weave pattern. */
LXW_CHART_PATTERN_WEAVE,
/** Plaid pattern. */
LXW_CHART_PATTERN_PLAID,
/** Divot pattern. */
LXW_CHART_PATTERN_DIVOT,
/** Dotted grid pattern. */
LXW_CHART_PATTERN_DOTTED_GRID,
/** Dotted diamond pattern. */
LXW_CHART_PATTERN_DOTTED_DIAMOND,
/** Shingle pattern. */
LXW_CHART_PATTERN_SHINGLE,
/** Trellis pattern. */
LXW_CHART_PATTERN_TRELLIS,
/** Sphere pattern. */
LXW_CHART_PATTERN_SPHERE,
/** Small grid pattern. */
LXW_CHART_PATTERN_SMALL_GRID,
/** Large grid pattern. */
LXW_CHART_PATTERN_LARGE_GRID,
/** Small check pattern. */
LXW_CHART_PATTERN_SMALL_CHECK,
/** Large check pattern. */
LXW_CHART_PATTERN_LARGE_CHECK,
/** Outlined diamond pattern. */
LXW_CHART_PATTERN_OUTLINED_DIAMOND,
/** Solid diamond pattern. */
LXW_CHART_PATTERN_SOLID_DIAMOND
} lxw_chart_pattern_type;
enum lxw_chart_subtype { enum lxw_chart_subtype {
LXW_CHART_SUBTYPE_NONE = 0, LXW_CHART_SUBTYPE_NONE = 0,
@ -330,7 +487,7 @@ typedef struct lxw_chart_line {
} lxw_chart_line; } lxw_chart_line;
/** /**
* @brief Struct to represent a chart line. * @brief Struct to represent a chart fill.
* *
* See @ref chart_fills. * See @ref chart_fills.
*/ */
@ -350,6 +507,28 @@ typedef struct lxw_chart_fill {
} lxw_chart_fill; } lxw_chart_fill;
/**
* @brief Struct to represent a chart pattern.
*
* See @ref chart_patterns.
*/
typedef struct lxw_chart_pattern {
/** The pattern foreground color. See @ref working_with_colors. */
lxw_color_t fg_color;
/** The pattern background color. See @ref working_with_colors. */
lxw_color_t bg_color;
/** The pattern type. See #lxw_chart_pattern_type. */
uint8_t type;
/* Members for internal use only. */
uint8_t has_fg_color;
uint8_t has_bg_color;
} lxw_chart_pattern;
/** /**
* @brief Struct to represent a chart font. * @brief Struct to represent a chart font.
* *
@ -392,6 +571,7 @@ typedef struct lxw_chart_marker {
uint8_t size; uint8_t size;
lxw_chart_line *line; lxw_chart_line *line;
lxw_chart_fill *fill; lxw_chart_fill *fill;
lxw_chart_pattern *pattern;
} lxw_chart_marker; } lxw_chart_marker;
@ -434,6 +614,7 @@ typedef struct lxw_chart_series {
lxw_chart_title title; lxw_chart_title title;
lxw_chart_line *line; lxw_chart_line *line;
lxw_chart_fill *fill; lxw_chart_fill *fill;
lxw_chart_pattern *pattern;
lxw_chart_marker *marker; lxw_chart_marker *marker;
STAILQ_ENTRY (lxw_chart_series) list_pointers; STAILQ_ENTRY (lxw_chart_series) list_pointers;
@ -460,6 +641,7 @@ typedef struct lxw_chart_axis {
lxw_chart_font *num_font; lxw_chart_font *num_font;
lxw_chart_line *line; lxw_chart_line *line;
lxw_chart_fill *fill; lxw_chart_fill *fill;
lxw_chart_pattern *pattern;
uint8_t reverse; uint8_t reverse;
uint8_t has_min; uint8_t has_min;
@ -789,6 +971,9 @@ void chart_series_set_line(lxw_chart_series *series, lxw_chart_line *line);
*/ */
void chart_series_set_fill(lxw_chart_series *series, lxw_chart_fill *fill); void chart_series_set_fill(lxw_chart_series *series, lxw_chart_fill *fill);
void chart_series_set_pattern(lxw_chart_series *series,
lxw_chart_pattern *pattern);
/** /**
* @brief Set the data marker type for a series. * @brief Set the data marker type for a series.
* *
@ -913,6 +1098,9 @@ void chart_series_set_marker_line(lxw_chart_series *series,
void chart_series_set_marker_fill(lxw_chart_series *series, void chart_series_set_marker_fill(lxw_chart_series *series,
lxw_chart_fill *fill); lxw_chart_fill *fill);
void chart_series_set_marker_pattern(lxw_chart_series *series,
lxw_chart_pattern *pattern);
/** /**
* @brief Set the name caption of the an axis. * @brief Set the name caption of the an axis.
* *
@ -1048,6 +1236,8 @@ void chart_axis_set_line(lxw_chart_axis *axis, lxw_chart_line *line);
*/ */
void chart_axis_set_fill(lxw_chart_axis *axis, lxw_chart_fill *fill); void chart_axis_set_fill(lxw_chart_axis *axis, lxw_chart_fill *fill);
void chart_axis_set_pattern(lxw_chart_axis *axis, lxw_chart_pattern *pattern);
/** /**
* @brief Reverse the order of the axis categories or values. * @brief Reverse the order of the axis categories or values.
* *

View file

@ -58,10 +58,12 @@ _chart_series_free(lxw_chart_series *series)
free(series->title.name); free(series->title.name);
free(series->line); free(series->line);
free(series->fill); free(series->fill);
free(series->pattern);
if (series->marker) { if (series->marker) {
free(series->marker->line); free(series->marker->line);
free(series->marker->fill); free(series->marker->fill);
free(series->marker->pattern);
free(series->marker); free(series->marker);
} }
@ -130,6 +132,7 @@ lxw_chart_free(lxw_chart *chart)
free(chart->x_axis->title.name); free(chart->x_axis->title.name);
free(chart->x_axis->line); free(chart->x_axis->line);
free(chart->x_axis->fill); free(chart->x_axis->fill);
free(chart->x_axis->pattern);
free(chart->x_axis); free(chart->x_axis);
} }
@ -141,6 +144,7 @@ lxw_chart_free(lxw_chart *chart)
free(chart->y_axis->title.name); free(chart->y_axis->title.name);
free(chart->y_axis->line); free(chart->y_axis->line);
free(chart->y_axis->fill); free(chart->y_axis->fill);
free(chart->y_axis->pattern);
free(chart->y_axis); free(chart->y_axis);
} }
@ -312,6 +316,50 @@ _chart_convert_fill_args(lxw_chart_fill *user_fill)
return fill; return fill;
} }
/*
* Create a copy of a user supplied pattern.
*/
STATIC lxw_chart_pattern *
_chart_convert_pattern_args(lxw_chart_pattern *user_pattern)
{
lxw_chart_pattern *pattern;
if (!user_pattern)
return NULL;
if (!user_pattern->type) {
LXW_WARN("chart_xxx_set_pattern: 'type' must be specified");
return NULL;
}
if (!user_pattern->fg_color) {
LXW_WARN("chart_xxx_set_pattern: 'fg_color' must be specified");
return NULL;
}
pattern = calloc(1, sizeof(struct lxw_chart_pattern));
RETURN_ON_MEM_ERROR(pattern, NULL);
memcpy(pattern, user_pattern, sizeof(lxw_chart_pattern));
pattern->fg_color = lxw_format_check_color(pattern->fg_color);
pattern->has_fg_color = LXW_TRUE;
if (pattern->bg_color) {
pattern->bg_color = lxw_format_check_color(pattern->bg_color);
pattern->has_bg_color = LXW_TRUE;
}
else {
/* Default background color in Excel is white, when unspecified. */
pattern->bg_color = LXW_COLOR_WHITE;
pattern->has_bg_color = LXW_TRUE;
}
pattern->type = user_pattern->type;
return pattern;
}
/* /*
* Set a marker type for a series. * Set a marker type for a series.
*/ */
@ -1484,20 +1532,171 @@ _chart_write_a_ln(lxw_chart *self, lxw_chart_line *line)
LXW_FREE_ATTRIBUTES(); LXW_FREE_ATTRIBUTES();
} }
/*
* Write the <a:fgClr> element.
*/
STATIC void
_chart_write_a_fg_clr(lxw_chart *self, lxw_color_t color)
{
lxw_xml_start_tag(self->file, "a:fgClr", NULL);
_chart_write_a_srgb_clr(self, color, LXW_FALSE);
lxw_xml_end_tag(self->file, "a:fgClr");
}
/*
* Write the <a:bgClr> element.
*/
STATIC void
_chart_write_a_bg_clr(lxw_chart *self, lxw_color_t color)
{
lxw_xml_start_tag(self->file, "a:bgClr", NULL);
_chart_write_a_srgb_clr(self, color, LXW_FALSE);
lxw_xml_end_tag(self->file, "a:bgClr");
}
/*
* Write the <a:pattFill> element.
*/
STATIC void
_chart_write_a_patt_fill(lxw_chart *self, lxw_chart_pattern *pattern)
{
struct xml_attribute_list attributes;
struct xml_attribute *attribute;
LXW_INIT_ATTRIBUTES();
if (pattern->type == LXW_CHART_PATTERN_NONE)
LXW_PUSH_ATTRIBUTES_STR("prst", "none");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_5)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct5");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_10)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct10");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_20)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct20");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_25)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct25");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_30)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct30");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_40)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct40");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_50)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct50");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_60)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct60");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_70)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct70");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_75)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct75");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_80)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct80");
else if (pattern->type == LXW_CHART_PATTERN_PERCENT_90)
LXW_PUSH_ATTRIBUTES_STR("prst", "pct90");
else if (pattern->type == LXW_CHART_PATTERN_LIGHT_DOWNWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "ltDnDiag");
else if (pattern->type == LXW_CHART_PATTERN_LIGHT_UPWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "ltUpDiag");
else if (pattern->type == LXW_CHART_PATTERN_DARK_DOWNWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dkDnDiag");
else if (pattern->type == LXW_CHART_PATTERN_DARK_UPWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dkUpDiag");
else if (pattern->type == LXW_CHART_PATTERN_WIDE_DOWNWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "wdDnDiag");
else if (pattern->type == LXW_CHART_PATTERN_WIDE_UPWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "wdUpDiag");
else if (pattern->type == LXW_CHART_PATTERN_LIGHT_VERTICAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "ltVert");
else if (pattern->type == LXW_CHART_PATTERN_LIGHT_HORIZONTAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "ltHorz");
else if (pattern->type == LXW_CHART_PATTERN_NARROW_VERTICAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "narVert");
else if (pattern->type == LXW_CHART_PATTERN_NARROW_HORIZONTAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "narHorz");
else if (pattern->type == LXW_CHART_PATTERN_DARK_VERTICAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dkVert");
else if (pattern->type == LXW_CHART_PATTERN_DARK_HORIZONTAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dkHorz");
else if (pattern->type == LXW_CHART_PATTERN_DASHED_DOWNWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dashDnDiag");
else if (pattern->type == LXW_CHART_PATTERN_DASHED_UPWARD_DIAGONAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dashUpDiag");
else if (pattern->type == LXW_CHART_PATTERN_DASHED_HORIZONTAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dashHorz");
else if (pattern->type == LXW_CHART_PATTERN_DASHED_VERTICAL)
LXW_PUSH_ATTRIBUTES_STR("prst", "dashVert");
else if (pattern->type == LXW_CHART_PATTERN_SMALL_CONFETTI)
LXW_PUSH_ATTRIBUTES_STR("prst", "smConfetti");
else if (pattern->type == LXW_CHART_PATTERN_LARGE_CONFETTI)
LXW_PUSH_ATTRIBUTES_STR("prst", "lgConfetti");
else if (pattern->type == LXW_CHART_PATTERN_ZIGZAG)
LXW_PUSH_ATTRIBUTES_STR("prst", "zigZag");
else if (pattern->type == LXW_CHART_PATTERN_WAVE)
LXW_PUSH_ATTRIBUTES_STR("prst", "wave");
else if (pattern->type == LXW_CHART_PATTERN_DIAGONAL_BRICK)
LXW_PUSH_ATTRIBUTES_STR("prst", "diagBrick");
else if (pattern->type == LXW_CHART_PATTERN_HORIZONTAL_BRICK)
LXW_PUSH_ATTRIBUTES_STR("prst", "horzBrick");
else if (pattern->type == LXW_CHART_PATTERN_WEAVE)
LXW_PUSH_ATTRIBUTES_STR("prst", "weave");
else if (pattern->type == LXW_CHART_PATTERN_PLAID)
LXW_PUSH_ATTRIBUTES_STR("prst", "plaid");
else if (pattern->type == LXW_CHART_PATTERN_DIVOT)
LXW_PUSH_ATTRIBUTES_STR("prst", "divot");
else if (pattern->type == LXW_CHART_PATTERN_DOTTED_GRID)
LXW_PUSH_ATTRIBUTES_STR("prst", "dotGrid");
else if (pattern->type == LXW_CHART_PATTERN_DOTTED_DIAMOND)
LXW_PUSH_ATTRIBUTES_STR("prst", "dotDmnd");
else if (pattern->type == LXW_CHART_PATTERN_SHINGLE)
LXW_PUSH_ATTRIBUTES_STR("prst", "shingle");
else if (pattern->type == LXW_CHART_PATTERN_TRELLIS)
LXW_PUSH_ATTRIBUTES_STR("prst", "trellis");
else if (pattern->type == LXW_CHART_PATTERN_SPHERE)
LXW_PUSH_ATTRIBUTES_STR("prst", "sphere");
else if (pattern->type == LXW_CHART_PATTERN_SMALL_GRID)
LXW_PUSH_ATTRIBUTES_STR("prst", "smGrid");
else if (pattern->type == LXW_CHART_PATTERN_LARGE_GRID)
LXW_PUSH_ATTRIBUTES_STR("prst", "lgGrid");
else if (pattern->type == LXW_CHART_PATTERN_SMALL_CHECK)
LXW_PUSH_ATTRIBUTES_STR("prst", "smCheck");
else if (pattern->type == LXW_CHART_PATTERN_LARGE_CHECK)
LXW_PUSH_ATTRIBUTES_STR("prst", "lgCheck");
else if (pattern->type == LXW_CHART_PATTERN_OUTLINED_DIAMOND)
LXW_PUSH_ATTRIBUTES_STR("prst", "openDmnd");
else if (pattern->type == LXW_CHART_PATTERN_SOLID_DIAMOND)
LXW_PUSH_ATTRIBUTES_STR("prst", "solidDmnd");
else
LXW_PUSH_ATTRIBUTES_STR("prst", "percent_50");
lxw_xml_start_tag(self->file, "a:pattFill", &attributes);
if (pattern->has_fg_color)
_chart_write_a_fg_clr(self, pattern->fg_color);
if (pattern->has_bg_color)
_chart_write_a_bg_clr(self, pattern->bg_color);
lxw_xml_end_tag(self->file, "a:pattFill");
LXW_FREE_ATTRIBUTES();
}
/* /*
* Write the <c:spPr> element. * Write the <c:spPr> element.
*/ */
STATIC void STATIC void
_chart_write_sp_pr(lxw_chart *self, lxw_chart_line *line, _chart_write_sp_pr(lxw_chart *self, lxw_chart_line *line,
lxw_chart_fill *fill) lxw_chart_fill *fill, lxw_chart_pattern *pattern)
{ {
if (!line && !fill) if (!line && !fill && !pattern)
return; return;
lxw_xml_start_tag(self->file, "c:spPr", NULL); lxw_xml_start_tag(self->file, "c:spPr", NULL);
/* Write the series fill. */ /* Write the series fill. Note: a pattern fill overrides a solid fill. */
if (fill) { if (fill && !pattern) {
if (fill->none) { if (fill->none) {
/* Write the a:noFill element. */ /* Write the a:noFill element. */
_chart_write_a_no_fill(self); _chart_write_a_no_fill(self);
@ -1508,6 +1707,11 @@ _chart_write_sp_pr(lxw_chart *self, lxw_chart_line *line,
} }
} }
if (pattern) {
/* Write the a:pattFill element. */
_chart_write_a_patt_fill(self, pattern);
}
if (line) { if (line) {
/* Write the a:ln element. */ /* Write the a:ln element. */
_chart_write_a_ln(self, line); _chart_write_a_ln(self, line);
@ -1681,7 +1885,7 @@ _chart_write_marker(lxw_chart *self, lxw_chart_marker *marker)
_chart_write_marker_size(self, marker->size); _chart_write_marker_size(self, marker->size);
/* Write the c:spPr element. */ /* Write the c:spPr element. */
_chart_write_sp_pr(self, marker->line, marker->fill); _chart_write_sp_pr(self, marker->line, marker->fill, marker->pattern);
lxw_xml_end_tag(self->file, "c:marker"); lxw_xml_end_tag(self->file, "c:marker");
} }
@ -1832,7 +2036,7 @@ _chart_write_ser(lxw_chart *self, lxw_chart_series *series)
_chart_write_series_name(self, series); _chart_write_series_name(self, series);
/* Write the c:spPr element. */ /* Write the c:spPr element. */
_chart_write_sp_pr(self, series->line, series->fill); _chart_write_sp_pr(self, series->line, series->fill, series->pattern);
/* Write the c:marker element. */ /* Write the c:marker element. */
_chart_write_marker(self, series->marker); _chart_write_marker(self, series->marker);
@ -1867,7 +2071,7 @@ _chart_write_xval_ser(lxw_chart *self, lxw_chart_series *series)
_chart_write_series_name(self, series); _chart_write_series_name(self, series);
/* Write the c:spPr element. */ /* Write the c:spPr element. */
_chart_write_sp_pr(self, series->line, series->fill); _chart_write_sp_pr(self, series->line, series->fill, series->pattern);
/* Write the c:marker element. */ /* Write the c:marker element. */
_chart_write_marker(self, series->marker); _chart_write_marker(self, series->marker);
@ -2464,7 +2668,8 @@ _chart_write_cat_axis(lxw_chart *self)
_chart_write_tick_lbl_pos(self); _chart_write_tick_lbl_pos(self);
/* Write the c:spPr element for the axis line. */ /* Write the c:spPr element for the axis line. */
_chart_write_sp_pr(self, self->x_axis->line, self->x_axis->fill); _chart_write_sp_pr(self, self->x_axis->line, self->x_axis->fill,
self->x_axis->pattern);
/* Write the axis font elements. */ /* Write the axis font elements. */
_chart_write_axis_font(self, self->x_axis->num_font); _chart_write_axis_font(self, self->x_axis->num_font);
@ -2526,7 +2731,8 @@ _chart_write_val_axis(lxw_chart *self)
_chart_write_tick_lbl_pos(self); _chart_write_tick_lbl_pos(self);
/* Write the c:spPr element for the axis line. */ /* Write the c:spPr element for the axis line. */
_chart_write_sp_pr(self, self->y_axis->line, self->y_axis->fill); _chart_write_sp_pr(self, self->y_axis->line, self->y_axis->fill,
self->y_axis->pattern);
/* Write the axis font elements. */ /* Write the axis font elements. */
_chart_write_axis_font(self, self->y_axis->num_font); _chart_write_axis_font(self, self->y_axis->num_font);
@ -2579,7 +2785,8 @@ _chart_write_cat_val_axis(lxw_chart *self)
_chart_write_tick_lbl_pos(self); _chart_write_tick_lbl_pos(self);
/* Write the c:spPr element for the axis line. */ /* Write the c:spPr element for the axis line. */
_chart_write_sp_pr(self, self->x_axis->line, self->x_axis->fill); _chart_write_sp_pr(self, self->x_axis->line, self->x_axis->fill,
self->x_axis->pattern);
/* Write the axis font elements. */ /* Write the axis font elements. */
_chart_write_axis_font(self, self->x_axis->num_font); _chart_write_axis_font(self, self->x_axis->num_font);
@ -3388,6 +3595,21 @@ chart_series_set_fill(lxw_chart_series *series, lxw_chart_fill *fill)
series->fill = _chart_convert_fill_args(fill); series->fill = _chart_convert_fill_args(fill);
} }
/*
* Set a pattern type for a series.
*/
void
chart_series_set_pattern(lxw_chart_series *series, lxw_chart_pattern *pattern)
{
if (!pattern)
return;
/* Free any previously allocated resource. */
free(series->pattern);
series->pattern = _chart_convert_pattern_args(pattern);
}
/* /*
* Set a marker type for a series. * Set a marker type for a series.
*/ */
@ -3419,7 +3641,7 @@ chart_series_set_marker_size(lxw_chart_series *series, uint8_t size)
} }
/* /*
* Set a line type for a series. * Set a line type for a series marker.
*/ */
void void
chart_series_set_marker_line(lxw_chart_series *series, lxw_chart_line *line) chart_series_set_marker_line(lxw_chart_series *series, lxw_chart_line *line)
@ -3440,7 +3662,7 @@ chart_series_set_marker_line(lxw_chart_series *series, lxw_chart_line *line)
} }
/* /*
* Set a fill type for a series. * Set a fill type for a series marker.
*/ */
void void
chart_series_set_marker_fill(lxw_chart_series *series, lxw_chart_fill *fill) chart_series_set_marker_fill(lxw_chart_series *series, lxw_chart_fill *fill)
@ -3460,6 +3682,28 @@ chart_series_set_marker_fill(lxw_chart_series *series, lxw_chart_fill *fill)
series->marker->fill = _chart_convert_fill_args(fill); series->marker->fill = _chart_convert_fill_args(fill);
} }
/*
* Set a pattern type for a series.
*/
void
chart_series_set_marker_pattern(lxw_chart_series *series,
lxw_chart_pattern *pattern)
{
if (!pattern)
return;
if (!series->marker) {
lxw_chart_marker *marker = calloc(1, sizeof(struct lxw_chart_marker));
RETURN_VOID_ON_MEM_ERROR(marker);
series->marker = marker;
}
/* Free any previously allocated resource. */
free(series->marker->pattern);
series->marker->pattern = _chart_convert_pattern_args(pattern);
}
/* /*
* Set an axis caption. * Set an axis caption.
*/ */
@ -3545,6 +3789,21 @@ chart_axis_set_fill(lxw_chart_axis *axis, lxw_chart_fill *fill)
axis->fill = _chart_convert_fill_args(fill); axis->fill = _chart_convert_fill_args(fill);
} }
/*
* Set a pattern type for an axis.
*/
void
chart_axis_set_pattern(lxw_chart_axis *axis, lxw_chart_pattern *pattern)
{
if (!pattern)
return;
/* Free any previously allocated resource. */
free(axis->pattern);
axis->pattern = _chart_convert_pattern_args(pattern);
}
/* /*
* Reverse the direction of an axis. * Reverse the direction of an axis.
*/ */

View file

@ -0,0 +1,45 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern01.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 86421504;
chart->axis_id_2 = 86423040;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern02.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 86421504;
chart->axis_id_2 = 86423040;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_5,
.fg_color = 0xC00000,
.bg_color = 0xFFFFFF};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_50,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_LIGHT_DOWNWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_LIGHT_VERTICAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_DASHED_DOWNWARD_DIAGONAL,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_ZIGZAG,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_DIVOT,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_SMALL_GRID,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern03.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 110902272;
chart->axis_id_2 = 110756608;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_10,
.fg_color = 0xC00000,
.bg_color = 0xFFFFFF};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_60,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_LIGHT_UPWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_LIGHT_HORIZONTAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_DASHED_UPWARD_DIAGONAL,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_WAVE,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_DOTTED_GRID,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_LARGE_GRID,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern04.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 110902272;
chart->axis_id_2 = 110756608;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_20,
.fg_color = 0xC00000,
.bg_color = 0xFFFFFF};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_70,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_DARK_DOWNWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_NARROW_VERTICAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_DASHED_HORIZONTAL,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_DIAGONAL_BRICK,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_DOTTED_DIAMOND,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_SMALL_CHECK,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern05.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 110902272;
chart->axis_id_2 = 110756608;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_25,
.fg_color = 0xC00000,
.bg_color = 0xFFFFFF};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_75,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_DARK_UPWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_NARROW_HORIZONTAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_DASHED_VERTICAL,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_HORIZONTAL_BRICK,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_SHINGLE,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_LARGE_CHECK,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern06.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 110902272;
chart->axis_id_2 = 110756608;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_30,
.fg_color = 0xC00000,
.bg_color = 0xFFFFFF};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_80,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_WIDE_DOWNWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_DARK_VERTICAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_SMALL_CONFETTI,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_WEAVE,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_TRELLIS,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_OUTLINED_DIAMOND,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern07.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 110902272;
chart->axis_id_2 = 110756608;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_40,
.fg_color = 0xC00000,
.bg_color = 0xFFFFFF};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_90,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_WIDE_UPWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_DARK_HORIZONTAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_LARGE_CONFETTI,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_PLAID,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_SPHERE,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_SOLID_DIAMOND,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,79 @@
/*****************************************************************************
* Test cases for libxlsxwriter.
*
* Test to compare output against Excel files.
*
* Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
*
*/
#include "xlsxwriter.h"
int main() {
lxw_workbook *workbook = new_workbook("test_chart_pattern08.xlsx");
lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL);
lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN);
/* For testing, copy the randomly generated axis ids in the target file. */
chart->axis_id_1 = 91631616;
chart->axis_id_2 = 91633152;
uint8_t data[3][8] = {
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2},
{2, 2, 2, 2, 2, 2, 2, 2}
};
int row, col;
for (row = 0; row < 3; row++)
for (col = 0; col < 8; col++)
worksheet_write_number(worksheet, row, col, data[row][col], NULL);
lxw_chart_series *series1 = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$3");
lxw_chart_series *series2 = chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$3");
lxw_chart_series *series3 = chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$3");
lxw_chart_series *series4 = chart_add_series(chart, NULL, "=Sheet1!$D$1:$D$3");
lxw_chart_series *series5 = chart_add_series(chart, NULL, "=Sheet1!$E$1:$E$3");
lxw_chart_series *series6 = chart_add_series(chart, NULL, "=Sheet1!$F$1:$F$3");
lxw_chart_series *series7 = chart_add_series(chart, NULL, "=Sheet1!$G$1:$G$3");
lxw_chart_series *series8 = chart_add_series(chart, NULL, "=Sheet1!$H$1:$H$3");
lxw_chart_pattern pattern1 = {.type = LXW_CHART_PATTERN_PERCENT_5,
.fg_color = LXW_COLOR_YELLOW,
.bg_color = LXW_COLOR_RED};
lxw_chart_pattern pattern2 = {.type = LXW_CHART_PATTERN_PERCENT_50,
.fg_color = 0xFF0000};
lxw_chart_pattern pattern3 = {.type = LXW_CHART_PATTERN_LIGHT_DOWNWARD_DIAGONAL,
.fg_color = 0xFFC000};
lxw_chart_pattern pattern4 = {.type = LXW_CHART_PATTERN_LIGHT_VERTICAL,
.fg_color = 0xFFFF00};
lxw_chart_pattern pattern5 = {.type = LXW_CHART_PATTERN_DASHED_DOWNWARD_DIAGONAL,
.fg_color = 0x92D050};
lxw_chart_pattern pattern6 = {.type = LXW_CHART_PATTERN_ZIGZAG,
.fg_color = 0x00B050};
lxw_chart_pattern pattern7 = {.type = LXW_CHART_PATTERN_DIVOT,
.fg_color = 0x00B0F0};
lxw_chart_pattern pattern8 = {.type = LXW_CHART_PATTERN_SMALL_GRID,
.fg_color = 0x0070C0};
chart_series_set_pattern(series1, &pattern1);
chart_series_set_pattern(series2, &pattern2);
chart_series_set_pattern(series3, &pattern3);
chart_series_set_pattern(series4, &pattern4);
chart_series_set_pattern(series5, &pattern5);
chart_series_set_pattern(series6, &pattern6);
chart_series_set_pattern(series7, &pattern7);
chart_series_set_pattern(series8, &pattern8);
worksheet_insert_chart(worksheet, CELL("E9"), chart);
return workbook_close(workbook);
}

View file

@ -0,0 +1,38 @@
###############################################################################
#
# Tests for libxlsxwriter.
#
# Copyright 2014-2017, John McNamara, jmcnamara@cpan.org
#
import base_test_class
class TestCompareXLSXFiles(base_test_class.XLSXBaseTest):
"""
Test file created with libxlsxwriter against a file created by Excel.
"""
def test_chart_pattern01(self):
self.run_exe_test('test_chart_pattern01')
def test_chart_pattern02(self):
self.run_exe_test('test_chart_pattern02')
def test_chart_pattern03(self):
self.run_exe_test('test_chart_pattern03')
def test_chart_pattern04(self):
self.run_exe_test('test_chart_pattern04')
def test_chart_pattern05(self):
self.run_exe_test('test_chart_pattern05')
def test_chart_pattern06(self):
self.run_exe_test('test_chart_pattern06')
def test_chart_pattern07(self):
self.run_exe_test('test_chart_pattern07')
def test_chart_pattern08(self):
self.run_exe_test('test_chart_pattern08')

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.