From 87e92d31b192df9d23655cbc50d8a0b1da50b718 Mon Sep 17 00:00:00 2001 From: John McNamara Date: Sun, 8 May 2016 14:50:32 +0100 Subject: [PATCH] Initial working chart subtypes. --- .indent.pro | 1 + include/xlsxwriter/chart.h | 46 +++++- src/chart.c | 156 +++++++++++++++--- test/functional/src/test_chart_bar09.c | 42 +++++ test/functional/src/test_chart_bar10.c | 42 +++++ test/functional/src/test_chart_column01.c | 42 +++++ test/functional/src/test_chart_column02.c | 42 +++++ test/functional/src/test_chart_column03.c | 42 +++++ test/functional/test_chart_bar.py | 6 + test/functional/test_chart_column.py | 23 +++ test/functional/xlsx_files/chart_bar09.xlsx | Bin 0 -> 9281 bytes test/functional/xlsx_files/chart_bar10.xlsx | Bin 0 -> 9286 bytes .../functional/xlsx_files/chart_column01.xlsx | Bin 0 -> 9263 bytes .../functional/xlsx_files/chart_column02.xlsx | Bin 0 -> 9287 bytes .../functional/xlsx_files/chart_column03.xlsx | Bin 0 -> 9290 bytes 15 files changed, 420 insertions(+), 22 deletions(-) create mode 100644 test/functional/src/test_chart_bar09.c create mode 100644 test/functional/src/test_chart_bar10.c create mode 100644 test/functional/src/test_chart_column01.c create mode 100644 test/functional/src/test_chart_column02.c create mode 100644 test/functional/src/test_chart_column03.c create mode 100644 test/functional/test_chart_column.py create mode 100644 test/functional/xlsx_files/chart_bar09.xlsx create mode 100644 test/functional/xlsx_files/chart_bar10.xlsx create mode 100644 test/functional/xlsx_files/chart_column01.xlsx create mode 100644 test/functional/xlsx_files/chart_column02.xlsx create mode 100644 test/functional/xlsx_files/chart_column03.xlsx diff --git a/.indent.pro b/.indent.pro index b91c1ba5..c1add4d0 100644 --- a/.indent.pro +++ b/.indent.pro @@ -45,6 +45,7 @@ /* libxlsxwriter typedefs. */ -T lxw_app -T lxw_autofilter +-T lxw_axis -T lxw_border -T lxw_cell -T lxw_chart diff --git a/include/xlsxwriter/chart.h b/include/xlsxwriter/chart.h index 4d4c8933..15d37c9f 100644 --- a/include/xlsxwriter/chart.h +++ b/include/xlsxwriter/chart.h @@ -17,6 +17,8 @@ STAILQ_HEAD(lxw_chart_series_list, lxw_chart_series); STAILQ_HEAD(lxw_series_data_points, lxw_series_data_point); +#define LXW_CHART_NUM_FORMAT_LEN 128 + /** Available chart types . */ enum lxw_chart_types { @@ -24,7 +26,31 @@ enum lxw_chart_types { LXW_CHART_NONE = 0, /** Bar chart. */ - LXW_CHART_BAR + LXW_CHART_BAR, + + /** Bar chart - stacked. */ + LXW_CHART_BAR_STACKED, + + /** Bar chart - percentage stacked. */ + LXW_CHART_BAR_STACKED_PERCENT, + + /** Column chart. */ + LXW_CHART_COLUMN, + + /** Column chart - stacked. */ + LXW_CHART_COLUMN_STACKED, + + /** Column chart - percentage stacked. */ + LXW_CHART_COLUMN_STACKED_PERCENT, + + LWX_CHART_END_REMOVEP_LATER +}; + +enum lxw_chart_subtypes { + + LXW_CHART_SUBTYPE_NONE = 0, + LXW_CHART_SUBTYPE_STACKED, + LXW_CHART_SUBTYPE_STACKED_PERCENT }; typedef struct lxw_series_range { @@ -56,6 +82,13 @@ typedef struct lxw_chart_series { } lxw_chart_series; +typedef struct lxw_axis { + + char num_format[LXW_CHART_NUM_FORMAT_LEN]; + char default_num_format[LXW_CHART_NUM_FORMAT_LEN]; + +} lxw_axis; + /* * Struct to represent a chart object. */ @@ -64,8 +97,12 @@ typedef struct lxw_chart { FILE *file; uint8_t type; + uint8_t subtype; uint16_t series_index; + lxw_axis x_axis; + lxw_axis y_axis; + uint32_t id; uint32_t axis_id_1; uint32_t axis_id_2; @@ -75,6 +112,13 @@ typedef struct lxw_chart { uint8_t in_use; uint8_t cat_has_num_fmt; + uint8_t has_overlap; + int series_overlap_1; + + char grouping[32]; + char cat_axis_position[2]; + char val_axis_position[2]; + struct lxw_chart_series_list *series_list; STAILQ_ENTRY (lxw_chart) list_pointers; diff --git a/src/chart.c b/src/chart.c index 7c512593..41ffc9ce 100644 --- a/src/chart.c +++ b/src/chart.c @@ -36,6 +36,18 @@ lxw_chart_new(uint8_t type) chart->type = type; + /* Set the default axis positions. */ + strcpy(chart->cat_axis_position, "b"); + strcpy(chart->val_axis_position, "l"); + + /* Set the default grouping. */ + strcpy(chart->grouping, "clustered"); + + strcpy(chart->x_axis.default_num_format, "General"); + strcpy(chart->y_axis.default_num_format, "General"); + + chart->series_overlap_1 = 100; + return chart; mem_error: @@ -187,14 +199,13 @@ _chart_write_layout(lxw_chart *self) * Write the element. */ STATIC void -_chart_write_grouping(lxw_chart *self) +_chart_write_grouping(lxw_chart *self, char *grouping) { struct xml_attribute_list attributes; struct xml_attribute *attribute; - char val[] = "clustered"; LXW_INIT_ATTRIBUTES(); - LXW_PUSH_ATTRIBUTES_STR("val", val); + LXW_PUSH_ATTRIBUTES_STR("val", grouping); lxw_xml_empty_tag(self->file, "c:grouping", &attributes); @@ -620,15 +631,14 @@ _chart_write_major_gridlines(lxw_chart *self) * Write the element. */ STATIC void -_chart_write_num_fmt(lxw_chart *self) +_chart_write_number_format(lxw_chart *self, lxw_axis *axis) { struct xml_attribute_list attributes; struct xml_attribute *attribute; - char format_code[] = "General"; char source_linked[] = "1"; LXW_INIT_ATTRIBUTES(); - LXW_PUSH_ATTRIBUTES_STR("formatCode", format_code); + LXW_PUSH_ATTRIBUTES_STR("formatCode", axis->default_num_format); LXW_PUSH_ATTRIBUTES_STR("sourceLinked", source_linked); lxw_xml_empty_tag(self->file, "c:numFmt", &attributes); @@ -773,12 +783,31 @@ _chart_write_print_settings(lxw_chart *self) lxw_xml_end_tag(self->file, "c:printSettings"); } +/* + * Write the element. + */ +STATIC void +_chart_write_overlap(lxw_chart *self, int overlap) +{ + struct xml_attribute_list attributes; + struct xml_attribute *attribute; + + LXW_INIT_ATTRIBUTES(); + LXW_PUSH_ATTRIBUTES_INT("val", overlap); + + lxw_xml_empty_tag(self->file, "c:overlap", &attributes); + + LXW_FREE_ATTRIBUTES(); +} + /* * Write the element. Usually the X axis. */ STATIC void _chart_write_cat_axis(lxw_chart *self) { + char *position = self->cat_axis_position; + lxw_xml_start_tag(self->file, "c:catAx", NULL); _chart_write_axis_id(self, self->axis_id_1); @@ -787,11 +816,11 @@ _chart_write_cat_axis(lxw_chart *self) _chart_write_scaling(self); /* Write the c:axPos element. */ - _chart_write_axis_pos(self, "l"); + _chart_write_axis_pos(self, position); /* Write the c:numFmt element. */ if (self->cat_has_num_fmt) - _chart_write_num_fmt(self); + _chart_write_number_format(self, &self->x_axis); /* Write the c:tickLblPos element. */ _chart_write_tick_lbl_pos(self); @@ -818,8 +847,10 @@ _chart_write_cat_axis(lxw_chart *self) * Write the element. */ STATIC void -_chart_write_val_ax(lxw_chart *self) +_chart_write_val_axis(lxw_chart *self) { + char *position = self->val_axis_position; + lxw_xml_start_tag(self->file, "c:valAx", NULL); _chart_write_axis_id(self, self->axis_id_2); @@ -828,13 +859,13 @@ _chart_write_val_ax(lxw_chart *self) _chart_write_scaling(self); /* Write the c:axPos element. */ - _chart_write_axis_pos(self, "b"); + _chart_write_axis_pos(self, position); /* Write the c:majorGridlines element. */ _chart_write_major_gridlines(self); /* Write the c:numFmt element. */ - _chart_write_num_fmt(self); + _chart_write_number_format(self, &self->y_axis); /* Write the c:tickLblPos element. */ _chart_write_tick_lbl_pos(self); @@ -859,13 +890,13 @@ _chart_write_val_ax(lxw_chart *self) * Write the element. */ STATIC void -_chart_write_bar_dir(lxw_chart *self) +_chart_write_bar_dir(lxw_chart *self, char *type) { struct xml_attribute_list attributes; struct xml_attribute *attribute; LXW_INIT_ATTRIBUTES(); - LXW_PUSH_ATTRIBUTES_STR("val", "bar"); + LXW_PUSH_ATTRIBUTES_STR("val", type); lxw_xml_empty_tag(self->file, "c:barDir", &attributes); @@ -876,23 +907,90 @@ _chart_write_bar_dir(lxw_chart *self) * Write the element. */ STATIC void -_chart_write_bar_chart(lxw_chart *self) +_chart_write_bar_chart(lxw_chart *self, uint8_t type) { lxw_chart_series *series; + if (type == LXW_CHART_BAR_STACKED) { + strcpy(self->grouping, "stacked"); + self->has_overlap = LXW_TRUE; + self->subtype = LXW_CHART_SUBTYPE_STACKED; + } + + if (type == LXW_CHART_BAR_STACKED_PERCENT) { + strcpy(self->grouping, "percentStacked"); + strcpy((&self->y_axis)->default_num_format, "0%"); + self->has_overlap = LXW_TRUE; + self->subtype = LXW_CHART_SUBTYPE_STACKED; + } + + /* Override the default axis positions for a bar chart. */ + strcpy(self->cat_axis_position, "l"); + strcpy(self->val_axis_position, "b"); + lxw_xml_start_tag(self->file, "c:barChart", NULL); /* Write the c:barDir element. */ - _chart_write_bar_dir(self); + _chart_write_bar_dir(self, "bar"); /* Write the c:grouping element. */ - _chart_write_grouping(self); + _chart_write_grouping(self, self->grouping); STAILQ_FOREACH(series, self->series_list, list_pointers) { /* Write the c:ser element. */ _chart_write_ser(self, series); } + if (self->has_overlap) { + /* Write the c:overlap element. */ + _chart_write_overlap(self, self->series_overlap_1); + } + + /* Write the c:axId elements. */ + _chart_write_axis_ids(self); + + lxw_xml_end_tag(self->file, "c:barChart"); +} + +/* + * Write the element for column charts. + */ +STATIC void +_chart_write_column_chart(lxw_chart *self, uint8_t type) +{ + lxw_chart_series *series; + + if (type == LXW_CHART_COLUMN_STACKED) { + strcpy(self->grouping, "stacked"); + self->has_overlap = LXW_TRUE; + self->subtype = LXW_CHART_SUBTYPE_STACKED; + } + + if (type == LXW_CHART_COLUMN_STACKED_PERCENT) { + strcpy(self->grouping, "percentStacked"); + strcpy((&self->y_axis)->default_num_format, "0%"); + self->has_overlap = LXW_TRUE; + self->subtype = LXW_CHART_SUBTYPE_STACKED; + } + + lxw_xml_start_tag(self->file, "c:barChart", NULL); + + /* Write the c:barDir element. */ + _chart_write_bar_dir(self, "col"); + + /* Write the c:grouping element. */ + _chart_write_grouping(self, self->grouping); + + STAILQ_FOREACH(series, self->series_list, list_pointers) { + /* Write the c:ser element. */ + _chart_write_ser(self, series); + } + + if (self->has_overlap) { + /* Write the c:overlap element. */ + _chart_write_overlap(self, self->series_overlap_1); + } + /* Write the c:axId elements. */ _chart_write_axis_ids(self); @@ -907,10 +1005,26 @@ _chart_write_bar_chart(lxw_chart *self) * Write the chart type element. */ STATIC void -_chart_write_chart_type(lxw_chart *self) +_chart_write_chart_type(lxw_chart *self, uint8_t type) { - /* Write the c:barChart element. */ - _chart_write_bar_chart(self); + switch (type) { + case LXW_CHART_BAR: + case LXW_CHART_BAR_STACKED: + case LXW_CHART_BAR_STACKED_PERCENT: + _chart_write_bar_chart(self, type); + break; + + case LXW_CHART_COLUMN: + case LXW_CHART_COLUMN_STACKED: + case LXW_CHART_COLUMN_STACKED_PERCENT: + _chart_write_column_chart(self, type); + break; + + default: + LXW_WARN_FORMAT("workbook_add_chart(): " + "unhandled chart type '%d'", type); + } + } /* @@ -925,7 +1039,7 @@ _chart_write_plot_area(lxw_chart *self) _chart_write_layout(self); /* Write the subclass chart type elements for primary and secondary axes. */ - _chart_write_chart_type(self); + _chart_write_chart_type(self, self->type); } @@ -944,7 +1058,7 @@ _chart_write_chart(lxw_chart *self) _chart_write_cat_axis(self); /* Write the c:valAx element. */ - _chart_write_val_ax(self); + _chart_write_val_axis(self); lxw_xml_end_tag(self->file, "c:plotArea"); diff --git a/test/functional/src/test_chart_bar09.c b/test/functional/src/test_chart_bar09.c new file mode 100644 index 00000000..be3b1f81 --- /dev/null +++ b/test/functional/src/test_chart_bar09.c @@ -0,0 +1,42 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_bar09.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR_STACKED); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 40274560; + chart->axis_id_2 = 40295040; + + 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); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + 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_bar10.c b/test/functional/src/test_chart_bar10.c new file mode 100644 index 00000000..d1753e70 --- /dev/null +++ b/test/functional/src/test_chart_bar10.c @@ -0,0 +1,42 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_bar10.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_BAR_STACKED_PERCENT); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 40274560; + chart->axis_id_2 = 40295040; + + 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); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + 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_column01.c b/test/functional/src/test_chart_column01.c new file mode 100644 index 00000000..849ceec2 --- /dev/null +++ b/test/functional/src/test_chart_column01.c @@ -0,0 +1,42 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_column01.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 = 43424000; + chart->axis_id_2 = 43434368; + + 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); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + 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_column02.c b/test/functional/src/test_chart_column02.c new file mode 100644 index 00000000..e1f12e64 --- /dev/null +++ b/test/functional/src/test_chart_column02.c @@ -0,0 +1,42 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_column02.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN_STACKED); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 49388544; + chart->axis_id_2 = 69387008; + + 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); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + 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_column03.c b/test/functional/src/test_chart_column03.c new file mode 100644 index 00000000..79678aeb --- /dev/null +++ b/test/functional/src/test_chart_column03.c @@ -0,0 +1,42 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2015, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = new_workbook("test_chart_column03.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_COLUMN_STACKED_PERCENT); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 49388544; + chart->axis_id_2 = 69387008; + + 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); + + chart_add_series(chart, NULL, "=Sheet1!$A$1:$A$5"); + 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_bar.py b/test/functional/test_chart_bar.py index 867bd17a..fb04a27e 100644 --- a/test/functional/test_chart_bar.py +++ b/test/functional/test_chart_bar.py @@ -28,6 +28,12 @@ class TestCompareXLSXFiles(base_test_class.XLSXBaseTest): def test_chart_bar05(self): self.run_exe_test('test_chart_bar05') + def test_chart_bar09(self): + self.run_exe_test('test_chart_bar09') + + def test_chart_bar10(self): + self.run_exe_test('test_chart_bar10') + def test_chart_bar51(self): self.run_exe_test('test_chart_bar51') diff --git a/test/functional/test_chart_column.py b/test/functional/test_chart_column.py new file mode 100644 index 00000000..8dbd96c8 --- /dev/null +++ b/test/functional/test_chart_column.py @@ -0,0 +1,23 @@ +############################################################################### +# +# Tests for libxlsxwriter. +# +# Copyright 2014-2016, 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_column01(self): + self.run_exe_test('test_chart_column01') + + def test_chart_column02(self): + self.run_exe_test('test_chart_column02') + + def test_chart_column03(self): + self.run_exe_test('test_chart_column03') diff --git a/test/functional/xlsx_files/chart_bar09.xlsx b/test/functional/xlsx_files/chart_bar09.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..a0ab89692825c1742377b11848b0fe4230849906 GIT binary patch literal 9281 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 dx)kYdxTAZYl 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_column03.xlsx b/test/functional/xlsx_files/chart_column03.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..c0381305776eeb9e434fc81b3e62b7fad07d5cf3 GIT binary patch literal 9290 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 CeHTFh literal 0 HcmV?d00001