From ca5c2b7cb9522fe1aa64b41920cc8c672dc17123 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Sat, 1 Aug 2020 01:28:29 +0100 Subject: [PATCH] Added support for custom chart data labels. --- .indent.pro | 2 + include/xlsxwriter/chart.h | 28 +++ src/chart.c | 220 +++++++++++++++++- src/workbook.c | 9 + .../functional/src/test_chart_data_labels26.c | 48 ++++ .../functional/src/test_chart_data_labels27.c | 48 ++++ .../functional/src/test_chart_data_labels28.c | 64 +++++ .../functional/src/test_chart_data_labels29.c | 49 ++++ .../functional/src/test_chart_data_labels30.c | 49 ++++ .../functional/src/test_chart_data_labels31.c | 49 ++++ .../functional/src/test_chart_data_labels32.c | 49 ++++ .../functional/src/test_chart_data_labels33.c | 49 ++++ .../functional/src/test_chart_data_labels34.c | 49 ++++ test/functional/test_chart_data_labels.py | 27 +++ .../xlsx_files/chart_data_labels26.xlsx | Bin 0 -> 9396 bytes .../xlsx_files/chart_data_labels27.xlsx | Bin 0 -> 9372 bytes .../xlsx_files/chart_data_labels28.xlsx | Bin 0 -> 9776 bytes .../xlsx_files/chart_data_labels29.xlsx | Bin 0 -> 9319 bytes .../xlsx_files/chart_data_labels30.xlsx | Bin 0 -> 9336 bytes .../xlsx_files/chart_data_labels31.xlsx | Bin 0 -> 9414 bytes .../xlsx_files/chart_data_labels32.xlsx | Bin 0 -> 9437 bytes .../xlsx_files/chart_data_labels33.xlsx | Bin 0 -> 9404 bytes .../xlsx_files/chart_data_labels34.xlsx | Bin 0 -> 9470 bytes 23 files changed, 731 insertions(+), 9 deletions(-) create mode 100644 test/functional/src/test_chart_data_labels26.c create mode 100644 test/functional/src/test_chart_data_labels27.c create mode 100644 test/functional/src/test_chart_data_labels28.c create mode 100644 test/functional/src/test_chart_data_labels29.c create mode 100644 test/functional/src/test_chart_data_labels30.c create mode 100644 test/functional/src/test_chart_data_labels31.c create mode 100644 test/functional/src/test_chart_data_labels32.c create mode 100644 test/functional/src/test_chart_data_labels33.c create mode 100644 test/functional/src/test_chart_data_labels34.c create mode 100644 test/functional/xlsx_files/chart_data_labels26.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels27.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels28.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels29.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels30.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels31.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels32.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels33.xlsx create mode 100644 test/functional/xlsx_files/chart_data_labels34.xlsx diff --git a/.indent.pro b/.indent.pro index 4fc5b915..820363e5 100644 --- a/.indent.pro +++ b/.indent.pro @@ -57,6 +57,8 @@ -T lxw_chart_axis_tick_position -T lxw_chart_axis_type -T lxw_chart_blank +-T lxw_chart_custom_label +-T lxw_chart_data_label -T lxw_chart_error_bar_axis -T lxw_chart_error_bar_cap -T lxw_chart_error_bar_direction diff --git a/include/xlsxwriter/chart.h b/include/xlsxwriter/chart.h index 68f6e967..67e929dd 100644 --- a/include/xlsxwriter/chart.h +++ b/include/xlsxwriter/chart.h @@ -787,6 +787,29 @@ typedef struct lxw_chart_point { } lxw_chart_point; +typedef struct lxw_chart_data_label { + + char *value; + uint8_t delete; + lxw_chart_font *font; + +} lxw_chart_data_label; + +/* Internal version of lxw_chart_data_label with more metadata. */ +typedef struct lxw_chart_custom_label { + + char *value; + uint8_t delete; + lxw_chart_font *font; + + /* We use a range to hold the label formula properties even though it + * will only have 1 point in order to re-use similar functions.*/ + lxw_series_range *range; + + struct lxw_series_data_point data_point; + +} lxw_chart_custom_label; + /** * @brief Define how blank values are displayed in a chart. */ @@ -916,7 +939,9 @@ typedef struct lxw_chart_series { lxw_chart_pattern *pattern; lxw_chart_marker *marker; lxw_chart_point *points; + lxw_chart_custom_label *data_labels; uint16_t point_count; + uint16_t data_label_count; uint8_t smooth; uint8_t invert_if_negative; @@ -1659,6 +1684,9 @@ void chart_series_set_labels_options(lxw_chart_series *series, uint8_t show_name, uint8_t show_category, uint8_t show_value); +lxw_error chart_series_set_labels_custom(lxw_chart_series *series, lxw_chart_data_label + *data_labels[]); + /** * @brief Set the separator for the data label captions. * diff --git a/src/chart.c b/src/chart.c index ef185096..9d16d755 100644 --- a/src/chart.c +++ b/src/chart.c @@ -82,6 +82,23 @@ _chart_free_font(lxw_chart_font *font) free(font); } +STATIC void +_chart_free_data_labels(lxw_chart_series *series) +{ + uint16_t index; + + for (index = 0; index < series->data_label_count; index++) { + lxw_chart_custom_label *data_label = &series->data_labels[index]; + + free(data_label->value); + _chart_free_range(data_label->range); + _chart_free_font(data_label->font); + } + + series->data_label_count = 0; + free(series->data_labels); +} + /* * Free a series object. */ @@ -109,6 +126,7 @@ _chart_series_free(lxw_chart_series *series) _chart_free_range(series->values); _chart_free_range(series->title.range); _chart_free_points(series); + _chart_free_data_labels(series); if (series->x_error_bars) { free(series->x_error_bars->line); @@ -1067,12 +1085,14 @@ _chart_write_a_p_pie(lxw_chart *self, lxw_chart_font *font) * Write the element. */ STATIC void -_chart_write_a_p_rich(lxw_chart *self, char *name, lxw_chart_font *font) +_chart_write_a_p_rich(lxw_chart *self, char *name, lxw_chart_font *font, + uint8_t is_data_label) { lxw_xml_start_tag(self->file, "a:p", NULL); /* Write the a:pPr element. */ - _chart_write_a_p_pr_rich(self, font); + if (!is_data_label) + _chart_write_a_p_pr_rich(self, font); /* Write the a:r element. */ _chart_write_a_r(self, name, font); @@ -1454,8 +1474,8 @@ _chart_write_axis_font(lxw_chart *self, lxw_chart_font *font) * Write the element. */ STATIC void -_chart_write_rich(lxw_chart *self, char *name, uint8_t is_horizontal, - lxw_chart_font *font) +_chart_write_rich(lxw_chart *self, char *name, lxw_chart_font *font, + uint8_t is_horizontal, uint8_t is_data_label) { int32_t rotation = 0; @@ -1471,7 +1491,7 @@ _chart_write_rich(lxw_chart *self, char *name, uint8_t is_horizontal, _chart_write_a_lst_style(self); /* Write the a:p element. */ - _chart_write_a_p_rich(self, name, font); + _chart_write_a_p_rich(self, name, font, is_data_label); lxw_xml_end_tag(self->file, "c:rich"); } @@ -1487,7 +1507,7 @@ _chart_write_tx_rich(lxw_chart *self, char *name, uint8_t is_horizontal, lxw_xml_start_tag(self->file, "c:tx", NULL); /* Write the c:rich element. */ - _chart_write_rich(self, name, is_horizontal, font); + _chart_write_rich(self, name, font, is_horizontal, LXW_FALSE); lxw_xml_end_tag(self->file, "c:tx"); } @@ -2256,6 +2276,110 @@ _chart_write_label_num_fmt(lxw_chart *self, char *format) LXW_FREE_ATTRIBUTES(); } +/* + * Write parts of the elements for formula custom labels. + */ +STATIC void +_chart_write_custom_label_formula(lxw_chart *self, lxw_chart_series *series, + lxw_chart_custom_label *data_label) +{ + lxw_xml_empty_tag(self->file, "c:layout", NULL); + lxw_xml_start_tag(self->file, "c:tx", NULL); + + _chart_write_str_ref(self, data_label->range); + + lxw_xml_end_tag(self->file, "c:tx"); + + if (data_label->font) { + lxw_xml_empty_tag(self->file, "c:spPr", NULL); + _chart_write_tx_pr(self, LXW_FALSE, data_label->font); + } + + /* Write the c:showVal element. */ + if (series->show_labels_value) + _chart_write_show_val(self); + + /* Write the c:showCatName element. */ + if (series->show_labels_category) + _chart_write_show_cat_name(self); + + /* Write the c:showSerName element. */ + if (series->show_labels_name) + _chart_write_show_ser_name(self); + +} + +/* + * Write parts of the elements for string custom labels. + */ +STATIC void +_chart_write_custom_label_str(lxw_chart *self, lxw_chart_series *series, + lxw_chart_custom_label *data_label) +{ + lxw_xml_empty_tag(self->file, "c:layout", NULL); + lxw_xml_start_tag(self->file, "c:tx", NULL); + + /* Write the c:rich element. */ + _chart_write_rich(self, data_label->value, data_label->font, + LXW_FALSE, LXW_TRUE); + + lxw_xml_end_tag(self->file, "c:tx"); + + /* Write the c:showVal element. */ + if (series->show_labels_value) + _chart_write_show_val(self); + + /* Write the c:showCatName element. */ + if (series->show_labels_category) + _chart_write_show_cat_name(self); + + /* Write the c:showSerName element. */ + if (series->show_labels_name) + _chart_write_show_ser_name(self); + +} + +/* + * Write the elements for custom labels. + */ +STATIC void +_chart_write_custom_labels(lxw_chart *self, lxw_chart_series *series) +{ + uint16_t index = 0; + + for (index = 0; index < series->data_label_count; index++) { + lxw_chart_custom_label *data_label = &series->data_labels[index]; + + if (!data_label->value && !data_label->range && !data_label->delete + && !data_label->font) { + + continue; + } + + lxw_xml_start_tag(self->file, "c:dLbl", NULL); + + /* Write the c:idx element. */ + _chart_write_idx(self, index); + + if (data_label->delete) { + /* Write the c:delete element. */ + _chart_write_delete(self); + } + else if (data_label->value) { + _chart_write_custom_label_str(self, series, data_label); + } + else if (data_label->range) { + _chart_write_custom_label_formula(self, series, data_label); + } + else if (data_label->font) { + lxw_xml_empty_tag(self->file, "c:spPr", NULL); + _chart_write_tx_pr(self, LXW_FALSE, data_label->font); + } + + lxw_xml_end_tag(self->file, "c:dLbl"); + } +} + /* * Write the element. */ @@ -2267,6 +2391,9 @@ _chart_write_d_lbls(lxw_chart *self, lxw_chart_series *series) lxw_xml_start_tag(self->file, "c:dLbls", NULL); + if (series->data_labels) + _chart_write_custom_labels(self, series); + /* Write the c:numFmt element. */ if (series->label_num_format) _chart_write_label_num_fmt(self, series->label_num_format); @@ -3557,7 +3684,7 @@ _chart_write_legend_entry(lxw_chart *self, uint16_t index) /* Write the c:idx element. */ _chart_write_idx(self, self->delete_series[index]); - /* Write the c:delete element. */ + /* Write the c:dst_label element. */ _chart_write_delete(self); lxw_xml_end_tag(self->file, "c:legendEntry"); @@ -4999,7 +5126,7 @@ lxw_chart_add_data_cache(lxw_series_range *range, uint8_t *data, } /* - * Insert an image into the worksheet. + * Add a series to the chart. */ lxw_chart_series * chart_add_series(lxw_chart *self, const char *categories, const char *values) @@ -5306,7 +5433,7 @@ chart_series_set_marker_pattern(lxw_chart_series *series, } /* - * Store the horizontal page breaks on a worksheet. + * Store the points for a chart. */ lxw_error chart_series_set_points(lxw_chart_series *series, lxw_chart_point *points[]) @@ -5375,6 +5502,81 @@ chart_series_set_labels_options(lxw_chart_series *series, uint8_t show_name, series->show_labels_value = show_value; } +/* + * Store the custom data_labels for a chart. + */ +lxw_error +chart_series_set_labels_custom(lxw_chart_series *series, + lxw_chart_data_label *data_labels[]) +{ + uint16_t i = 0; + uint16_t data_label_count = 0; + + if (data_labels == NULL) + return LXW_ERROR_NULL_PARAMETER_IGNORED; + + while (data_labels[data_label_count]) + data_label_count++; + + if (data_label_count == 0) + return LXW_ERROR_NULL_PARAMETER_IGNORED; + + series->has_labels = LXW_TRUE; + + /* Set the Value label type if no other type is set. */ + if (!series->show_labels_name && !series->show_labels_category + && !series->show_labels_value) { + series->show_labels_value = LXW_TRUE; + } + + /* Free any existing resource. */ + _chart_free_data_labels(series); + + series->data_labels = calloc(data_label_count, + sizeof(lxw_chart_custom_label)); + RETURN_ON_MEM_ERROR(series->data_labels, LXW_ERROR_MEMORY_MALLOC_FAILED); + + /* Copy the user data into the array of new structs. The struct types + * are different since the internal version has more fields. */ + for (i = 0; i < data_label_count; i++) { + lxw_chart_data_label *user_data_label = data_labels[i]; + lxw_chart_custom_label *data_label = &series->data_labels[i]; + + char *src_value = user_data_label->value; + + data_label->delete = user_data_label->delete; + + data_label->font = _chart_convert_font_args(user_data_label->font); + + if (src_value) { + if (*src_value == '=') { + /* The value is a formula. Handle like other chart ranges. */ + data_label->range = calloc(1, sizeof(lxw_series_range)); + GOTO_LABEL_ON_MEM_ERROR(data_label->range, mem_error); + + data_label->range->formula = lxw_strdup(src_value + 1); + + /* Add the formula to the data cache to allow value to be looked + * up and filled in when the file is closed. */ + if (_chart_init_data_cache(data_label->range) != LXW_NO_ERROR) + goto mem_error; + } + else { + /* The value is a simple string. */ + data_label->value = lxw_strdup(src_value); + } + } + } + + series->data_label_count = data_label_count; + + return LXW_NO_ERROR; + +mem_error: + _chart_free_data_labels(series); + return LXW_ERROR_MEMORY_MALLOC_FAILED; +} + /* * Set the data labels separator for a series. */ diff --git a/src/workbook.c b/src/workbook.c index e54b6dd6..258f0a76 100644 --- a/src/workbook.c +++ b/src/workbook.c @@ -879,6 +879,9 @@ _populate_range_dimensions(lxw_workbook *self, lxw_series_range *range) STATIC void _populate_range(lxw_workbook *self, lxw_series_range *range) { + if (!range) + return; + _populate_range_dimensions(self, range); _populate_range_data_cache(self, range); } @@ -892,6 +895,7 @@ _add_chart_cache_data(lxw_workbook *self) { lxw_chart *chart; lxw_chart_series *series; + uint16_t i; STAILQ_FOREACH(chart, self->ordered_charts, ordered_list_pointers) { @@ -906,6 +910,11 @@ _add_chart_cache_data(lxw_workbook *self) _populate_range(self, series->categories); _populate_range(self, series->values); _populate_range(self, series->title.range); + + for (i = 0; i < series->data_label_count; i++) { + lxw_chart_custom_label *data_label = &series->data_labels[i]; + _populate_range(self, data_label->range); + } } } } diff --git a/test/functional/src/test_chart_data_labels26.c b/test/functional/src/test_chart_data_labels26.c new file mode 100644 index 00000000..0197b651 --- /dev/null +++ b/test/functional/src/test_chart_data_labels26.c @@ -0,0 +1,48 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels26.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 = 48514944; + chart->axis_id_2 = 48516480; + + uint8_t data[5][4] = { + {1, 2, 3, 10}, + {2, 4, 6, 20}, + {3, 6, 9, 30}, + {4, 8, 12, 40}, + {5, 10, 15, 50} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 4; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_data_label data_label1 = {.value = "33"}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels27.c b/test/functional/src/test_chart_data_labels27.c new file mode 100644 index 00000000..299cd0fc --- /dev/null +++ b/test/functional/src/test_chart_data_labels27.c @@ -0,0 +1,48 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels27.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 = 48514944; + chart->axis_id_2 = 48516480; + + uint8_t data[5][4] = { + {1, 2, 3, 10}, + {2, 4, 6, 20}, + {3, 6, 9, 30}, + {4, 8, 12, 40}, + {5, 10, 15, 50} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 4; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_data_label data_label1 = {.value = "=Sheet1!$D$1"}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels28.c b/test/functional/src/test_chart_data_labels28.c new file mode 100644 index 00000000..c4a39591 --- /dev/null +++ b/test/functional/src/test_chart_data_labels28.c @@ -0,0 +1,64 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels28.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 = 48514944; + chart->axis_id_2 = 48516480; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + worksheet_write_string(worksheet, CELL("D1"), "foo" , NULL); + worksheet_write_string(worksheet, CELL("D2"), "bar" , NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + + lxw_chart_data_label data_label1 = {.value = "123"}; + lxw_chart_data_label data_label2 = {.value = "abc"}; + lxw_chart_data_label data_label3 = {0}; + lxw_chart_data_label data_label4 = {.value = "=Sheet1!$D$1"}; + lxw_chart_data_label data_label5 = {.value = "=Sheet1!$D$2"}; + + lxw_chart_data_label *data_labels[] = { + &data_label1, + &data_label2, + &data_label3, + &data_label4, + &data_label5, + NULL + }; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels29.c b/test/functional/src/test_chart_data_labels29.c new file mode 100644 index 00000000..c2c77900 --- /dev/null +++ b/test/functional/src/test_chart_data_labels29.c @@ -0,0 +1,49 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels29.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 = 67858816; + chart->axis_id_2 = 67863296; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_data_label data_label1 = {.delete = LXW_TRUE}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels30.c b/test/functional/src/test_chart_data_labels30.c new file mode 100644 index 00000000..023b9c38 --- /dev/null +++ b/test/functional/src/test_chart_data_labels30.c @@ -0,0 +1,49 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels30.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 = 67858816; + chart->axis_id_2 = 67863296; + + uint8_t data[5][3] = { + {1, 2, 3}, + {2, 4, 6}, + {3, 6, 9}, + {4, 8, 12}, + {5, 10, 15} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 3; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_data_label data_label1 = {.delete = LXW_TRUE}; + lxw_chart_data_label data_label2 = {0}; + lxw_chart_data_label *data_labels[] = {&data_label1, &data_label2, &data_label1, &data_label2, &data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels31.c b/test/functional/src/test_chart_data_labels31.c new file mode 100644 index 00000000..270ad794 --- /dev/null +++ b/test/functional/src/test_chart_data_labels31.c @@ -0,0 +1,49 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels31.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 = 71248896; + chart->axis_id_2 = 71373568; + + uint8_t data[5][4] = { + {1, 2, 3, 10}, + {2, 4, 6, 20}, + {3, 6, 9, 30}, + {4, 8, 12, 40}, + {5, 10, 15, 50} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 4; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_data_label data_label1 = {.value = "33"}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + chart_series_set_labels_options(series, LXW_TRUE, LXW_TRUE, LXW_TRUE); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels32.c b/test/functional/src/test_chart_data_labels32.c new file mode 100644 index 00000000..ddd0e32b --- /dev/null +++ b/test/functional/src/test_chart_data_labels32.c @@ -0,0 +1,49 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels32.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 = 71374336; + chart->axis_id_2 = 71414144; + + uint8_t data[5][4] = { + {1, 2, 3, 10}, + {2, 4, 6, 20}, + {3, 6, 9, 30}, + {4, 8, 12, 40}, + {5, 10, 15, 50} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 4; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_font font1 = {.bold = LXW_TRUE, .italic = LXW_TRUE, .color = LXW_COLOR_RED, .baseline = -1}; + lxw_chart_data_label data_label1 = {.value = "33", .font = &font1}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels33.c b/test/functional/src/test_chart_data_labels33.c new file mode 100644 index 00000000..bd1092a2 --- /dev/null +++ b/test/functional/src/test_chart_data_labels33.c @@ -0,0 +1,49 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels33.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 = 65546112; + chart->axis_id_2 = 70217728; + + uint8_t data[5][4] = { + {1, 2, 3, 10}, + {2, 4, 6, 20}, + {3, 6, 9, 30}, + {4, 8, 12, 40}, + {5, 10, 15, 50} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 4; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_font font1 = {.bold = LXW_TRUE, .italic = LXW_TRUE, .baseline = -1}; + lxw_chart_data_label data_label1 = {.font = &font1}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_data_labels34.c b/test/functional/src/test_chart_data_labels34.c new file mode 100644 index 00000000..d5ea7dbe --- /dev/null +++ b/test/functional/src/test_chart_data_labels34.c @@ -0,0 +1,49 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2020, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_data_labels34.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 = 48497792; + chart->axis_id_2 = 48499712; + + uint8_t data[5][4] = { + {1, 2, 3, 10}, + {2, 4, 6, 20}, + {3, 6, 9, 30}, + {4, 8, 12, 40}, + {5, 10, 15, 50} + }; + + int row, col; + for (row = 0; row < 5; row++) + for (col = 0; col < 4; col++) + worksheet_write_number(worksheet, row, col, data[row][col], NULL); + + lxw_chart_series *series = chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + + lxw_chart_font font1 = {.bold = LXW_TRUE, .italic = LXW_TRUE, .color = LXW_COLOR_RED, .baseline = -1}; + lxw_chart_data_label data_label1 = {. value = "=Sheet1!$D$1", .font = &font1}; + lxw_chart_data_label *data_labels[] = {&data_label1, NULL}; + + chart_series_set_labels_custom(series, data_labels); + + chart_add_series(chart, NULL, "=Sheet1!$B$1:$B$5"); + chart_add_series(chart, NULL, "=Sheet1!$C$1:$C$5"); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/test_chart_data_labels.py b/test/functional/test_chart_data_labels.py index 35c61941..3aaaec55 100644 --- a/test/functional/test_chart_data_labels.py +++ b/test/functional/test_chart_data_labels.py @@ -86,3 +86,30 @@ class TestCompareXLSXFiles(base_test_class.XLSXBaseTest): def test_chart_data_labels25(self): self.run_exe_test('test_chart_data_labels25') + + def test_chart_data_labels26(self): + self.run_exe_test('test_chart_data_labels26') + + def test_chart_data_labels27(self): + self.run_exe_test('test_chart_data_labels27') + + def test_chart_data_labels28(self): + self.run_exe_test('test_chart_data_labels28') + + def test_chart_data_labels29(self): + self.run_exe_test('test_chart_data_labels29') + + def test_chart_data_labels30(self): + self.run_exe_test('test_chart_data_labels30') + + def test_chart_data_labels31(self): + self.run_exe_test('test_chart_data_labels31') + + def test_chart_data_labels32(self): + self.run_exe_test('test_chart_data_labels32') + + def test_chart_data_labels33(self): + self.run_exe_test('test_chart_data_labels33') + + def test_chart_data_labels34(self): + self.run_exe_test('test_chart_data_labels34') diff --git a/test/functional/xlsx_files/chart_data_labels26.xlsx b/test/functional/xlsx_files/chart_data_labels26.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..1a8af8045e925cddc4c0cb26d4e768e9d28113c9 GIT binary patch literal 9396 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_data_labels29.xlsx b/test/functional/xlsx_files/chart_data_labels29.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..314c738765a48a7a1a22f60256856970a4f1cb6d GIT binary patch literal 9319 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

O7 z83ML@t?mrhGK6qe2YfN#e@bQ5P0Ygx6P4cT7rH3z?`vCSG=<@&ci$lk*q6pbZpxA3 zNXBZ(>PTGnB%+sd5s6=5zdN4N+%q`NM(7|+DE7_#8U3AgzdRr)03$!-Szg9E0t6~A z1|)H`r?7|at7YbkMLu^(E>-6bc4OJ3KEmn*VnHJJyLGSM*T?sBqL2H;KDOP4hBpOC zAdgTosq!_i5G|S)QCkurJoQWnV4*65B?S7Q3C0SOKv=+5$DEXO0eDpHUpHl+5UR3& zC69qJv%9mIWDJp0*nyFTh)lY=bExPDIDoqyGLf|pRFGeho_wHg681gBeaM#2a>ABa z!M`TTlXX*}gt31vTU2>B@R;0kg`V5{kmCl;{*a4Iju7zV+KEdj80Bo3`=aXa4_q6aP)*x zt26ULREuXUD2olM=kH`|yi3z*UF5n5QBIqbnM-vwFiU>T(HoYpF*ws{Ab$9rRdNlh z`a*e-gf|w_atPa&RiD4_tm$rgW!*@2I`eTh;`GV3JyXZ|Xa_TmTOCJ~K8nsElwP0D z4pXf2E?ooYXs1qK`P9f*o-@t@gF25)as4 zf|}px={)|@W0rCJ|;P)o$F=YN3LR1(v6c)x)8X# zw`o%Ng7?fW@S(Bk_yb*b=7hKAjgb2cnaTt^PIc1x-BX^|Vb{O)r$~#bj#Y4f+66y_ ze-`wADS&>JKA}29zSv4Eic?3)t(NgGNX!?HLF6W2Y$#C>10gxx|zAIOK;U+#h9Zjn$4@h2MO)|P35WN&{WxVN1|=#=#1i!OXd{bo6xtbf%5~x z)~QVxDMs{LDI+~a`=mKW3i=PwS=*jrjlATSj`X}B zvK_`yo_JHCrcE5l4zAG2do3%UxDFizv)mPUsf^7?k2l4yrZyUbI20<=Ix|X6k6x#9 zUYRI89kG+m3QeLvbij43&uWZ4o)*6v+h|<*;Oh1`xNdIPmeDcx+Iq0j{(5#M+LajD zK2&Z+_tn%k;@R9D+w49%X;pzASGqTDB87&IBGkjMs#xt~TKvE>&Ah4M&+YxdiF+{g z!Wz}?WZDTY|208RX(*L9OU`b{faB^J+VGE#*gtFi2}P#yA3ZZoc+cz}yr*hpW2gwR zv4y)^8;J2Aqr3mMQsJ5dypGh9X<^4}n@4IC?Q%~nOC0vEK#UO#LWBh`X-n-?7$o{p zPi;>pUTfyd`qix@N6ibKMmjiV=Ph7_vc!B*B)Nz8W(6D#iA#+$0L`T|J)uR)i}t$< zf2tcYE;Iq*;*q=0UCJ8JPqtjyyKK+F{zWIG^=#Gnva?H zyFQ&Azm2XDbZS_qNDE2D?Ga}{N97q~C1KnzyKy@d$CIKRY3~5U@BxFhul9YX*5b*d z5Sb?^U(#qn%VKe@Fh0VNdc0$3*ZOd>zLOgc^I@D0HaOu(6?7kz`cXa0PHm932{3@X zI6Z32bSy(86WUdH>s?+W)5UKQq?gmkpGegn5FD6>RJig&RkjlGA_4T#A!kKEjo(7R zazcZ*or>O-AzPBYWuT(ncqBK=5j)m^b>M2PIA3hPhx{&I%(|QtEsi0kl?q3@5QXs- z=Nh3U5H)5cAcrsDaL#p0Xk&Gv3Ff%`lHI$=Hmu5d1?a`49koH$+Vgn7lYL*Fuh!e9 z#=ehN=!1>h*ZQ|Q9E+{Z+DE5|(@c)r)bmH5U$-M|T zuKsGHuW@~N)N%|dr~e+x|8zXM?$Y?`-@{iR0t-Ab{r$TS|FYJ zZ$|;QQEvB}f1wOw{2k>#bf0en-tOW40_?l{?>+r*9o^f2x7(t>0KdRXPPme8H%V^; z+%8go0eHcy95}$QlJ&Oe?TYA^s2ssh(SOuOw-Ih literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_data_labels31.xlsx b/test/functional/xlsx_files/chart_data_labels31.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fe5201ff37c837d4d154a796716dfacbc0b976de GIT binary patch literal 9414 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 WX+#){f0PF>0j98xAW8A#>wf^GdrmR{ literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_data_labels32.xlsx b/test/functional/xlsx_files/chart_data_labels32.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..42aebd2d2be6ad08524f5d974778457fa6b4c3e1 GIT binary patch literal 9437 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 HkEj0uV}MK- literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_data_labels34.xlsx b/test/functional/xlsx_files/chart_data_labels34.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..e754705046d72ad49ec998df2cc888ce40c73406 GIT binary patch literal 9470 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 literal 0 HcmV?d00001