From 0bae4be666deeb39c9935c846501a77274e5edee Mon Sep 17 00:00:00 2001 From: John McNamara Date: Fri, 28 Mar 2025 00:33:17 +0000 Subject: [PATCH] chart: add layout support Feature: #477 --- .indent.pro | 1 + docs/images/chart_layout.png | Bin 0 -> 45346 bytes docs/src/working_with_charts.dox | 60 ++++ include/xlsxwriter/chart.h | 129 +++++++ src/chart.c | 321 ++++++++++++++---- test/functional/src/test_chart_layout01.c | 51 +++ test/functional/src/test_chart_layout02.c | 51 +++ test/functional/src/test_chart_layout03.c | 52 +++ test/functional/src/test_chart_layout04.c | 52 +++ test/functional/src/test_chart_layout05.c | 68 ++++ test/functional/src/test_chart_layout06.c | 52 +++ test/functional/src/test_chart_layout07.c | 50 +++ test/functional/src/test_chart_layout08.c | 51 +++ test/functional/test_chart_layout.py | 40 +++ .../functional/xlsx_files/chart_layout01.xlsx | Bin 0 -> 7862 bytes .../functional/xlsx_files/chart_layout02.xlsx | Bin 0 -> 7867 bytes .../functional/xlsx_files/chart_layout03.xlsx | Bin 0 -> 7871 bytes .../functional/xlsx_files/chart_layout04.xlsx | Bin 0 -> 7905 bytes .../functional/xlsx_files/chart_layout05.xlsx | Bin 0 -> 7975 bytes .../functional/xlsx_files/chart_layout06.xlsx | Bin 0 -> 7913 bytes .../functional/xlsx_files/chart_layout07.xlsx | Bin 0 -> 9443 bytes .../functional/xlsx_files/chart_layout08.xlsx | Bin 0 -> 7933 bytes 22 files changed, 921 insertions(+), 57 deletions(-) create mode 100644 docs/images/chart_layout.png create mode 100644 test/functional/src/test_chart_layout01.c create mode 100644 test/functional/src/test_chart_layout02.c create mode 100644 test/functional/src/test_chart_layout03.c create mode 100644 test/functional/src/test_chart_layout04.c create mode 100644 test/functional/src/test_chart_layout05.c create mode 100644 test/functional/src/test_chart_layout06.c create mode 100644 test/functional/src/test_chart_layout07.c create mode 100644 test/functional/src/test_chart_layout08.c create mode 100644 test/functional/test_chart_layout.py create mode 100644 test/functional/xlsx_files/chart_layout01.xlsx create mode 100644 test/functional/xlsx_files/chart_layout02.xlsx create mode 100644 test/functional/xlsx_files/chart_layout03.xlsx create mode 100644 test/functional/xlsx_files/chart_layout04.xlsx create mode 100644 test/functional/xlsx_files/chart_layout05.xlsx create mode 100644 test/functional/xlsx_files/chart_layout06.xlsx create mode 100644 test/functional/xlsx_files/chart_layout07.xlsx create mode 100644 test/functional/xlsx_files/chart_layout08.xlsx diff --git a/.indent.pro b/.indent.pro index 06299a25..1b790cc6 100644 --- a/.indent.pro +++ b/.indent.pro @@ -70,6 +70,7 @@ -T lxw_chart_gridline -T lxw_chart_label_position -T lxw_chart_label_separator +-T lxw_chart_layout -T lxw_chart_legend -T lxw_chart_legend_position -T lxw_chart_line diff --git a/docs/images/chart_layout.png b/docs/images/chart_layout.png new file mode 100644 index 0000000000000000000000000000000000000000..8c3ca85ff47518bad3ab0d67afc68029b39926dd GIT binary patch literal 45346 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 } +STATIC void +_chart_free_axis(lxw_chart_axis *axis) +{ + if (!axis) + return; + + _chart_free_font(axis->num_font); + _chart_free_font(axis->title.font); + _chart_free_range(axis->title.range); + + free(axis->fill); + free(axis->line); + free(axis->pattern); + free(axis->title.name); + free(axis->title.layout); + free(axis->num_format); + free(axis->default_num_format); + free(axis->major_gridlines.line); + free(axis->minor_gridlines.line); + + free(axis); +} + /* * Free a series object. */ @@ -189,54 +212,30 @@ lxw_chart_free(lxw_chart *chart) free(chart->series_list); } - /* X Axis. */ - if (chart->x_axis) { - _chart_free_font(chart->x_axis->title.font); - _chart_free_font(chart->x_axis->num_font); - _chart_free_range(chart->x_axis->title.range); - free(chart->x_axis->title.name); - free(chart->x_axis->line); - free(chart->x_axis->fill); - free(chart->x_axis->pattern); - free(chart->x_axis->major_gridlines.line); - free(chart->x_axis->minor_gridlines.line); - free(chart->x_axis->num_format); - free(chart->x_axis->default_num_format); - free(chart->x_axis); - } - - /* Y Axis. */ - if (chart->y_axis) { - _chart_free_font(chart->y_axis->title.font); - _chart_free_font(chart->y_axis->num_font); - _chart_free_range(chart->y_axis->title.range); - free(chart->y_axis->title.name); - free(chart->y_axis->line); - free(chart->y_axis->fill); - free(chart->y_axis->pattern); - free(chart->y_axis->major_gridlines.line); - free(chart->y_axis->minor_gridlines.line); - free(chart->y_axis->num_format); - free(chart->y_axis->default_num_format); - free(chart->y_axis); - } + /* X and Y Axis. */ + _chart_free_axis(chart->x_axis); + _chart_free_axis(chart->y_axis); /* Chart title. */ _chart_free_font(chart->title.font); _chart_free_range(chart->title.range); free(chart->title.name); + free(chart->title.layout); /* Chart legend. */ _chart_free_font(chart->legend.font); - free(chart->delete_series); + free(chart->legend.layout); + free(chart->delete_series); free(chart->default_marker); free(chart->chartarea_line); free(chart->chartarea_fill); free(chart->chartarea_pattern); + free(chart->plotarea_line); free(chart->plotarea_fill); + free(chart->plotarea_layout); free(chart->plotarea_pattern); free(chart->drop_lines_line); @@ -449,6 +448,44 @@ _chart_convert_pattern_args(lxw_chart_pattern *user_pattern) return pattern; } +/* + * Create a copy of a user supplied layout. + */ +STATIC lxw_chart_layout * +_chart_convert_layout_args(lxw_chart_layout *user_layout, + enum lxw_chart_layout_type type) +{ + lxw_chart_layout *layout = calloc(1, sizeof(struct lxw_chart_layout)); + RETURN_ON_MEM_ERROR(layout, NULL); + + /* Copy the user supplied properties. */ + switch (type) { + case LXW_CHART_LAYOUT_LEGEND: + layout->x = user_layout->x; + layout->y = user_layout->y; + layout->width = user_layout->width; + layout->height = user_layout->height; + layout->has_inner = LXW_FALSE; + break; + case LXW_CHART_LAYOUT_PLOTAREA: + layout->x = user_layout->x; + layout->y = user_layout->y; + layout->width = user_layout->width; + layout->height = user_layout->height; + layout->has_inner = LXW_TRUE; + break; + default: + layout->x = user_layout->x; + layout->y = user_layout->y; + layout->width = 0.0; + layout->height = 0.0; + layout->has_inner = LXW_FALSE; + break; + } + + return layout; +} + /* * Set a marker type for a series. */ @@ -645,13 +682,101 @@ _chart_write_style(lxw_chart *self) LXW_FREE_ATTRIBUTES(); } +/* + * Write the element. + */ +STATIC void +_chart_write_layout_target(lxw_chart *self) +{ + struct xml_attribute_list attributes; + struct xml_attribute *attribute; + + LXW_INIT_ATTRIBUTES(); + LXW_PUSH_ATTRIBUTES_STR("val", "inner"); + + lxw_xml_empty_tag(self->file, "c:layoutTarget", &attributes); + + LXW_FREE_ATTRIBUTES(); +} + +/* + * Write the and element. + */ +STATIC void +_chart_write_layout_mode(lxw_chart *self, char *mode) +{ + struct xml_attribute_list attributes; + struct xml_attribute *attribute; + + LXW_INIT_ATTRIBUTES(); + LXW_PUSH_ATTRIBUTES_STR("val", "edge"); + + lxw_xml_empty_tag(self->file, mode, &attributes); + + LXW_FREE_ATTRIBUTES(); +} + +/* + * Write the layout dimension elements. + */ +STATIC void +_chart_write_layout_dimension(lxw_chart *self, char *dimension, double value) +{ + struct xml_attribute_list attributes; + struct xml_attribute *attribute; + + LXW_INIT_ATTRIBUTES(); + LXW_PUSH_ATTRIBUTES_DBL("val", value); + + lxw_xml_empty_tag(self->file, dimension, &attributes); + + LXW_FREE_ATTRIBUTES(); +} + +/* + * Write the element. + */ +STATIC void +_chart_write_manual_layout(lxw_chart *self, lxw_chart_layout *layout) +{ + lxw_xml_start_tag(self->file, "c:manualLayout", NULL); + + /* Write the c:layoutTarget element. */ + if (layout->has_inner) + _chart_write_layout_target(self); + + /* Write the c:xMode and c:yMode elements. */ + _chart_write_layout_mode(self, "c:xMode"); + _chart_write_layout_mode(self, "c:yMode"); + + /* Write the dimension elements. */ + _chart_write_layout_dimension(self, "c:x", layout->x); + _chart_write_layout_dimension(self, "c:y", layout->y); + if (layout->width > 0.0) + _chart_write_layout_dimension(self, "c:w", layout->width); + if (layout->height > 0.0) + _chart_write_layout_dimension(self, "c:h", layout->height); + + lxw_xml_end_tag(self->file, "c:manualLayout"); +} + /* * Write the element. */ STATIC void -_chart_write_layout(lxw_chart *self) +_chart_write_layout(lxw_chart *self, lxw_chart_layout *layout) { - lxw_xml_empty_tag(self->file, "c:layout", NULL); + if (layout == NULL) { + lxw_xml_empty_tag(self->file, "c:layout", NULL); + } + else { + lxw_xml_start_tag(self->file, "c:layout", NULL); + + /* Write the c:manualLayout element. */ + _chart_write_manual_layout(self, layout); + + lxw_xml_end_tag(self->file, "c:layout"); + } } /* @@ -1525,6 +1650,23 @@ _chart_write_tx_rich(lxw_chart *self, char *name, uint8_t is_horizontal, lxw_xml_end_tag(self->file, "c:tx"); } +/* + * Write the element. + */ +STATIC void +_chart_write_overlay(lxw_chart *self) +{ + struct xml_attribute_list attributes; + struct xml_attribute *attribute; + + LXW_INIT_ATTRIBUTES(); + LXW_PUSH_ATTRIBUTES_STR("val", "1"); + + lxw_xml_empty_tag(self->file, "c:overlay", &attributes); + + LXW_FREE_ATTRIBUTES(); +} + /* * Write the element for rich strings. */ @@ -1538,7 +1680,11 @@ _chart_write_title_rich(lxw_chart *self, lxw_chart_title *title) title->font); /* Write the c:layout element. */ - _chart_write_layout(self); + _chart_write_layout(self, title->layout); + + /* Write the c:overlay element. */ + if (title->has_overlay) + _chart_write_overlay(self); lxw_xml_end_tag(self->file, "c:title"); } @@ -1555,7 +1701,11 @@ _chart_write_title_formula(lxw_chart *self, lxw_chart_title *title) _chart_write_tx_formula(self, title); /* Write the c:layout element. */ - _chart_write_layout(self); + _chart_write_layout(self, title->layout); + + /* Write the c:overlay element. */ + if (title->has_overlay) + _chart_write_overlay(self); /* Write the c:txPr element. */ _chart_write_tx_pr(self, title->is_horizontal, title->font); @@ -3693,23 +3843,6 @@ _chart_write_cross_between(lxw_chart *self, uint8_t position) LXW_FREE_ATTRIBUTES(); } -/* - * Write the element. - */ -STATIC void -_chart_write_overlay(lxw_chart *self) -{ - struct xml_attribute_list attributes; - struct xml_attribute *attribute; - - LXW_INIT_ATTRIBUTES(); - LXW_PUSH_ATTRIBUTES_STR("val", "1"); - - lxw_xml_empty_tag(self->file, "c:overlay", &attributes); - - LXW_FREE_ATTRIBUTES(); -} - /* * Write the element. */ @@ -3796,7 +3929,7 @@ _chart_write_legend(lxw_chart *self) } /* Write the c:layout element. */ - _chart_write_layout(self); + _chart_write_layout(self, self->legend.layout); if (self->chart_group == LXW_CHART_PIE || self->chart_group == LXW_CHART_DOUGHNUT) { @@ -4737,7 +4870,7 @@ _chart_write_scatter_plot_area(lxw_chart *self) lxw_xml_start_tag(self->file, "c:plotArea", NULL); /* Write the c:layout element. */ - _chart_write_layout(self); + _chart_write_layout(self, self->plotarea_layout); /* Write subclass chart type elements for primary and secondary axes. */ self->write_chart_type(self); @@ -4769,7 +4902,7 @@ _chart_write_pie_plot_area(lxw_chart *self) lxw_xml_start_tag(self->file, "c:plotArea", NULL); /* Write the c:layout element. */ - _chart_write_layout(self); + _chart_write_layout(self, self->plotarea_layout); /* Write subclass chart type elements for primary and secondary axes. */ self->write_chart_type(self); @@ -4790,7 +4923,7 @@ _chart_write_plot_area(lxw_chart *self) lxw_xml_start_tag(self->file, "c:plotArea", NULL); /* Write the c:layout element. */ - _chart_write_layout(self); + _chart_write_layout(self, self->plotarea_layout); /* Write subclass chart type elements for primary and secondary axes. */ self->write_chart_type(self); @@ -6043,6 +6176,22 @@ chart_axis_set_name_range(lxw_chart_axis *axis, const char *sheetname, _chart_set_range(axis->title.range, sheetname, row, col, row, col); } +/* + * Set a layout for the chart axis name. + */ +void +chart_axis_set_name_layout(lxw_chart_axis *axis, lxw_chart_layout *layout) +{ + if (!layout) + return; + + /* Free any previously allocated resource. */ + free(axis->title.layout); + + axis->title.layout = + _chart_convert_layout_args(layout, LXW_CHART_LAYOUT_AXIS_NAME); +} + /* * Set an axis title/name font. */ @@ -6444,6 +6593,31 @@ chart_title_off(lxw_chart *self) self->title.off = LXW_TRUE; } +/* + * Set a layout for the chart title. + */ +void +chart_title_set_layout(lxw_chart *self, lxw_chart_layout *layout) +{ + if (!layout) + return; + + /* Free any previously allocated resource. */ + free(self->title.layout); + + self->title.layout = + _chart_convert_layout_args(layout, LXW_CHART_LAYOUT_TITLE); +} + +/* + * Overlay the chart title on the chart. + */ +void +chart_title_set_overlay(lxw_chart *self, uint8_t overlay) +{ + self->title.has_overlay = overlay; +} + /* * Set the chart legend position. */ @@ -6453,6 +6627,22 @@ chart_legend_set_position(lxw_chart *self, uint8_t position) self->legend.position = position; } +/* + * Set a layout for the chart legend. + */ +void +chart_legend_set_layout(lxw_chart *self, lxw_chart_layout *layout) +{ + if (!layout) + return; + + /* Free any previously allocated resource. */ + free(self->legend.layout); + + self->legend.layout = + _chart_convert_layout_args(layout, LXW_CHART_LAYOUT_LEGEND); +} + /* * Set the legend font. */ @@ -6584,6 +6774,23 @@ chart_plotarea_set_pattern(lxw_chart *self, lxw_chart_pattern *pattern) self->plotarea_pattern = _chart_convert_pattern_args(pattern); } +/* + * Set a layout for the plotarea. + */ +void +chart_plotarea_set_layout(lxw_chart *self, lxw_chart_layout *layout) +{ + if (!layout) + return; + + /* Free any previously allocated resource. */ + free(self->plotarea_layout); + + self->plotarea_layout = + _chart_convert_layout_args(layout, LXW_CHART_LAYOUT_PLOTAREA); + +} + /* * Turn on the chart data table. */ diff --git a/test/functional/src/test_chart_layout01.c b/test/functional/src/test_chart_layout01.c new file mode 100644 index 00000000..2d65c7ac --- /dev/null +++ b/test/functional/src/test_chart_layout01.c @@ -0,0 +1,51 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout01.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 = 69198592; + chart->axis_id_2 = 69200128; + + 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"); + + lxw_chart_layout layout = { + .x = 0.13171062992125, + .y = 0.26436351706036, + .width = 0.73970734908136, + .height = 0.5713732137649, + }; + + chart_plotarea_set_layout(chart, &layout); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout02.c b/test/functional/src/test_chart_layout02.c new file mode 100644 index 00000000..d245bd41 --- /dev/null +++ b/test/functional/src/test_chart_layout02.c @@ -0,0 +1,51 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout02.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 = 68311296; + chart->axis_id_2 = 69198208; + + 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"); + + lxw_chart_layout layout = { + .x = 0.80197353455818, + .y = 0.37442403032954, + .width = 0.12858202099737, + .height = 0.25115157480314, + }; + + chart_legend_set_layout(chart, &layout); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout03.c b/test/functional/src/test_chart_layout03.c new file mode 100644 index 00000000..3d2e3b96 --- /dev/null +++ b/test/functional/src/test_chart_layout03.c @@ -0,0 +1,52 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout03.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 = 68312064; + chart->axis_id_2 = 69198592; + + 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"); + + lxw_chart_layout layout = { + .x = 0.80197353455818, + .y = 0.37442403032954, + .width = 0.12858202099737, + .height = 0.25115157480314, + }; + + chart_legend_set_layout(chart, &layout); + chart_legend_set_position(chart, LXW_CHART_LEGEND_OVERLAY_RIGHT); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout04.c b/test/functional/src/test_chart_layout04.c new file mode 100644 index 00000000..02ae3988 --- /dev/null +++ b/test/functional/src/test_chart_layout04.c @@ -0,0 +1,52 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout04.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 = 68311296; + chart->axis_id_2 = 69198208; + + 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"); + + + lxw_chart_layout layout = { + .x = 0.426319335083114, + .y = 0.143518518518518, + }; + + chart_title_set_layout(chart, &layout); + chart_title_set_name(chart, "Title"); + + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout05.c b/test/functional/src/test_chart_layout05.c new file mode 100644 index 00000000..5e4ea98d --- /dev/null +++ b/test/functional/src/test_chart_layout05.c @@ -0,0 +1,68 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout05.xlsx"); + lxw_worksheet *worksheet = workbook_add_worksheet(workbook, NULL); + lxw_chart *chart = workbook_add_chart(workbook, LXW_CHART_AREA); + + /* For testing, copy the randomly generated axis ids in the target file. */ + chart->axis_id_1 = 43495808; + chart->axis_id_2 = 43497728; + + uint8_t data[5][3] = { + {1, 8, 3}, + {2, 7, 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, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$B$1:$B$5" + ); + + chart_add_series(chart, + "=Sheet1!$A$1:$A$5", + "=Sheet1!$C$1:$C$5" + ); + + + + lxw_chart_layout layout_x = { + .x = 0.346203193350831, + .y = 0.850902595508894, + }; + + chart_axis_set_name(chart->x_axis, "XXX"); + chart_axis_set_name_layout(chart->x_axis, &layout_x); + + + + lxw_chart_layout layout_y = { + .x = 0.213888888888888, + .y = 0.263499198016914, + }; + + chart_axis_set_name(chart->y_axis, "YYY"); + chart_axis_set_name_layout(chart->y_axis, &layout_y); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout06.c b/test/functional/src/test_chart_layout06.c new file mode 100644 index 00000000..a838e091 --- /dev/null +++ b/test/functional/src/test_chart_layout06.c @@ -0,0 +1,52 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout06.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 = 43496576; + chart->axis_id_2 = 45486080; + + 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"); + + + lxw_chart_layout layout = { + .x = 0.42354155730533, + .y = 0.16203703703703, + }; + + chart_title_set_name(chart, "Title"); + chart_title_set_layout(chart, &layout); + chart_title_set_overlay(chart, LXW_TRUE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout07.c b/test/functional/src/test_chart_layout07.c new file mode 100644 index 00000000..21673c4e --- /dev/null +++ b/test/functional/src/test_chart_layout07.c @@ -0,0 +1,50 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout07.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 = 45861120; + chart->axis_id_2 = 45867008; + + 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"); + + lxw_chart_layout layout = { + .x = 0.359652668416448, + .y = 0.1388888888888889, + }; + + chart_title_set_name_range(chart, "Sheet1", 0, 0); + chart_title_set_layout(chart, &layout); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/src/test_chart_layout08.c b/test/functional/src/test_chart_layout08.c new file mode 100644 index 00000000..2f73b41e --- /dev/null +++ b/test/functional/src/test_chart_layout08.c @@ -0,0 +1,51 @@ +/***************************************************************************** + * Test cases for libxlsxwriter. + * + * Test to compare output against Excel files. + * + * Copyright 2014-2025, John McNamara, jmcnamara@cpan.org + * + */ + +#include "xlsxwriter.h" + +int main() { + + lxw_workbook *workbook = workbook_new("test_chart_layout08.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 = 46317568; + chart->axis_id_2 = 46319488; + + 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"); + + lxw_chart_layout layout = { + .x = 0.359652668416448, + .y = 0.162037037037037, + }; + + chart_title_set_name_range(chart, "Sheet1", 0, 0); + chart_title_set_layout(chart, &layout); + chart_title_set_overlay(chart, LXW_TRUE); + + worksheet_insert_chart(worksheet, CELL("E9"), chart); + + return workbook_close(workbook); +} diff --git a/test/functional/test_chart_layout.py b/test/functional/test_chart_layout.py new file mode 100644 index 00000000..bfbefaed --- /dev/null +++ b/test/functional/test_chart_layout.py @@ -0,0 +1,40 @@ +############################################################################### +# +# Tests for libxlsxwriter. +# +# SPDX-License-Identifier: BSD-2-Clause +# Copyright 2014-2025, 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_layout01(self): + self.run_exe_test('test_chart_layout01') + + def test_chart_layout02(self): + self.run_exe_test('test_chart_layout02') + + def test_chart_layout03(self): + self.run_exe_test('test_chart_layout03') + + def test_chart_layout04(self): + self.run_exe_test('test_chart_layout04') + + def test_chart_layout05(self): + self.run_exe_test('test_chart_layout05') + + def test_chart_layout06(self): + self.run_exe_test('test_chart_layout06') + + + def test_chart_layout07(self): + self.run_exe_test('test_chart_layout07') + + def test_chart_layout08(self): + self.run_exe_test('test_chart_layout08') \ No newline at end of file diff --git a/test/functional/xlsx_files/chart_layout01.xlsx b/test/functional/xlsx_files/chart_layout01.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..53296f65cb9749239372c85ab0360f5430b359ae GIT binary patch literal 7862 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_layout02.xlsx b/test/functional/xlsx_files/chart_layout02.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..09e7e2284b2ccecc7192b87723d0d00b8c43407d GIT binary patch literal 7867 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%0De&uII7d6#V#ty0s4< z58B2}jH_Ek5G00oa{EMnsAA@!sz^7eK_i;h%+EozNL&h%Tv*R%yKK2j$eQkaqC$R> zE}KaMjb%_fqqVIWyd~UI<`k5HD?t{2J|K;uj4Uv(%YLqZG;QrC)uWAEEF8f^QtjT>wy)_^bPW-n`lz0TQ-c{g4L?GNfKFFn`u z81#(^ute?{-}G#a!E3MXdChvFTfXT$qwMPwajbg?bM$#VjJIsG`hxZ3sxYR==&fx| z{J3vTu-aO4_z)t`r!UWOml1s(vH;4-<<@#?l&?ySqjtqO&H#PEQG_uG&*`nA!JS@i zAOeD7#9fB2`OGJSX{<&s+33Jh_)`tyYFyeqc>DWvah%y=Qt*$s|L(y_7iTXvC56Pv zoTM*iZ;;x_>N)4t)zSTfnIzZ)(X)Z*G~uh`Z1MA*8O~wJLZs|~%agd`xa@#$r`Zys zJe`fm6kEFpG2yZT{kZcRxU)7ml3}Zk1Q47FJY*~cd%%&lKH_qQxlOm1!rUXDTOa`b z?$*Hr#Tkf(3Lzh$@~I}UX;5g})f}|(m_=E@mJHSAgGK4u5w|#~|7+H5Czt1v4EON| zofVWGe&r75$5K!sP=f6NsZnZPC#PPtD1*D`DOo+!^012J(=a}3q(@YY-(Kb6Wxk!u zacXmnwdHDK(IJC1sK9i4NQDi^+Pue-#X?TX_ZD{|L7)mvRf%FK#MHe>8)q|+EA}xh zO<}~R)MqJ^ZLzudq|o+38%}0$dxy?oZWQsAKW+M?hF!U+%dhGDnV6=*iRj zHcP+b>p|#E`Oq#CA#7x@QY2-k7Jo3JOM~_-h zNpZ&XclI^gm&QiJ(D~&W0YMOhWdjXlsrUhK`?FmhEJ*`C?OL`9TR06 zdDNC%wE2@TA;=^B5iwbw9$KxQK5nvA(6pz~_SA!k0w>V2%Dk}DyEn~*tF0d4T2Ayz zM-PQ+np&mr<)r8xv#qZcIK`MJ1`jeJ`13ePK0|g}*w-;1V2wI0==xOW`7i|~O_ol& z^e!7TgXJ|}fEOO;VWpq**3)m?ontZ66M5tAS2FBhl5*+Sxc7A4jJO*tuHBdGkrEV^ zmfLe685LmXVApd-x& z{*bYygp~$n-AE87lU?Z{FPCjl!kTp9qksjxQ!url zveT#`2xADP}eVa7#SZ= z`%f~so=9#IgPd8OG-SA-KB3HuBf_T-mTetl8E~lQBFfKRkxSdI=Z>>If_ zpRE8(2DqhZ#;3t{x8A4a)y@=NeLX~_!SHk~0vi_e<*p!;YI@@7LczJ~1}JOJ^d zM9=LT9@+I2GbUlRGz*_%*x?=-*^k%ykKyH}Q})NZ~KT!0vX(LquZ?Y#$7TWg4 zmt8KkByiN)rZPF9PFaFx#@FF$lPjPQX>hhUZkgWs^juV2w7C`Tfg>PNApO_Mi3A=u z007<-0Sbbyul{ubh5Tay^$%0yCh&E4_3Mu0CUD7h&-L5J1djSI+me5x{%YFaM0J99 zaet%!wDA87`@0Q&6LufIiu=Ws{@ffOMVnY5I z{dbe=Ci*krKhgig^7`Lm^Q(7s^G2m;f8FSB)8VGwprif2J;tvl#!d79j9=0J)6)3! zWBl$8+`Lg7+%JGPo&Vw$z>%-LfipUh--MLM{|oZ> n4*Ac(zpL#{U^&vifd5l_|0~MK@B+CW$S?sp@Y-`DyZ-inFoGzm literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_layout06.xlsx b/test/functional/xlsx_files/chart_layout06.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..fe334a6c5e1eb5fe390ca521582c1820562c9031 GIT binary patch literal 7913 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 literal 0 HcmV?d00001 diff --git a/test/functional/xlsx_files/chart_layout08.xlsx b/test/functional/xlsx_files/chart_layout08.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2dd2ab842e49b080ecbfa18bf886be748fa961c3 GIT binary patch literal 7933 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 wz6yDR4*+2htN;K2 literal 0 HcmV?d00001